파이썬 머신러닝ML

파이썬 K-fold, 최적 파라미터 찾기

양기호니 2022. 12. 5. 22:12
728x90
반응형

혼자 공부하려고 정리했어요~

 

KFold

20개의 y값을 0.2 : 0.8로 나눠서 5set로 검증할 수 있도록 split함

x = np.arange(0.0, 2.0, 0.1)
y = np.zeros(20)
y[12:] = 1

kfold = KFold(5, shuffle=True)
for train, test in kfold.split(x):
  print(y[train], y[test])
  
출력 :
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 1. 1. 1.] [0. 0. 1. 1.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1.] [0. 0. 0. 1.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1.] [0. 0. 0. 1.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 1. 1. 1.] [0. 0. 1. 1.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 1. 1. 1.] [0. 0. 1. 1.]

 

 

knn의 최적 파라미터 찾기

이웃 1개만 이용하여 결과값 산출

from sklearn.model_selection import cross_val_score, cross_validate

knn = KNeighborsClassifier(n_neighbors=1)

scores = cross_val_score(knn, X, y, cv=5)
print(f'acc scores :{scores}')
print(f'mean acc : {scores.mean()}')

 

KFold에서 5set로 나눈 것 각각 정확도를 확인합니다.

점차 이웃값 1 ~ 10까지 하나하나 확인합니다.

이 중 가장 정확도가 높은 best parameter를 찾습니다.

from sklearn.model_selection import cross_val_score, cross_validate

best = (0,0)
for k in range(1, 11):
  knn = KNeighborsClassifier(n_neighbors=k)
  scores = cross_val_score(knn, X, y, cv=5)
  print(f'k={k}, mean acc:{scores.mean()}, acc scores :{scores}')
  if best[1] < scores.mean():
    best = k, scores.mean()

print(f'best, k:{best[0]}, mean acc:{best[1]}')

출력
k=1, mean acc:1.0, acc scores :[1. 1. 1. 1. 1.]
k=2, mean acc:1.0, acc scores :[1. 1. 1. 1. 1.]
k=3, mean acc:1.0, acc scores :[1. 1. 1. 1. 1.]
k=4, mean acc:1.0, acc scores :[1. 1. 1. 1. 1.]
k=5, mean acc:1.0, acc scores :[1. 1. 1. 1. 1.]
k=6, mean acc:1.0, acc scores :[1. 1. 1. 1. 1.]
k=7, mean acc:1.0, acc scores :[1. 1. 1. 1. 1.]
k=8, mean acc:1.0, acc scores :[1. 1. 1. 1. 1.]
k=9, mean acc:1.0, acc scores :[1. 1. 1. 1. 1.]
k=10, mean acc:1.0, acc scores :[1. 1. 1. 1. 1.]
best, k:1, mean acc:1.0

 

이웃 1개만 이용해도 잘 맞추는군요..ㅎ

for문을 대체한 코드입니다.

 

GridSearchCV -> knn의 이웃값을 1~10까지 5set씩 확인합니다.

이 중 가장 정확도가 높은 best parameter를 찾습니다(gscv.cv_results_).

 

from sklearn.model_selection import GridSearchCV

knn = KNeighborsClassifier()
gscv = GridSearchCV(estimator=knn, param_grid={'n_neighbors':range(1, 11)}, cv=5)
gscv.fit(X, y)
display(pd.DataFrame(gscv.cv_results_))

print("best param:", gscv.best_params_)


출력
데이터 프레임형태로 출력
best param: {'n_neighbors': 1}

 

pipeline 활용하여 minmax표준화 -> knn -> 최적 파라미터 찾기

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
mm_scaler = MinMaxScaler()
knn = KNeighborsClassifier()
pipe = Pipeline([('mm_scaler', mm_scaler), ('knn', knn)])

cv = GridSearchCV(estimator=pipe, param_grid={'knn__n_neighbors':range(1, 11)}, cv=5)
cv.fit(X_train, y_train)
display(pd.DataFrame(cv.cv_results_))

print("best param:", cv.best_params_)

estimator = cv.best_estimator_
test_acc = estimator.score(X_test, y_test)
print('Test acc:', test_acc)


출력
데이터 프레임형태로 출력
best param: {'knn__n_neighbors': 1}
Test acc: 1.0

 

최적 파라미터를 찾는 방법에 대해 정리해봤습니다.

다양한 데이터에 적용해서 연습해보려구요ㅎ

반응형