Python에서의 하이퍼파라미터 튜닝
Alex Scriven
Data Scientist
베이즈 규칙:
새로운 증거를 사용해 어떤 결과에 대한 우리의 믿음을 반복적으로 업데이트하는 통계적 방법
베이즈 규칙의 형태:
$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$
좌변(LHS) = B가 발생했을 때 A의 확률. B는 새로운 증거.
우변(RHS)은 계산식.
$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$
혼란스러울 수 있으니, 의료 진단 예시로 살펴보겠습니다.
의료 예시:
임의의 사람이 질병을 가질 확률은?
$$ P(D) = 0.05 $$
증거가 없으므로 단순히 사전확률입니다.
소인이 있는 사람이 질병을 가질 확률은?
$$ P(D \mid Pre) = \frac{P(Pre \mid D) \, P(D)}{P(pre)} $$
$$ P(D \mid Pre) = \frac{0.2 \, * 0.05}{0.1} = 0.1 $$
이 논리를 하이퍼파라미터 튜닝에 적용합니다:
베이즈 하이퍼파라미터 튜닝은 최근 방법이지만, 큰·복잡한 튜닝에서 최적 조합을 잘 찾아 널리 사용됩니다
Hyperopt 패키지 소개.
베이즈 튜닝을 위해 필요한 것:
그리드 설정 방법:
Hyperopt는 그리드의 점 값을 쓰지 않고, 각 점을 하이퍼파라미터 값의 확률로 표현합니다.
여기서는 균등분포를 쓰지만, 문서에 더 많은 옵션이 있습니다.
그리드 설정:
space = {
'max_depth': hp.quniform('max_depth', 2, 10, 2),
'min_samples_leaf': hp.quniform('min_samples_leaf', 2, 8, 2),
'learning_rate': hp.uniform('learning_rate', 0.01, 1, 55),
}
목적 함수가 알고리즘을 실행합니다:
def objective(params): params = {'max_depth': int(params['max_depth']), 'min_samples_leaf': int(params['min_samples_leaf']), 'learning_rate': params['learning_rate']} gbm_clf = GradientBoostingClassifier(n_estimators=500, **params)best_score = cross_val_score(gbm_clf, X_train, y_train, scoring='accuracy', cv=10, n_jobs=4).mean() loss = 1 - best_scorewrite_results(best_score, params, iteration) return loss
알고리즘 실행:
best_result = fmin(
fn=objective,
space=space,
max_evals=500,
rstate=np.random.default_rng(42),
algo=tpe.suggest)
Python에서의 하이퍼파라미터 튜닝