ハイパーパラメータ

ハイパーパラメータがモデルの 過学習 を防ぐ 逆正則化パラメータ になります。

ロジスティック回帰の例:

lr = LogisticRegression(C=1000)

この C がハイパーパラメータです。

トレーニング用のデータとテスト用のデータに分割して学習、評価を行います。 このとき 「トレーニング用のデータに過度に最適化してしまうこと」過学習 といいます。

その過学習を防ぐためのパラメータが C で、大きければ大きいほど過学習に陥りやすくなります。 大きすぎると過学習に陥る可能性がありますし、小さすぎると学習にならないという問題があります。

C=1000 が最適な値かどうかは分かりません。

学習モデルのハイパーパラメータは最適な値を設定する必要があります。これをチューニングといいます。 また、学習モデルによってハイパーパラメータの種類や量は異なります。

クロスバリデーション

ハイパーパラメータを決めるには何度か「学習 => 判定(スコア測定)」を試す必要があります。 テストデータは最終的な判定に使うべきで、ハイパーパラメータのチューニングには使いません。

分割したトレーニングデータをさらに分割して、かつデータに偏りの無いように性能を検証する必要があります。 そのための手法が クロスバリデーション と呼ばれるものです。

scikit-learnでは cross_val_score 関数を使って簡単にクロスバリデーションを行えます。

scores = cross_val_score(
    estimator=clf,  # 分類器を指定
    X=X_train,  # 特徴行列 X を指定
    y=y_train,  # 目的変数 y を指定
    cv=8  # データを何分割にして検証するか指定
)

cross_val_score は、内部では層化k分割交差検証という手法を使って偏りの無いようにスコアを計算します。

cv には内部でデータを何分割してスコアを計算するかを指定できます。 cross_val_score 関数は cv の数と同じ長さの numpy.array を返します。 arrayの各値が、1回ごとに計算したスコアの値になります。 このarrayから平均と標準偏差を計算することで、最終的なスコアを計算して性能評価ができます。

層化k分割交差検証

ハイパーパラメータチューニングをしよう

  1. データを分割
  2. cross_val_score で何度か検証
    • 何度か max_depth を変えて実行
  3. 結果が一番良いハイパーパラメータでテストデータでスコア計算

クロスバリデーションによって、より信頼できる方法で分類器の性能評価ができます。 また、scikit-learnの cross_val_scores はCPUのコアごとに並列分散処理する機能も備えています。

詳しくは sklearn.model_selection.cross_val_score を参照してください。