「Kaggleで勝つデータ分析の技術」について(内容編)

10/9に技術評論社から、「Kaggleで勝つデータ分析の技術」が出版されます(amazon)。
(ブログ主=著者の一人の門脇です)
 
 
多くの予約を頂いているようで大変有難いです。もし評価がひどくて多方面から矢が飛んで来たらどうしようと怖くなることもありますが、何だかんだで自信を持って出せる本に仕上がったと思っています。以下で、見どころや意図を紹介します。
 
目指したところ
 
私が目指したのは、テーブルデータについて「Kaggler(=Kaggleの参加者)の暗黙知を明らかにする」ことです。一度整理したかったですし、なかなか綺麗にまとまっている資料はないようです。
CourseraのHow to Win a Data Science Competitionが比較的近いテーマですが、英語なのはともかく、動画での講義なので情報を整理するコストがなかなか高いですし、またこの講座とも違うエッセンスを加えることができたかと思います。
 
Kaggleをあまりやったことのない方には、分析コンペという多数のタスクがあり、予測の良さに対して順位が明確につく環境でのノウハウには目新しいものが多いと思います。xgboostをはじめとする効果的な手法もありますし、また有名だけれど使えない手法が淘汰されていくところも面白いです。(SMOTEとか)
Kagglerの方には知っている情報も多いですが、特徴量のアイデアに迷ったときの事典となることや、手法やTIPSを整理して知識の穴を埋められることを目指しました。また、xgboostやTPEの仕組みの説明などでなかなか学ぶ時間がとれない理論的なところにも触れるようにしました。とはいえ、適当に期待は下げておきましょう笑
 
見どころ
 
 目次を見ると、大体何が書いてあるかわかるように構成しました。目次は技術評論社のページが見やすいかもしれません。
https://gihyo.jp/book/2019/978-4-297-10843-4/#toc 
 
私のオススメは3章と5章です。
 
3章:テーブルデータのコンペで最も重要な特徴量についての章です。目次だけでお腹いっぱいな感じがあります笑 
あまり綺麗な分け方ではないのですが、特徴量の作り方を大まかに以下に分けて説明しています。
  • モデルを意識した特徴量の作成
  • 欠損値の処理、数値変数の変換、カテゴリ変数の変換
  • 他のテーブルの結合、集約して統計量をとる
  • 時系列データ
  • 次元削減・教師なし学習
  • 特徴量を作るアイデア
前半の山場はtarget encodingで、後半の山場は集約と時系列データです。なかなか他では見られない視点や情報があると思います。
 
5章:モデルの評価を行うバリデーションの章です。前半はクロスバリデーション、group k-fold、時系列のバリデーションといった基本パターンの説明、後半は「何を目的としてバリデーションを行うのか」「学習データとテストデータの分割をまねる」といった、心構え・TIPS的な部分です。
特に後半の心構え的な部分について、明確に文章としてまとめたことに価値があると思っています。
 
その他の章については、以下のとおりです。
 
1章:Kaggleの概要を説明する章です。導入的な章ですが、それでもKagglerらしさや矜持のようなものが漏れ出ているようには思います。たとえば、タイタニックを例に説明をしていますが、理由があって特徴量の作成をあまりする気になれず、一方で手元のバリデーションとLeaderboardのスコアが合わずに焦っている様子を見ることができます。
 
2章:主に評価指標について説明する章で、評価指標の最適化が章のメインのテーマです。評価指標のハッキングなどと言われ、あまり本質的な意味がないと思われることもありますが、ゴールを常に意識することはタスクに取り組むときに普遍的に重要なポイントでしょう。
 
4章:モデルについて説明する章です。xgboostをはじめとするGBDT(勾配ブースティング木)の紹介に価値があり、他は頑張っていろいろ書きましたが蛇足ではないでしょうか。それくらい、GBDTの存在というのはテーブルデータの予測において圧倒的だと思っています。
 
6章:パラメータチューニングと特徴選択という、答えがあるのか良く分からないテーマを扱う章です。
パラメータチューニングについては、シンプルにやるにはグリッドサーチ、精度を求めるならベイズ最適化という考え方を中心に、パラメータの説明や動かし方などを記述しています。
特徴選択については、Kaggleで比較的良く使われている、GBDTの重要度を用いる手法を中心に説明しています。可視化は範囲から落としたのでSHAPやPartial Dependence Plotなどは入れていないのですが、入れても良かったですね。
 
7章:スタッキングをはじめとしたアンサンブルを説明する章です。
アンサンブルについてはKAGGLE ENSEMBLING GUIDEが有名ですが、前半が冗長に思うので、その辺りを考えながら構成を行いました。
「学習データとテストデータの分布が同じ」データについてスタッキングは強力な方法です。ただ、数百のモデルのスタッキング競争になるのを避けるためか、最近のコンペは学習データとテストデータの分布が違うものが多く、そういった場合にはスタッキングでなく加重平均など*1が使われるため、 重要性が薄れている印象はあります。
 
反省点
 
「現時点での最新のものを整理してまとめました」と「はじめに」で書いてしまったのですが、改めて見返すと以下は最新とは言い難いかなと思います。
 

・xgboostを使って説明している
   
分析コンペでは速度面の利点などからlightgbmが使われるようになり、xgboostを使う人はもうあまりいません。ただ、Kaggleのような大きなデータでなければxgboostで十分ですし、xgboostを理解するとlightgbmでも十分通用するので、まぁ良いかなと・・

ニューラルネットの最新の知見
    深層学習は世界中でかなりのリソースをかけて研究されており、技術の進展が速いです。画像データだけでなく、テーブルデータに使える概念や手法もあると思われます。たとえば、ネットワーク構造やパラメータチューニングのほか、domain adaptation*2の考え方を学習データとテストデータの分布が違う問題に適用するなどです。テーブルデータに適用する手法や知見がまだ確立していないように思うので、書くのは見送っています。
 
また、以下をもう少し強調して説明した方が良かったかもしれません。
  • Kaggleのコンペは、テーブルデータのコンペと、画像データなどを扱う深層学習の技術がメインとなるコンペの2つに大きく分かれます。本の記述だけだとKaggleにはテーブルデータしかないように見えてしまうかもしれないですが、そうでなく画像データなどのコンペも大きな位置を占めている、というか画像コンペの方が多いです。
  • 本で紹介したテクニックは実務に役立つものも沢山ありますが、分析コンペと実務には当然違う性質があります。分析コンペはデータが定まっている状況で精度を競うため、データを使いきることが重要です。また、メンテナンス性は多少無視して良いですし、Public Leaderboardでの確認がリークをしていないかの判断の助けになります。たとえば、分析コンペだとクロスバリデーションで評価を行い、hold-outデータを別途用意しておく余裕はないですが、実務ではデータを使いきる必要はなく、リークのリスクを減らすためにhold-outデータをとり置いて学習に一切使わないようにすることは有効でしょう。
 
オチ
 
原稿のドラフトを見せたときの編集者の感想
「実際に精緻な計算、戦略をとって取り組まれているように見えます。イキる*3というのがすべてを表しているとは思いませんが、そのイメージとはちょっと違う印象でした。」
🤔🤔🤔

*1:最近はあるモデルの予測値と目的変数の残差に対して違うモデルを適用するような手法もある

*2:Domain Adaptation — About ADDA, CyCADA and MCD が分かりやすかった

*3:twitterで自慢したり他人に噛みつくイキりDS(データサイエンティスト)と呼ばれる人が観測されていた