-
KNN 실습 - 붓꽃(iris) 품종 구분하기ML&DL&AI/ML 2023. 8. 9. 13:56728x90
1. 문제 정의
- 붓꽃 3가지 품종을 구분하는 모델 만들기
2. 데이터 수집
- sklearn에서 제공하는 데이터 셋 이용
from sklearn.datasets import load_iris iris_data = load_iris()
- 데이터 확인하기
iris_data.keys()
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])
- data : 특성 데이터 (입력 데이터) 문제 데이터
- target : 타깃 데이터(출력 데이터) 답지 데이터
- DESCR : 데이터셋에 대한 설명
- feature_names : 특성의 이름
- target_names : 타깃 클래스의 이름
- 데이터 분류 및 설명
- 문제 데이터(X 데이터)
iris_data['data'] # iris_data.data 방식도 가능하다.
- sepal 꽃받침
- petal 꽃잎
iris_data['feature_names']
- 정답 데이터(Y 데이터)
iris_data['target']
- feature_names : 특성의 이름
iris_data['target_names']
- DESCR : 데이터셋에 대한 설명
print(iris_data['DESCR'])
- file name
iris_data['filename']
3. 데이터 전처리
iris_data['data'].shape
- 데이터 dataframe으로 변경
import pandas as pd X = pd.DataFrame(iris_data['data'], columns = iris_data['feature_names'])
X.info()
- 데이터 요약
X.describe()
4. EDA 탐색적 데이터 분석
- 산점도 그리기
- c - target(0,1,2) 색상을 부여
- marker - 점의 모양
- alpha - 투명도
import matplotlib.pyplot as plt pd.plotting.scatter_matrix(X, figsize = (15,15), c = iris_data['target'], # c = iris_data.target, marker = 'o', alpha = 0.7 ) plt.show()
5. 모델 선택 및 하이퍼 파라미터 튜닝
- 문제 데이터
# X = pd.DataFrame(iris_data['data'], columns = iris_data['feature_names']) X
- 정답 데이터(Label)
# iris_data['target'] y = iris_data.target y
- train / test 나누기
- 총 150ea
- 7:3 비율로 나누기
X_train = X.iloc[0:105] X_test = X.iloc[105:] y_train = y[0:105] y_test = y[105:]
- 데이터 크기 확인
X_train.shape, X_test.shape # ((105, 4), (45, 4)) y_train.shape, y_test.shape # ((105,), (45,))
- 이러면 문제가 발생한다.
- 데이터가 한쪽으로 편중되는 현상이 발생
- 사이킷런에서 제공하는 함수 train_test_split를 이용
from sklearn.utils.fixes import sklearn # 데이터를 랜덤하게 섞어서(train)과 평가(test)로 분리해주는 함수 # X_train, y_train, X_test, y_test # X_train, X_test, y_train, y_test # X_train, X_val, y_train, y_val, X_test from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=6)
6. 학습
- 모델 선택
from sklearn.neighbors import KNeighborsClassifier knn_model = KNeighborsClassifier(n_neighbors=5) knn_model.fit (X_train, y_train)
7. 예측 및 평가
- 입력 데이터에 대한 예측값을 반환
pre = knn_model.predict(X_test) pre # X_test에 대한 예측 값
y_test # 실제값
- score 확인하기 방법 1
- knn_model.score(input_data, true_data)
knn_model.score(X_test,y_test) # 검증(evaluate)
0.9777777777777777
- score 확인하기 방법 2
- accuracy_score(실제값, 예측값)
from sklearn.metrics import accuracy_score accuracy_score(y_test,pre)
0.9777777777777777
8. 하이퍼 파라미터 튜닝
- K값 범위 지정
- train, test 정확도 비교
- 반복문을 사용해서 튜닝 후 결과를 한번에 확인하기
# 결과를 지정할 변수 지정 train_acc = [] test_acc = [] # 이웃의 수만 조절 1~71 까지 바꾸기 n_setting = range(1,71) # for i in ragne(): for n in n_setting: # 모델 생성 knn_model = KNeighborsClassifier(n_neighbors=n) # 1~70까지 # 모델 학습 knn_model.fit(X_train,y_train) # train 데이터 score 확인 train_score = knn_model.score(X_train, y_train) # test 데이터 score 확인 test_score = knn_model.score(X_test, y_test) # train, test score 저장 append() train_acc.append(train_score) test_acc.append(test_score)
- 정확도 검사 결과 확인하기
train_acc test_acc
- 하이퍼 파라미터의 결과를 그래프로 확인하기
import matplotlib.pyplot as plt plt.figure(figsize=(10,4)) plt.plot(n_setting, train_acc, label='Train_Acc', marker='o') plt.plot(n_setting, test_acc, label='Train_Acc', marker='o') plt.grid() # 격자 형태로 그래프 그리기 plt.xticks(range(1,71,2)) # X축 그래프에 표현되는 범위 plt.xlabel('n_neighbors') # X축 이름 plt.ylabel('Accuracy') # Y축 이름 plt.legend() # label 표시하기 plt.show()
728x90'ML&DL&AI > ML' 카테고리의 다른 글
앙상블(Ensemble) 모델 (0) 2023.08.16 ML Decision Tree (0) 2023.08.14 ML KNN(최근접 이웃 알고리즘)란 (0) 2023.08.08 머신러닝 7과정 실습 (0) 2023.08.04 머신러닝의 과정 (0) 2023.08.04