슈퍼 파라미터 최적화: 격자 검색 이해
이 블로그에서, 우리는scikit learn의
GridSearchCV
를 사용하여 슈퍼 파라미터 검색을 더욱 편리하게 하고, 그것을 어떻게 사용하여 여러 개의 슈퍼 파라미터를 조정하는지 배울 것이다.우리 시작합시다!Time for a quick recall!
우리는 아이리스 데이터 집합의 분류 문제를 연구하고 있다.우리는 10배의 교차 검증과 교차 검증 정확도 득점의 평균치를 샘플 밖의 정확도에 대한 평가로 사용했다.☑
우리 다시 한 번 이 절차들을 빠르게 걸어봅시다.
# necessary imports
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
%matplotlib inline
# read in the iris data
iris = load_iris()
# create X (features) and y (response)
X = iris.data
y = iris.target
# 10-fold cross-validation with K=5 for KNN (the n_neighbors parameter)
knn = KNeighborsClassifier(n_neighbors=5)
scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
# use average accuracy as an estimate of out-of-sample accuracy
print(scores.mean())
# Output
0.9666666666666668
그런 다음 KNN 분류기에 대해 K의 최적 값을 결정합니다.가장 좋은 K
를 찾기 위해 우리는 K
n_neighbors
의 가능한 값을 순환한 다음에 K
의 값을 선택했다. 이 값은 가장 높은 교차 검증 정밀도를 제시했다.In KNN classifier, setting a very small value for
K
will make the model needlessly complex, and a very large value ofK
would result in a model with high bias, that yields suboptimal performance.
# search for an optimal value of K for KNN
k_range = list(range(1, 31))
k_scores = []
for k in k_range:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
k_scores.append(scores.mean())
# plot the value of K for KNN (x-axis) versus the cross-validated accuracy (y-axis)
plt.plot(k_range, k_scores)
plt.xlabel('Value of K for KNN')
plt.ylabel('Cross-Validated Accuracy')
K=13, 18, 20의 정확도가 0.98에 가깝기 때문에 우리는 K=20을 선택하기로 결정했다. K값이 클수록 모델이 복잡하지 않기 때문이다.for 순환을 작성하는 것은 그리 어렵지 않지만, 우리는 우리가 항상 이렇게 해야 한다는 것을 확실히 깨달았다.
따라서 매번 순환을 쓰지 않고 검사를 통해 최적 인자를 정할 필요가 없는 보다 편리한 초인자 검색 방법이 있는 것이 좋다.
GridSearchCV 이해
GridSearchCV 클래스를 계속 가져옵니다.
from sklearn.model_selection import GridSearchCV
매개변수 메쉬 정의하기
매개 변수 격자 (
param_grid
를 정의합니다. 이것은 Python 사전입니다. 이 사전의 키는 슈퍼 매개 변수의 이름입니다. 이 값은 슈퍼 매개 변수를 검색할 수 있는 가능한 값의 목록입니다.# define the parameter values that should be searched
k_range = list(range(1, 31))
# create a parameter grid: map the parameter names to the values that should be searched
param_grid = dict(n_neighbors=k_range)
print(param_grid)
# param_grid
{'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]}
우리는 지금 실례화GridSearchCV
하고 있다.이전에 param_grid
에 지정한 n_neighbors
파라미터가 아니라 cross_val_score
파라미터를 지정했습니다.왜 이게 효과가 있죠?매개 변수 격자
param_grid
는 사전이고, 키는 n_neighbors
이며, 값은 n 이웃의 가능한 값 목록입니다.따라서 지정param_grid
은 색인i
의 값을 n_neighbors
실행 중i_th
의 값으로 확보할 수 있다.인스턴스화, 메쉬 맞추기 및 결과 보기
# instantiate the grid
grid = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy', return_train_score=False)
현재, 우리는 데이터 의합 격자를 계속 사용하고 cv_results_
속성을 방문하여 10배의 교차 검증, 표준 편차와 파라미터 값 후의 평균 정밀도 점수를 얻는다.편의를 위해서 우리는 결과를 데이터 상자에 저장할 수 있다.n 근린=1부터 10까지의 정확도 득점의 평균치와 표준 편차는 다음과 같다.# fit the grid with data
grid.fit(X, y)
# view the results as a pandas DataFrame
import pandas as pd
pd.DataFrame(grid.cv_results_)[['mean_test_score', 'std_test_score', 'params']]
# Output
mean_test_score std_test_score params
0 0.960000 0.053333 {'n_neighbors': 1}
1 0.953333 0.052068 {'n_neighbors': 2}
2 0.966667 0.044721 {'n_neighbors': 3}
3 0.966667 0.044721 {'n_neighbors': 4}
4 0.966667 0.044721 {'n_neighbors': 5}
5 0.966667 0.044721 {'n_neighbors': 6}
6 0.966667 0.044721 {'n_neighbors': 7}
7 0.966667 0.044721 {'n_neighbors': 8}
8 0.973333 0.032660 {'n_neighbors': 9}
9 0.966667 0.044721 {'n_neighbors': 10}
cross_val_score
를 사용할 때 우리는 눈대중으로 정확도 득점을 측정하여 최상의 초파라미터를 확정하려고 한다. 더욱 쉽게 초파라미터의 값과 각자의 교차 검증의 정확도 득점을 그렸다!Sounds good but doesn’t seem to be a great option!
일단 우리가 격자 검색을 완성하면 다음 속성은 매우 유용할 것입니다!
체크를 선택할 수 있습니다.
☑ 교차 검증 정확도 최고 점수
best_score_
☑ 매개 변수의 최적 값best_params_
,☑
best_estimator_
, 이것은 최적 초파라미터를 가진 최적 모델이다.이제 이것들을 예로 들자.
# examine the best model
print(grid.best_score_)
print(grid.best_params_)
print(grid.best_estimator_)
# Output
0.9800000000000001
{'n_neighbors': 13}
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=13, p=2,
weights='uniform')
K=13을 선택했다. 기억해라. K=13은 K치 중 가장 높은 교차 검증 정확도 득점을 주는 것이다.✔지금까지 줄곧 괜찮았어!
여러 매개변수 검색
이 예에서 우리가 검색한 유일한 슈퍼 파라미터는
n_neighbors
이다.이런 초파라미터가 많으면?We may think, “Why not tune each hyperparameter independently?”
Well, we may independently search for the optimal values for each of the hyperparameters; but the model may perform best at some values of the parameters that are very different from the individual best values. So, we have to search for the combination of the parameters that optimizes performance rather than the individual best parameters.
KNNClassifier
의 같은 예시를 바탕으로 n_neighbors
이외에 최상의 권중 정책을 검색합시다.기본 가중치 옵션은 "통일"입니다. 여기서 모든 점의 가중치는 같고 "거리"옵션은 점의 거리의 역수에 따라 점의 가중치를 조정합니다.이런 상황에서 조회점의 근린은 근린보다 영향이 더 크다.
# define the parameter values that should be searched
k_range = list(range(1, 31))
weight_options = ['uniform', 'distance']
# create a parameter grid: map the parameter names to the values that should be searched
param_grid = dict(n_neighbors=k_range, weights=weight_options)
print(param_grid)
# param_grid
{'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
'weights': ['uniform', 'distance']}
예전처럼 실례화하고 격자를 맞추어 결과를 봅시다.# instantiate and fit the grid
grid = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy', return_train_score=False) grid.fit(X, y)
# view the results
pd.DataFrame(grid.cv_results_)[['mean_test_score', 'std_test_score', 'params']]
# Results
mean_test_score std_test_score params
0 0.960000 0.053333 {'n_neighbors': 1, 'weights': 'uniform'}
1 0.960000 0.053333 {'n_neighbors': 1, 'weights': 'distance'}
2 0.953333 0.052068 {'n_neighbors': 2, 'weights': 'uniform'}
3 0.960000 0.053333 {'n_neighbors': 2, 'weights': 'distance'}
4 0.966667 0.044721 {'n_neighbors': 3, 'weights': 'uniform'}
5 0.966667 0.044721 {'n_neighbors': 3, 'weights': 'distance'}
6 0.966667 0.044721 {'n_neighbors': 4, 'weights': 'uniform'}
7 0.966667 0.044721 {'n_neighbors': 4, 'weights': 'distance'}
8 0.966667 0.044721 {'n_neighbors': 5, 'weights': 'uniform'}
9 0.966667 0.044721 {'n_neighbors': 5, 'weights': 'distance'}
10 0.966667 0.044721 {'n_neighbors': 6, 'weights': 'uniform'}
11 0.966667 0.044721 {'n_neighbors': 6, 'weights': 'distance'}
12 0.966667 0.044721 {'n_neighbors': 7, 'weights': 'uniform'}
13 0.966667 0.044721 {'n_neighbors': 7, 'weights': 'distance'}
14 0.966667 0.044721 {'n_neighbors': 8, 'weights': 'uniform'}
15 0.966667 0.044721 {'n_neighbors': 8, 'weights': 'distance'}
16 0.973333 0.032660 {'n_neighbors': 9, 'weights': 'uniform'}
17 0.973333 0.032660 {'n_neighbors': 9, 'weights': 'distance'}
18 0.966667 0.044721 {'n_neighbors': 10, 'weights': 'uniform'}
두 매개 변수의 격자 검색 결과(데이터 프레임의 절단 보기)위에는 결과의 열 줄만 표시되어 있다.우리는 실제로 30*2=60개의 모델(우리는 30개의 가능
n_neighbors
값과 2개의 가능한 권중값이 있기 때문)이 있고 10배의 교차 검증을 선택했기 때문에 60*10=600개의 예측이 있을 것이다!우리 모델의 최적 점수와 최적 점수가 나오는 파라미터를 볼 때가 되었다.# examine the best model
print(grid.best_score_)
print(grid.best_params_)
# best score and best parameters
0.9800000000000001
{'n_neighbors': 13, 'weights': 'uniform'}
우리는 같은 최고의 교차 검증 정확도 점수 0.98을 얻었는데 그 중에서 n_neighbors
=13과 weights
=일치했다.지금 우리는 4개의 초파라미터를 조정해야 한다고 가정하자. 우리는 목록이 있는데, 그 중에서 각 초파라미터는 10개의 가능한 값이 있다.이 과정은 10*10*10*10 =10,000
개의 모델을 만들고 우리가 10배의 교차 검증을 실행할 때 100000개의 예측이 있다.일은 확실히 신속하게 확대되어 곧 계산상 불가능하게 변할 것이다.랜덤 검색과 알 수 있는 검색 같은 보다 효과적인 초파라미터 검색은 이 단점을 극복하는 데 매우 유용하다.다음 블로그 글에서 이 문제들을 토론합시다.
그 전에 즐겁게 공부하세요!
도구책
[1] 다음은 구글 Colab 노트북의 link 링크로 위의 예시에 사용된다.
[2] Introduction to Machine Learning in Python with scikit-learn by DataSchool .
[3] Scikit 학습 문서: GridSearchCV
http://scikitlearn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html
표지 사진: 사진작가Kelly Sikkema가 Unsplash
Reference
이 문제에 관하여(슈퍼 파라미터 최적화: 격자 검색 이해), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/balapriya/hyperparameter-tuning-understanding-grid-search-2648텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)