머신러닝_05_KNN 모델(Iris 데이터)
- 머신러닝 모델 개략도
2. 일반화, 과대적합, 과소적합: 모델의 신뢰도를 측정하고 성능을 확인하기 위한 개념
- 과대적합(Overfitting): 지나치게 상세하고 복잡한 모델링을 하여 훈련세트에만 과도하게 동작하는 모델, 테스트 세트의 성능 저하
-조건이 너무 까다로워 조건에 적합한 데이터가 너무 적음
- 과소적합: 모델링을 너무 간단하게 하여 훈련세트를 충분히 반영하지 못해 훈련세트, 테스트 세트에서 성능 저하
-조건이 단순하여 조건에 적합한 데이터가 너무 많음
- 일반화: 훈련세트로 학습한 모델이 테스트 데이터가 주어져도 정확히 예측할 거라 기대하는 것. 훈련세트에서 테스트 세트로 일반화가 되었다고 표현
3. 모델 복잡도 곡선
4. 모델의 복잡도 해결
- 일반적으로 데이터 양이 많으면 일반화에 도움이 됨
- 주어진 훈련데이터의 다양성이 보장되어야 함
- 다양한 데이터포인트를 골고루 나타내기
- 편중된 데이터를 많이 모으는 것은 바람직하지 않음
- 규제(Regularization)을 통해 모델의 복잡도를 적정선으로 설정
5. K-Nearest Neighbors(KNN): K-최근접 이웃 알고리즘
- 새로운 데이터 포인트와 가장 가까운 훈련 데이터셋의 데이터 포인트를 찾아 예측
- K값에 따라 가까운 이웃의 수가 결정 예)K=5→주변에 있는 5개의 데이터
- 분류와 회귀에 모두 사용 가능
- K값이 작을수록 과대적합 발생(모델의 복잡도 증가→noise 값에 민감)
- K값이 커질수록 과소적합 발생(모델의 복잡도 감소)
예)100개 데이터 학습 후 k=100으로 설정하면 과소적합
[붓꽃 데이터 실습]
- 문제 정의: iris(붓꽃) 3가지 품종을 구분하는 모델 만들기
- 데이터 수집: 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 |