머신러닝

[ML]5. KNN 모델(Iris 데이터)

CodeJaram 2023. 8. 16. 08:57

머신러닝_05_KNN 모델(Iris 데이터)

 

  1. 머신러닝 모델 개략도

 

2. 일반화, 과대적합, 과소적합: 모델의 신뢰도를 측정하고 성능을 확인하기 위한 개념

  • 과대적합(Overfitting): 지나치게 상세하고 복잡한 모델링을 하여 훈련세트에만 과도하게 동작하는 모델, 테스트 세트의 성능 저하

-조건이 너무 까다로워 조건에 적합한 데이터가 너무 적음

  • 과소적합: 모델링을 너무 간단하게 하여 훈련세트를 충분히 반영하지 못해 훈련세트, 테스트 세트에서 성능 저하

-조건이 단순하여 조건에 적합한 데이터가 너무 많음

  • 일반화: 훈련세트로 학습한 모델이 테스트 데이터가 주어져도 정확히 예측할 거라 기대하는 것. 훈련세트에서 테스트 세트로 일반화가 되었다고 표현

3. 모델 복잡도 곡선

 

4. 모델의 복잡도 해결

  • 일반적으로 데이터 양이 많으면 일반화에 도움이 됨
  • 주어진 훈련데이터의 다양성이 보장되어야 함
  • 다양한 데이터포인트를 골고루 나타내기
  • 편중된 데이터를 많이 모으는 것은 바람직하지 않음
  • 규제(Regularization)을 통해 모델의 복잡도를 적정선으로 설정



5. K-Nearest Neighbors(KNN): K-최근접 이웃 알고리즘

  • 새로운 데이터 포인트와 가장 가까운 훈련 데이터셋의 데이터 포인트를 찾아 예측
  • K값에 따라 가까운 이웃의 수가 결정 예)K=5→주변에 있는 5개의 데이터
  • 분류와 회귀에 모두 사용 가능
  • K값이 작을수록 과대적합 발생(모델의 복잡도 증가→noise 값에 민감)
  • K값이 커질수록 과소적합 발생(모델의 복잡도 감소)

예)100개 데이터 학습 후 k=100으로 설정하면 과소적합



[붓꽃 데이터 실습]

 

  1. 문제 정의: iris(붓꽃) 3가지 품종을 구분하는 모델 만들기
  2. 데이터 수집: sklearn에서 제공하는 데이터셋 이용
  • iris 데이터 불러오기

#iris(붓꽃) 데이터 불러오기

from sklearn.datasets import load_iris

 

#iris(붓꽃) 데이터 변수에 저장

iris_data=load_iris()

 

  • 데이터 확인

#데이터 확인

iris_data.keys()

 

# data: 특성 데이터(입력 데이터)->문제데이터

iris_data['data']

 

# target: 타겟 데이터(출력 데이터)->정답 데이터

iris_data['target']

 

# feature_names: 특성 이름

iris_data['feature_names']

# DESCR: 데이터셋에 대한 설명

iris_data['DESCR']

 

# target_names: 타겟 클래스의 이름

#filename: 파일이름

iris_data['filename']

 

3. 데이터 전처리

  • 데이터 크기 확인: .shape(150행, 4열)

# 데이터 크기 확인

iris_data['data'].shape

  • 문제 데이터 DataFrame으로 변환하기

-pandas 라이브러리 불러오기

-행=문제데이터(‘data’), 열=‘특성이름’ 지정하기

# 데이터 DataFrame으로 변경(numpy->pandas)

import pandas as pd

 

# 컬럼이름=특성이름으로 지정

X=pd.DataFrame(iris_data['data'], columns=iris_data['feature_names'])

 

  • 문제데이터 정보 확인

#문제 데이터(X) 정보 확인

X.info()

 

  • 문제데이터 기술통계량  확인

# 문제데이터 기술통계량 확인

X.describe()

 

  • 정답데이터

#정답 데이터(Series 형태)

y=iris_data.target



4. EDA(탐색적 데이터 분석)

  • 산점도 그리기

# 데이터 시각화 라이브러리

import matplotlib.pyplot as plt

 

#산점도 그리기

