Python에서의 하이퍼파라미터 튜닝
Alex Scriven
Data Scientist
이전 작업:
neighbors_list = [3,5,10,20,50,75]
accuracy_list = []
for test_number in neighbors_list:
model = KNeighborsClassifier(n_neighbors=test_number)
predictions = model.fit(X_train, y_train).predict(X_test)
accuracy = accuracy_score(y_test, predictions)
accuracy_list.append(accuracy)
이후 DataFrame으로 모아 분석했습니다.
하이퍼파라미터 2개의 값을 테스트하려면?
GBM 알고리즘 사용:
learn_rate [0.001, 0.01, 0.05]max_depth [4,6,8,10](_중첩_) for 루프를 쓸 수 있습니다!
먼저 모델 생성 함수:
def gbm_grid_search(learn_rate, max_depth): model = GradientBoostingClassifier( learning_rate=learn_rate, max_depth=max_depth)predictions = model.fit(X_train, y_train).predict(X_test)return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
이제 하이퍼파라미터 목록을 순회하며 함수를 호출합니다:
results_list = []
for learn_rate in learn_rate_list:
for max_depth in max_depth_list:
results_list.append(gbm_grid_search(learn_rate,max_depth))
이 결과를 DataFrame에 담아 출력할 수 있습니다:
results_df = pd.DataFrame(results_list, columns=['learning_rate', 'max_depth', 'accuracy'])
print(results_df)

하이퍼파라미터와 값이 늘면 더 많은 모델이 생깁니다.
교차 검증은 어떨까요?
하이퍼파라미터를 더 늘리면?
루프를 중첩할 수 있습니다!
# 테스트할 값 목록 조정
learn_rate_list = [0.001, 0.01, 0.1, 0.2, 0.3, 0.4, 0.5]
max_depth_list = [4,6,8, 10, 12, 15, 20, 25, 30]
subsample_list = [0.4,0.6, 0.7, 0.8, 0.9]
max_features_list = ['auto', 'sqrt']
함수를 조정합니다:
def gbm_grid_search(learn_rate, max_depth,subsample,max_features):
model = GradientBoostingClassifier(
learning_rate=learn_rate,
max_depth=max_depth,
subsample=subsample,
max_features=max_features)
predictions = model.fit(X_train, y_train).predict(X_test)
return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
for 루프를 중첩합니다:
for learn_rate in learn_rate_list:
for max_depth in max_depth_list:
for subsample in subsample_list:
for max_features in max_features_list:
results_list.append(gbm_grid_search(learn_rate,max_depth,
subsample,max_features))
results_df = pd.DataFrame(results_list, columns=['learning_rate',
'max_depth', 'subsample', 'max_features','accuracy'])
print(results_df)
이제 모델은 몇 개일까요?
무한정 중첩할 수는 없습니다!
또한 이런 정보가 필요할 수 있습니다:
그리드를 만듭니다:

그리드의 각 셀을 순회합니다:

(4,0.001)은 다음 추정기와 같습니다:
GradientBoostingClassifier(max_depth=4, learning_rate=0.001)
이 접근의 장점:
장점:
이 접근의 단점:
‘지도’ 방식은 나중에 다룹니다!
Python에서의 하이퍼파라미터 튜닝