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

Python

今回は『Kaggleで勝つデータ分析の技術』の第4章、モデルの作成についてです。

第4章はモデルを扱うときのテクニックや、 著者の方の分析コンペ用のクラスやフォルダの構成の紹介など、至れり尽せりの内容になっています。

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

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

備忘録

  • モデルとは特徴量を入力データとして予測値を出力する変換器のこと

 

  • 著者の方の作業の配分は以下

特徴量作成が最も重要で、分析コンペの半分から8割の作業時間は特徴量作成に費やす
・ハイパーパラメータは、変更したときにどのくらい影響があるか時折見ながら、本格的な調整は終盤に行う
モデルはGBDTでまずは進めていき、タスクの性質によってニューラルネットを検討したり、アンサンブルを考える場合には他のモデルも作成する
・データやタスクの理解が進むとともに、バリデーションの枠組みを変更することもある

 

  • バリデーションは、クロスバリデーションしておけば間違いない

 

  • クロスバリデーションでモデルの学習と評価を行った後、テストデータに対してどのように予測を行うかは「各foldで学習したモデルを保存しておき、それらのモデルの予測値の平均をとる」、「改めて学習データ全部を使って学習させて、そのモデルで予測する」どちらでも良い。
    →学習データ全体に対して再度学習させた方が、時間は掛かるが、わずかに精度が良くなる可能性がある

 

  • GBDTやニューラルネットでアーリーストッピングをすると、アーリーストッピング用のバリデーションを作らない限り(一般的には作らない?)、バリデーションのスコアがフェアな評価より若干上がってしまうことに注意

 

  • バギング:同じ種類のモデルを並列に複数作成し、それらの予測値の平均などを用いて予測
    →学習に用いる乱数シードを変えただけで平均をとることもある

 

  • 分析コンペのモデルでは、基本的にGBDT、タスクによってはニューラルネットを選ぶのが定石。線形モデルやkNNなどは単体の精度はそれほどだが、アンサンブルで使うことがある

 

  • SVMは精度や計算速度が他と比べて見劣りするため、あまり使われない

 

scikit-learnのドキュメントにはモデルの選び方として図4.8がありますが、データが十分にあるテーブルデータの回帰や分類のタスクでは、GBDTで上手くいくことが多く、このように細かに条件で分岐させる必要はあまりないでしょう

 

  • GBDTについて著者の方の経験則

・精度が高い
・パラメータチューニングをしなくても精度が出やすい
・不要な特徴量を追加しても精度が落ちにくい

 

  • 最近はxgboostよりもlightgbmの方が高速なので人気

 

  • ニューラルネットはテーブルデータに対しては、中間層が2から4層程度の全結合層がよく使われる。最近はRNNが利用されることも。
    (テクニックとしてはbatch normalizationが効果が高いため、広く使われている)

 

  • ニューラルネットは多クラス分類に比較的強く、多クラス分類を自然にモデリングできる
    (GBDTと遜色ない精度が出ることもある)

 

  • 人手での特徴量作成を行ったGBDTに対して、あまり特徴量作成を行わないニューラルネットが遜色ない精度になることもあるらしい

 

  • ニューラルネットの構造に迷ったら、Kaggleの過去のソリューションを参考にするとよい

 

  • データが十分でなかったり、ノイズが多いなど、過学習しやすいようなデータでは線形モデルが活躍することがある(ただし特徴量作成を十分に頑張らないといけない)

 

  • 筆者の方の分析コンペ用クラスとフォルダ構成は以下のサンプルを参考
    (中身の詳しい解説はP.267~)
ghmagazine/kagglebook
Contribute to ghmagazine/kagglebook development by creating an account on GitHub.

実装

私のGitHubのJupyter notebook上で検証していますが、lightgbmでアーリーストッピングを使う際、predictメソッドでnum_iteration=model.best_iterationを指定しなくてもmodel.best_iterationを反映してくれるんですね。

こういう仕様なのでしょうか・・・。

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

実装時に参考にさせて頂いたページ:

Python: LightGBM を使ってみる - CUBE SUGAR CONTAINER
LightGBM は Microsoft が開発した勾配ブースティング決定木 (Gradient Boosting Decision Tree) アルゴリズムを扱うためのフレームワーク。 勾配ブースティング決定木は、ブースティング (Boosting) と呼ばれる学習方法を決定木 (Decision Tree) に適用...
KaggleチュートリアルTitanicで上位1%に入った話。(0.87081)
前回書いた「KaggleチュートリアルTitanicで上位3%以内に入るには。(0.82297)」 から久々にやり直した結果上位1%の0.87081を出せたのでどのようにしたのかを書いていきます。

個別のモデルの考え方やテクニックが満載で、とても勉強になる章でした。

 

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

コメント