【入門】Kaggle本でデータ分析の技術を勉強する【第6章】

書籍

今回は『Kaggleで勝つデータ分析の技術』の第6章、モデルのチューニングについてです。

パラメータのチューニングなどでモデルの精度を高めるテクニックを学びます。

Kaggleなどのデータ分析コンペでは、実際のデータを扱うため、機械学習の解説書にはあまり載っていないような手法やテクニックが数多く活用されています。これらを理解し自身で使えるようにしておくことはコンペだけでなく、実務でのモデル構築において非常に役に立ちます。特徴量の作り方,バリデーション,パラメータチューニングなどについて,一般的な書籍ではあまり言及されない暗黙知やポイントについて記述しています。

以下、第6章の備忘録(メモ、引用)と実装になります。

備忘録

  • 手動でのパラメータ調整について

例えば、意味のない特徴量が使われすぎているように感じる場合には正則化のパラメータを強めたり、相互作用の反映が足りないように感じる場合には決定木を分岐させる数を増やすといった方法が考えられます。

 

  • 著者の方のパラメータ調整方法は以下

1. まず、ベースラインとなるパラメータで学習させる
2.次に、もし簡単に調整を行いたい場合は、1~3種類のパラメータとそれぞれ2~5個の候補程度でグリッドサーチを行う
3.本格的にパラメータチューニングを行う場合にはベイズ最適化を行う(この段階では、グリッドサーチ/ランダムサーチよりはベイズ最適化を利用する方が効率的)

 

  • モデルのデフォルト値は速度や単純さを重視しており、分析コンペで使うには向いていないものがある(例えばxgboostのetaのデフォルト値は0.3だがこれは大きすぎる)

 

  • 自動でパラメータ調整する場合、調整を行いすぎると評価対象のデータに過剰に適合してしまう
    →「パラメータ調整に使うfoldの分割」と「実際にモデルを作成・予測して使うfoldの分割」の乱数シードは変えた方が望ましい

 

  • モデルがGBDTである場合は、パラメータチューニングよりも、良い特徴量を加えることが精度改善に役立つことが多い
    →序盤からパラメータ調整に注力しすぎないようにする

 

  • パラメータチューニングのポイント

・重要なパラメータとそこまで重要でないパラメータがある。すべてのパラメータを調整する必要はないので、重要なパラメータから調整していくと良い

・パラメータの値を増加させたときに、モデルの複雑性を増すパラメータと、逆にモデルを単純にするパラメータがある。これを理解しておくと、学習が上手く行かないときの考察に有用

 

  • ベイズ最適化ではパラメータ間の依存性により、効率的に探索できない可能性がある
    →依存関係をパラメータ空間に明示的に定義する。それが難しいなら試行回数を増やしてみる

 

 

  • GBDTのパラメータチューニングのノウハウはP.315~320

 

  • GBDTの決定木数は十分多くしておいて、アーリーストッピングで制御する
    →early_stopping_roundsは概ね10÷etaぐらいで設定

 

  • NNのパラメータ調整では、まずは学習率を調整、ある程度学習が上手く進むようになってからの他のパラメータを調整する

 

  • 多層パーセプトロンの層の構成やチューニングについては、参考となる資料が少ないらしい
    →取り組むタスクに近いコンペや先行研究を参考にしてみる

 

  • 線形モデルでは正則化のパラメータがチューニングの対象

 

分析コンペにおいては、特徴量がそれぞれ多少なり予測に役立つ情報を持っていること、GBDTでは意味のない特徴量があっても精度が落ちづらいこと、アンサンブルで過学習が抑えられることなどから、それほど特徴選択が用いられていないように思います。つまり、与えられたデータに含まれている特徴量はすべて採用し、考えて作った特徴量はスコアを見ながら取捨選択する、というのが1つの進め方です。

→GBDTの特徴量の重要度をベースとする手法が比較的よく使われているらしい

 

  • 特徴選択する際は、out-of-foldで学習データの一部で特徴選択を行い、残りのデータで精度がきちんと向上するかどうかを検証するのが望ましい

 

  • xgboostのFeature Importanceはデフォルトでは頻度が出力されるが、ゲインを出力した方が良い(ゲインの方が、特徴量が重要かどうかをより表現していると考えられる)

 

xgboostの特徴量の重要度は、学習データに対して作成された決定木の分岐の情報から計算されます。連続変数やカテゴリ数の多いカテゴリ変数は分岐の候補が多いためやや上位になりやすかったり、乱数によりでたらめな特徴量を作って試したときにその特徴量が上位に来てしまったりします。そのため、ばらつきを考慮することやランダムな値からなる特徴量と比較することは有効でしょう。

 

  • 分析コンペにおいては、クラスの分布が偏っている場合でもアンダーサンプリングもしくは特に工夫をしないケースが多いらしい
    (偏りのあるデータであっても、GBDTなどのモデルから出力される予測確率はそれなりに妥当)

 

  • 特徴量作成にはデータ全体を用いて、モデリングの際にアンダーサンプリングするのも一つのやり方

 

  • 正例と負例の比率を変えた場合には、loglossなど確率を予測するときに確率の補正を行う必要がある

実装

hyperoptを使ったGBDTでのパラメータチューニングと特徴量の重要度を出力するのを手元でも試しました。xgboostもhyperoptもこれまで使った経験はありましたが、コードの書き方など参考になりました。

mimosom/study
Contribute to mimosom/study development by creating an account on GitHub.

第6章は、特にコラムで紹介されている著者の方々のパラメータチューニングの紹介が非常に参考になりました。

こういうノウハウはとても勉強になります。貴重な情報を公開してくださった筆者の方々に感謝です。

 

Kaggleなどのデータ分析コンペでは、実際のデータを扱うため、機械学習の解説書にはあまり載っていないような手法やテクニックが数多く活用されています。これらを理解し自身で使えるようにしておくことはコンペだけでなく、実務でのモデル構築において非常に役に立ちます。特徴量の作り方,バリデーション,パラメータチューニングなどについて,一般的な書籍ではあまり言及されない暗黙知やポイントについて記述しています。

コメント