pd.plotting.scatter_matrix(X,

         figsize=(15, 15), # 그래프 크기(inch 기준)

          c=iris_data['target'],

          marker='o',

          alpha=0.7)

 

plt.show()

 

#데이터 분포도를 확인하여 모델 선택



 

5. 모델 선택 및 하이퍼 파라미터 튜닝

  • 모델링: 훈련용/평가용 데이터 분할,  문제/정답 데이터 분할

#모델링(문제/정답 분리)

#훈련용 데이터(DataFrame->iloc 사용)

X_train=X.iloc[0:105]

y_train=y[0:105]

#평가용 데이터(Series->slicing 사용)

X_test=X.iloc[105:]

y_test=y[105: ]

 

  • 편중된 데이터 섞기: train_test_split

# train_test_split->데이터를 랜덤으로 섞어서 학습/평가 데이터로 분리해주는 함수

#순서: X_train, X_test, y_train, y_test

 

from sklearn.model_selection import train_test_split

 

#test_size: 분할 비율, 평가용 테스트의 비율만 작성하면 학습/평가용 데이터의 비율에 맞춰서 분리됨

#random_state: 랜덤으로 섞는 비율을 고정하여 데이터의 수준과 상관없이 모델의 성능을 평가

 

X_train, X_test, y_train, y_test=train_test_split(X, y, test_size=0.3, random_state=6)

 

# 답지가 잘 섞였는지 확인

#학습용 정답 데이터

y_train

#평가용 정답 데이터

y_train

 

  • 모델 선택(KNN)

# 모델 선택(knn)

 

from sklearn.neighbors import KNeighborsClassifier

 

#n_neighbors

knn_model= KNeighborsClassifier(n_neighbors=5)

 

6. 모델 학습 및 예측

#모델 학습

knn_model.fit(X_train, y_train)

 

#모델 예측

pre=knn_model.predict(X_test)

pre

 

7. 모델 평가

  • 데이터 검증: knn_model.score

#a. knn_model.score(input_data, true_data)

#데이터 검증(evaluate)

 

knn_model.score(X_test, y_test)

 

  • 데이터 평가: accuracy_score

#b. accuracy_score(실제값, 예측값)

from sklearn.metrics import accuracy_score

 

accuracy_score(y_test,pre)



8. 하이퍼 파라미터 튜닝

  • 이웃의 개수를 조절하여 튜닝하기: n_neighbors=n

#반복문을 사용해서 튜닝 후 결과를 한번에 확인하기

 

# 결과를 저장할 변수 지정

train_acc=[]

test_acc=[]

 

#k값 범위 조절(1~71)

n_setting=range(1, 71)

 

#반복문

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)

 

  #결과(score) 저장

  train_acc.append(train_score)

  test_acc.append(test_score)

 

  #k의 값이 증가할 수록 정확도 떨어짐

 

  • 하이퍼 파라미터 튜닝 결과 그래프로 확인하기

#시각화 라이브러리

import matplotlib.pyplot as plt

#그래프 사이즈 지정

plt.figure(figsize=(10,4))

 

#k의 개수에 따라 정확도 출력

plt.plot(n_setting, train_acc, label='Train_Acc', marker='o')

plt.plot(n_setting, test_acc, label='Test_Acc', marker='o')

 

plt.grid() #격자무늬

 

plt.xticks(range(1,71, 2)) #x축의 범위(1부터 71까지 2칸 단위로)

plt.xlabel('n_neighbors') #x축 이름(k값의 범위)

plt.ylabel('Accuracy') #y축의 이름(정확도)

 

plt.legend() #label 표시

plt.show() #그래프 출력

 

#test데이터의 정확도가 train데이터의 정확도보다 높거나 같아야 과대적합이 발생하지 않음

#9개, 13개, 14개, 15개일 때가 성능 좋음=>최종 모델에서 k 개수 지정

#15개 이상일 때부터 성능 저하

 

'머신러닝' 카테고리의 다른 글

[ML]7. 앙상블 모델  (0) 2023.08.18
[ML]6. Decision Tree 모델  (0) 2023.08.17
[ML]4. 데이터 핸들링(Titanic 실습)  (0) 2023.08.14
[ML]3. 머신러닝 과정 실습  (0) 2023.08.10
[ML]2. 머신러닝 개요  (0) 2023.08.07