Pythonでのハイパーパラメータチューニング
Alex Scriven
Data Scientist
ベイズ則:
新しい証拠を用いて、ある結果に関する信念を反復的に更新する統計手法
ベイズ則の形:
$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$
左辺=B が起きたときの A の確率。B は新しい証拠。
右辺はその計算方法。
$$ 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でのハイパーパラメータチューニング