머신러닝
머신러닝 - ex03_iris데이터활용_KNN
인생진리
2023. 2. 14. 16:57
### 문제정의
- 붓꽃 꽃잎의 길이, 너비, 꽃받침의 길이, 너비 특징을 활용하여 품종 3가지 분류
- KNN모델의 이웃 숫자 조절(하이퍼 파라미터 튜닝, K 조절)

import pandas as pd
import matplotlib.pyplot as plt
# KNN 모델
from sklearn.neighbors import KNeighborsClassifier #분류 모델
# 정확도 측정 도구
from sklearn.metrics import accuracy_score
### 데이터 수집
from sklearn.datasets import load_iris #iris 데이터 가져오기
iris_data = load_iris()
iris_data
# keys() : 키값 확인하기
iris_data.keys()
iris_data.data.shape
# 특성 이름, 순서도 확인 가능
# 방법1
iris_data.target.shape
# 방법2
iris_data['feature_names']
# sepal length (cm) : 꽃받침의 길이
# sepal width (cm) : 꽃받침의 너비
# 'petal length (cm)' :꽃잎의 길이
# 'petal width (cm)' : 꽃잎의 너비
# 정답 데이터 살펴보기
iris_data.target
# 정답 데이터 이름 살펴보기
iris_data.target_names
# 'setosa' - 0
# 'versicolor' - 1
# 'virginica' - 2
### 데이터 전처리
iris_data.data
iris_df = pd.DataFrame(iris_data.data, columns = iris_data.feature_names)
iris_df.head(10)
iris_df.head?
# 문제와 답으로 분리
X = iris_df
y = iris_data.target
# 훈련데이터셋과 평가 데이터셋 분리
# train_test_split
from sklearn.model_selection import train_test_split
# 문제, 답, 비율, 랜덤고정키값
# test_size = 0.25 => 25%만큼 평가 데이터로 분리
# random_state => 랜덤하게 섞이는 규칙을 고정
X_train, X_test, y_train,y_test = train_test_split(X,y,
test_size =0.25,
random_state =65)
X_train
# 분리된 데이터 클래스(정답)별
# 7.5 : 2.5
import numpy as np
np.bincount(y_train)
# 데이터가 다양성과 형평성을 유지해야함 -> 학습에 도움됨
### 탐색적 데이터 분석(EDA)
# 품종을 잘 분류해주는 기준은 어떤 컬럼인지
# 산점도 행렬 그래프
pd.plotting.scatter_matrix(X_train,
figsize=(10,10),
c = y_train, # color
alpha = 0.9)
plt.show()
### 모델 선택 및 학습
# 객체 생성
iris_knn_model = KNeighborsClassifier(n_neighbors = 5)
# fit(훈련문제, 훈련정답)
iris_knn_model.fit(X_train,y_train)
### 모델 평가
# predict(테스트 문제)
pre = iris_knn_model.predict(X_test)
pre
# 정학도 계산 - accuracy_score
accuracy_score(pre,y_test)
### 하이퍼 파라미터 튜닝
- k값 범위 : 1~70
- train,test 정확도값
import warnings
warnings.filterwarnings(action='ignore')

# train_acc_lst = []
# test_acc_lst =[]
# for i in range(1,71):
# # 모델 생성 + 하이퍼 파라미터 지정
# knn_clf = KNeighborsClassifier(n_neighbors = k )
# knn_clf.fit(X_train, y_train)
# # train 정확도 저장
# train_pre = knn_clf.predict(X_train)
# train_score = accuracy_score(train_pre,y_train)
# train_lst.append(knn.score(train_score)
# # test 정확도 저장
# test_pre = knn_clf.predict(X_test)
# test_score = accuracy_score(test_pre,y_train)
# test_lst.append(knn.score(test_score)
train_acc = []
test_acc =[]
for i in range(1,71):
# 모델 생성 + 하이리퍼 파라미터 지정
knn = KNeighborsClassifier(n_neighbors = i )
knn.fit(X_train, y_train)
train_acc.append(knn.score(X_train,y_train))
test_acc.append(knn.score(X_test,y_test))
print(f"{i}번째 score : {knn.score(X_train,y_train)}")
plt.figure(figsize=(10,4))
plt.plot(range(1,71),train_acc, label='Train') # 트래인 정확도
plt.plot(range(1,71),test_acc, label='Test') # 테스트 정확도
plt.grid() #격자 표시
plt.xticks(range(1,71,2))#x축 간격 조절
plt.legend()
plt.show()
2. 머신러닝 수업 자료(과대적합, KNN, Decision Tree) (1).pdf
2.60MB
주요 구현 사항
- iris dataset 불러오기
- 데이터 전처리
- 산점도 행렬 그래프를 통한 EDA(Exploratory Data Analysis)
- KNN(K-Nearest Neighbors) 모델을 통한 학습 및 성능 평가
- 하이퍼파라미터 튜닝
하이퍼 파라미터 튜닝
- k값 범위 : 1~70
- train,test 정확도값
import warnings
warnings.filterwarnings(action='ignore')
train_acc = []
test_acc =[]
for i in range(1,71):
# 모델 생성 + 하이리퍼 파라미터 지정
knn = KNeighborsClassifier(n_neighbors = i )
knn.fit(X_train, y_train)
train_acc.append(knn.score(X_train,y_train))
test_acc.append(knn.score(X_test,y_test))
pythonCopy code
print(f"{i}번째 score : {knn.score(X_test,y_test)}")
위 코드에서는, k값을 1~70까지 변경하면서 train/test 데이터에 대한 정확도 값을 계산하였습니다.
이는 다양한 k값을 시도해보며 모델의 성능을 평가하는 하이퍼파라미터 튜닝 과정입니다.
그리고 해당 코드를 실행하면 k값이 바뀔 때마다 test set에 대한 정확도를 출력하게 됩니다.
단, 코드에 오류가 있어서 직접 실행 시키면 실행이 되지 않는 점 참고 바랍니다.