DeseoDeSeo
[Machine Learning] iris_knn 분류실습 part.2 본문
크기확인
print('훈련용 셋: ', x_train.shape, y_train.shape)
print('테스트용 셋: ', x_test.shape, y_test.shape)
- 문제 개수 만큼 답 개수가 셋팅 되었는가 확인해야함
- 훈련용 특성의 개수 만큼 테스트용 특성 개수가 셋팅 되었는지 확인해야함.
분리된 데이터 클래스별 개수 확인하기
: 7:3 비율로 데이터 분리, 모델 입장에서 학습을 잘 하려면 다양한 데이터가 필요함.
pd.Series(y_train).value_counts()
np.unique(y_train, return_counts=True)[1]/112
- series 는 1차원 배열이다.
- np.unique => 배열에서 고유한 값을 찾아냄.
- ( 2 개의 배열 반환) : 1. 고유한 값들의 배열, 2. 고유한 값들의 등장횟수 배열
- return_counts => 고유한 값의 등장 횟수 반환
- [1] = > 등장횟수 배열!
- 등장 횟수 배열을 105로 나눔! => 105중에서 어느 비율만큼을 차지하는지!!
- 0의 차지 비율은 33%, 1의 차지 비율은 30%..
데이터 탐색
: 특성 간의 관계 확인
iris_df
산점도 행렬(scatterplot matrix)
: 한꺼번에 특성 간 관계를 확인 가능
pd.plotting.scatter_matrix(iris_df, figsize=(10,10), c=y, alpha =0.9)
plt.show()
- figsize => 그림의 크기를 가로, 세로 각각 10인치로 설정
- c = y -> 데이터 포인트의 색깔을 레이블 'y'에 다라 다르게 표시하도록 설정.
- alpha => 데이터 포인트의 투명도를 설정하는 것.
- ( 1에 가까울수록 불투명하게 표시됨. )
< 모델링 >
: 모델 객체 생성 및 하이퍼 파라미터 조정
: 모델 학습 및 모델 평가, 예측
객체 생성 , 이웃의 개수 5로 설정
iris_knn = KNeighborsClassifier(n_neighbors=5)
모델 학습
iris_knn.fit(x_train, y_train)
모델 예측
pre = iris_knn.predict(x_test)
pre
iris_data.target_names[pre]
평가
: accuracy_score(테스트 답, 테스트 예측값)
accuracy_score(y_test,pre)
하이퍼 파라미터 조정(튜닝)
n_neighbors : 이웃 수를 여러번 바꿔보면서 모델의 성능을 확인해보자.
저장하는 빈 리스트 2개 설정
train_lst = [] # train 성능
test_lst =[] # test성능
# 1에서 50까지 2칸씩 띄면서 k값을 셋팅.
n_setting = range(1,50,2) # 이웃의 수
list(n_setting)
for k in n_setting:
# 모델 생성
knn_clf = KNeighborsClassifier(n_neighbors=k)
# 모델 학습 train데이터 활용
knn_clf.fit(x_train, y_train)
# 모델 예측 및 평가(성능 확인)
# train -> train_lst에 저장
train_pre = knn_clf.predict(x_train)
train_acc = accuracy_score(y_train,train_pre)
train_lst.append(train_acc)
# test -> test_lst에 저장
test_pre = knn_clf.predict(x_test)
test_acc = accuracy_score(y_test,test_pre)
test_lst.append(test_acc)
train_lst
하이퍼 파라미터 튜닝 결과 시각화
plt.figure(figsize=(10,4))
plt.plot(n_setting,train_lst, label='train acc')
plt.plot(n_setting, test_lst, label='test acc')
plt.legend() # 범례 출력
plt.grid() # 그래프 눈금선 출력
plt.ylabel('accuracy') # y축 이름 설정
plt.xlabel('n_neighbors == k')
plt.xticks(n_setting) # x축 격자 크기 설정
plt.show()
- k값이 바뀜에 다른 성능 추이 확인
- train100%에 맞춘다라는 건 과대적합일 확률이 높음.
- k값이 커질수록 성능이 떨어짐. -> 점점 과소적합일 확률이 높음.
- 학습용 데이터라서 모델이 학습하기에 , 예측하기에 쉬운 데이터임.
- 데이터에 대해서 여러번 검증해서 확인해봐야함.
-> 신뢰 가능한 모델인지 판단.
iris_knn 모델 교차검증 진행
: 모델의 일반화 성능 확인
from sklearn.model_selection import cross_val_score
모델, 데이터, 몇 번 검증
- cv: 데이터를 분리해서 검증하는 횟수
- 이웃의 수 :5
- cross_val_score(모델,train데이터들, cv(crossvaley?!) = 횟수)
cross_val_score(iris_knn,x_train,y_train, cv=5)
print(cross_val_score(iris_knn,x_train,y_train, cv=5).mean())
# 평균은 94%정도
# k =9
iris_knn9 = KNeighborsClassifier(n_neighbors=9)
print(cross_val_score(iris_knn9,x_train,y_train,cv=5))
print('9 교차검증 평균 : ', cross_val_score(iris_knn9,x_train,y_train,cv=5).mean())
# k=3
iris_knn3 = KNeighborsClassifier(n_neighbors=3)
print(cross_val_score(iris_knn3,x_train,y_train,cv=5))
print('3 교차검증 평균 : ', cross_val_score(iris_knn3,x_train,y_train,cv=5).mean())
# 교차 검증의 결과를 확인하면서 어떤 파라미터로 설정하는게 좋음.
# 사람이 판단함.
# 9로 설정하는 것도 괜찮음.
'Python' 카테고리의 다른 글
[Machine Learning] Decision tree : 의사 결정 나무 (0) | 2023.08.30 |
---|---|
[Machine Learning] ex04. mushroom 실습 (0) | 2023.08.30 |
[Machine Learning] 일반화, 과소, 과대, knn (0) | 2023.08.29 |
[Python] 이미지 데이터 수집 (0) | 2023.08.29 |
[Python] 네이버 지도 데이터 수집 (0) | 2023.08.29 |