u++の備忘録

Kaggleにおける「特徴量エンジニアリング」の位置づけ 〜『機械学習のための特徴量エンジニアリング』に寄せて〜

はじめに

このたび、『機械学習のための特徴量エンジニアリング』をご恵贈いただきました。

Kaggleと親和性が高い書籍名で、Twitterのタイムラインなどを見るに、Kaggleに興味がある層を中心に大きな注目を集めているようです。

本記事では本書の発売に寄せて、Kaggleの自分流のワークフローと「特徴量エンジニアリング」の位置づけについての私見を述べます。その上で本書がKaggleのワークフローのどの部分に寄与するかを説明します。最後に、Kaggle観点で本書をどういう方にオススメするかに触れて本記事を締めくくります。

なお下記の記事では、本書のより包括的なレビューが掲載されています。

vaaaaaanquish.hatenablog.com

機械学習のための特徴量エンジニアリング』の書誌情報

github.com

Kaggleのワークフロー

以下は、私が考えるKaggleのワークフローです。便宜上「Kaggleの」としていますが、より広義に「機械学習コンペティションの」と置き換えても良いと考えています。

  1. (探索的データ分析)
  2. ベースラインモデルの構築
  3. Validationの構築
  4. 特徴量エンジニアリング
  5. ハイパーパラメータ調整
  6. アンサンブル

このワークフローは、自分で何度かKaggleのコンペに参加する中で、感覚的につかみ始めたものでした。

本記事で言語化するに当たっては、2019年1月末にパリで開催された「Kaggle Days Paris」でのCPMPさんの発表を参考にしています。ワークフローの項目は同様ですが、個人的に探索的データ分析はKaggleの序盤においては必ずしも優先順位が高くないと考えており、括弧を付与しました。

f:id:upura:20190222145921p:plain
https://www.kaggle.com/cpmpml

CPMPさんの発表資料はこちらで閲覧できます。

drive.google.com

1. (探索的データ分析)

探索的データ分析とは、コンペの課題設定を踏まえて与えられたデータを分析することです。

Kaggleの文脈においては、単に「各特徴の分布や欠損値の有無などを確認する」というより「データに隠された傾向をあばき、新しい特徴量につながる気付きを得る」という意味合いが大きいと思います。

探索的データ分析は他者との差異を生み出す上で非常に重要なことですが、一方で時間制約のある中での優先順位として思考停止で多くの特徴量を生成する方がスコア向上の期待値が高いという考え方もあります。

個人的なワークフローとしては、Voteが多い*1探索的データ分析のKernelを読む*2ことで取りあえずのデータ把握を終えて、次の「2. ベースラインモデルの構築」へ移ることが多いです。「4. 特徴量エンジニアリング」のアイディアが尽きた際に、単なるデータ把握の意味合いを超えた探索的データ分析に取り組むような優先順位を意識しています。

kaggler-ja-wikiの「よくある質問 > EDA(Exploratory Data Analysis - 可視化してデータを見ること)って何のためにやるの?」辺りも、興味があればご参照ください。

2. ベースラインモデルの構築

ベースラインモデルは「最初に与えられたデータを基に作成した、エラーなく提出してスコアが算出されるモデル」くらいの意です。

いわゆるデータの「前処理」にも相当する部分で、与えられたデータを機械学習モデルが扱える形式に最低限整えていきます。テーブルデータを扱うコンペの場合、学習器には欠損値をそのまま扱えるLightGBMを用いることが多いです。

ベースラインモデルの構築は、長期間取り組むコンペの中で再現性を保つ上で大切だと考えています。コンペが進む中でたくさんのコードを書くことになりますが「ベースラインモデルを徐々に補強していく」という視点を持つことで、差分や進捗の管理がしやすくなると思っています。

ちなみに、前処理については『前処理大全』という書籍が昨年発売されています。『機械学習のための特徴量エンジニアリング』の翻訳を担当した株式会社ホクソエムの監修です。

gihyo.jp

3. Validationの構築

取りあえず提出できるベースラインモデルを作成した後は、Validationの構築に移ります。

目的は「4. 特徴量エンジニアリング」に先立っての準備です。Validationの構築を疎かにしていると、たとえ新しい特徴量を作っても「この特徴量が効果的なのか分からない」という事態を招いてしまいます。

世界ランキング1位のbestfittingさんも、KaggleのインタビューでValidationの重要性を強調しています。

A good CV is half of success. I won’t go to the next step if I can’t find a good way to evaluate my model.
(良いCVが得られれば、成功の道半ばに到達したと言える。私は、モデルの良い評価方法が得られるまで、次のステップへ進まない)

blog.kaggle.com

Validationの構築は非常に難易度の高いタスクです。データや問題設定に依存する部分が大きく、また真に良いValidationが得られたかはコンペが終わるまで誰にも分かりません。

現実的には、discussionで他人の状況を確認*3しながら「4. 特徴量エンジニアリング」に遷移していくことになるかと思います。

Validationの構築が重要な理由については、下記の記事でも説明しています。

upura.hatenablog.com

4. 特徴量エンジニアリング

Validationの構築後、いよいよ特徴量エンジニアリングに取り組みます。

CPMPさんは、大きく分けて2種類の特徴量エンジニアリングを紹介しています。

  • 一般的に効果があるとされる特徴量エンジニアリング
  • ドメイン知識に紐づく特徴量エンジニアリング

