情報に基づく手法:ベイズ統計

Pythonでのハイパーパラメータチューニング

Alex Scriven

Data Scientist

ベイズ入門

 

ベイズ則:

新しい証拠を用いて、ある結果に関する信念を反復的に更新する統計手法

  • 情報に基づく探索という考え方に直感的に合います。証拠が増えるほど良くなります。
Pythonでのハイパーパラメータチューニング

ベイズ則

ベイズ則の形:

$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$

  • 左辺=B が起きたときの A の確率。B は新しい証拠。

    • これを「事後確率」と呼びます
  • 右辺はその計算方法。

  • P(A) は「事前確率」。事象に関する初期仮説。P(A|B) とは異なり、P(A|B) は新しい証拠が与えられたときの確率です。
Pythonでのハイパーパラメータチューニング

ベイズ則

 

$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$

  • P(B) は「周辺尤度」。この新しい証拠を観測する確率
  • P(B|A) は「尤度」。関心のある事象が起きたときにその証拠を観測する確率

少し分かりにくいので、医療診断の例で見てみます。

Pythonでのハイパーパラメータチューニング

医療におけるベイズ

 

医療の例:

  • 一般集団の 5% がある疾患を持つ
    • P(D)
  • 10% が素因あり
    • P(Pre)
  • 疾患がある人の 20% が素因あり
    • P(Pre|D)
Pythonでのハイパーパラメータチューニング

医療におけるベイズ

任意の人がその疾患を持つ確率は?

$$ 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 $$

Pythonでのハイパーパラメータチューニング

ハイパーパラメータチューニングにおけるベイズ

この考え方はハイパーパラメータチューニングにも使えます。

  • ハイパーパラメータの組み合わせを選ぶ
  • モデルを作る
  • 新しい証拠(モデルのスコア)を得る
  • 信念を更新し、次ラウンドでより良いハイパーパラメータを選ぶ

ベイズ的ハイパーパラメータチューニングは新しい手法ですが、大規模・複雑な設定で最適組み合わせを見つけやすく、人気があります

Pythonでのハイパーパラメータチューニング

Hyperopt でのベイズ的チューニング

 

Hyperopt パッケージの紹介。

ベイズ的ハイパーパラメータチューニングでは次を行います。

  1. ドメインの設定:グリッド(少し工夫あり)
  2. 最適化アルゴリズムの設定(既定の TPE を使用)
  3. 最小化する目的関数:1-Accuracy を用いる
Pythonでのハイパーパラメータチューニング

Hyperopt:ドメイン(グリッド)の設定

グリッドの指定には多くの方法があります。

  • 単純な数値
  • リストから選択
  • 値の分布

Hyperopt はグリッドの点を固定値ではなく、各ハイパーパラメータ値の確率として扱います。

ここでは一様分布を使いますが、詳細はドキュメント参照。

Pythonでのハイパーパラメータチューニング

ドメイン

 

グリッドの設定:

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),
}
Pythonでのハイパーパラメータチューニング

目的関数

目的関数はアルゴリズムを実行します。

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_score
write_results(best_score, params, iteration) return loss
Pythonでのハイパーパラメータチューニング

アルゴリズムの実行

 

アルゴリズムを実行:

best_result = fmin(
            fn=objective,
            space=space,
            max_evals=500, 
            rstate=np.random.default_rng(42),
            algo=tpe.suggest)
Pythonでのハイパーパラメータチューニング

Passons à la pratique !

Pythonでのハイパーパラメータチューニング

Preparing Video For Download...