파이썬 머신러닝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
최적 파라미터를 찾는 방법에 대해 정리해봤습니다.
다양한 데이터에 적용해서 연습해보려구요ㅎ
반응형