관리 메뉴

DeseoDeSeo

[Machine Learning] iris_knn 분류실습 part.2 본문

Python

[Machine Learning] iris_knn 분류실습 part.2

deseodeseo 2023. 8. 29. 17:41

 

크기확인
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로 설정하는 것도 괜찮음.