以降は私の解釈ですが、Kaggleコンペにおいて前者は「守り」、後者は「攻め」に分類できると思います。

この「攻め」「守り」という考え方は、まますさんが以前に呟いていたの見て気に入った表現です。

前者の「守り」については、コンペの問題設定にあまり依存せず、一般的に効果が知られている技術が該当します。具体的には、カテゴリ変数のエンコードなど、コンペを問わず頻繁に登場するような技術です。

これらは、ある程度力を入れてKaggleに取り組んでいる人は過去のコードを使い回すなどで、ほぼ確実に試している特徴量エンジニアリングになります。その意味で、スコアを争う上で一人だけ遅れを取らないために取り組む「守り」の技術と称しています。

ただしこれまで、あまり日本語で読める体系的な書籍は私の観測する限りありませんでした*4

いろいろなコンペに参加してKernelやWinner Solutionなどを読みながら「守り」の技術を磨いてきたのですが、今回『機械学習のための特徴量エンジニアリング』が発売されることで、この部分の習得がしやすくなるのではないかと期待しています。

後者の「攻め」については、コンペの問題設定の中で独自に有用な特徴量エンジニアリングです。CPMPの資料に記載されている具体例としては、例えば「TalkingData AdTracking Fraud Detection Challenge」コンペの話題がありました。

f:id:upura:20190222201620p:plain

このようにドメイン知識に紐付いた考察で、汎用的に知られていない新しい特徴量を作っていくのが「攻め」の特徴量エンジニアリングです。

5. ハイパーパラメータ調整

ハイパーパラメータ調整は「3. Validationの構築」や「4. 特徴量エンジニアリング」に一定の区切りが付いた後など、コンペを通じて数回程度実施するような認識を持っています。

ここで強調したいのは、ハイパーパラメータ調整はあくまで「最後の一押し」という点です。スコアの上がり幅は、効果的な新しい特徴量を発見した方が一般的に大きいです。

個人的な戦略としては、まずは別のコンペで使った実績のある良さげなハイパーパラメータで固定して特徴量エンジニアリングを実施していき、最後の一押しとしてハイパーパラメータを調整しています。

6. アンサンブル

アンサンブルは、複数のモデルの予測を組み合わせて、全体の予測とする手法です。モデルの多様性を得ることで、未知のテストデータへの汎化性能を高める効果があります。

ここで強調したいのは「コンペ序盤でのアンサンブルは避けるべき」という点です。スコアが上がるので満足度は得やすいのですが、アンサンブルの効果を高めるためにも、コンペ終盤になるまでは多様な特徴量を作成する方面で努力すべきだと思います。

本筋から外れるため、アンサンブルの具体的な方法については、下記の記事に譲ります。

upura.hatenablog.com

機械学習のための特徴量エンジニアリング』の貢献箇所

ここまで長々と、自己流のKaggleのワークフローについて述べました。

  1. (探索的データ分析)
  2. ベースラインモデルの構築
  3. Validationの構築
  4. 特徴量エンジニアリング
  5. ハイパーパラメータ調整
  6. アンサンブル

機械学習のための特徴量エンジニアリング』が最も貢献する箇所は、「4. 特徴量エンジニアリング」の中の「守り」の部分です。 一般的に効果があるとされる特徴量エンジニアリングを体系的に学ぶことができる点で、日本語の書籍として非常に素晴らしいと感じています。

さらに「守り」を一定レベルまで習得しておくことは「攻め」の特徴量エンジニアリングにも繫がるでしょう。「守り」の技術で一定の質が担保されているからこそ、腰を据えて積極的に「攻め」の挑戦ができると考えています。

Kaggle観点で本書をオススメする読者

繰り返しになりますが、特徴量エンジニアリングはKaggleのワークフローの流れの中で真価を発揮します。

本書は、自分の力で「1. (探索的データ分析)」「2. ベースラインモデルの構築」「3. Validationの構築」までをある程度やり切ることができる方にとって、自分の「守り」の技術を高めるのに大いに役立つ一冊になると思います。言い換えると、ある程度は力のある方が、「攻め」の特徴量エンジニアリングをして金メダル争いをしていくための下支えになるような書籍だと感じました。

冒頭で紹介したばんくしさんの記事で「Kaggle Expertくらいの人は買えば」とありました。私の説明も、細かい部分から議論していった結果として、似たようなところに落ち着いた印象があります。

自分自身は現状、本書のズバリ対象読者となるくらいの実力です(Kaggle Expert)。本書を読み進めながら、金メダル争いができるようなレベルまで精進していきたいと考えています。

おわりに

本記事では『機械学習のための特徴量エンジニアリング』の発売に寄せて、以下の3点を述べました。

  1. Kaggleの自分流のワークフローと「特徴量エンジニアリング」の位置づけ
  2. 本書がKaggleのワークフローのどの部分に寄与するか
  3. Kaggle観点で本書をどういう方にオススメするか

非常に長い文章になってしまいましたが、Kaggleにおける「特徴量エンジニアリング」の位置づけや、本書の購入に向けた判断材料をお伝えできていれば幸いです。

*1:KernelをVote数でソートして探します

*2:探索的データ分析は、英語だと「EDA(Exploratory Data Analysis)」と表現されるのが一般的です

*3:大抵のコンペでは、CVとPublic LBのスコアを各々が比較しているdiscussionが立ちます

*4:英語だと↓のスライドが有名です