u++の備忘録

「Sports Analyst Meetup #5」を開催しました #spoana

はじめに

「Sports Analyst Meetup #5」を開催しました。

spoana.connpass.com

発表資料

発表資料はこちらにまとまっています(今後、資料が公開され次第追加していきます)。

spoana.connpass.com

togetter

「#spoana」のハッシュタグが付いたツイートは、次にまとめました。

togetter.com

ロングトーク①「batter pitcher 2 vec」

大越拓実さん(株式会社ディー・エヌ・エー

本イベントの第1回開催時から、いつか発表してほしいと思っていた方です。このたび遂に実現して、本当に嬉しいです。

発表は2部構成で、前半では『マネーボール』に代表される野球でのデータ活用について、歴史を紐解きながら解説していただきました。そして後半は、具体的な「batter pitcher 2 vec」という技術について、手法の仕組みや応用事例を紹介していただきました。

後者はニューラルネットワークのEmbeddingに似た考え方で、多少理論的に高度な内容ではありましたが、個人的にはとても面白い内容でした。このように本来なかなか類似度などを議論できなかった概念が、技術の進展を経て定量的に扱えるようになってきたのは非常に興味深いなと感じています。

ロングトーク②「野球界でのシステム導入事例~IT企業としてのサポート~」

安田峻さん(ライブリッツ株式会社)

システム会社として野球界を支援しているライブリッツ株式会社の安田さんによる発表でした。

どのようなシステムを提供しているかから始め、データを活用して野球界をより良くする仕組みについての発表でした。自分のプレイ動画を確認できる機能が特に選手に使われているようで、更に高度な可視化や分析機能も提供しているとのことでした。データを横断的に共有できる基盤を作るのはスポーツ業界に限らず大切なことで、素晴らしい取り組みだなあと感じました。

とはいえ質疑応答でもありましたが、こういったシステムの費用対効果をどのように示すかはなかなか難しいなと考えさせられる面もありました。野球界へのIT支援の実情が垣間見えた気がして、とても良い発表でした。

LT

今回も多種多様な競技について、5〜10分のLTを11人の方に実施していただきました。多くの方々は資料を公開してくださっているので、ぜひご確認いただけると嬉しいです。

ご協力いただいた企業

本イベントに関して、株式会社ディー・エヌ・エーさまに会場をご提供いただきました。単に場所をお貸しいただくだけでなく、アジェンダに関する資料の準備など、イベント運営に関して綿密にお手伝いいただきました。

NTTコミュニケーションズ株式会社SpoLive事業グループさまには、懇親会スポンサーとして飲食代の補助をしていただきました。本日は懇親会の時間にラグビーW杯の決勝が実施されており、プロジェクターでSpoLiveの画面を投影してリアルタイムで試合経過を確認させていただきました。

心より、お礼申し上げます。

おわりに

本記事では、「Sports Analyst Meetup #5」開催のご報告をさせていただきました。今年2月に第1回を開催したSports Analyst Meetupは、今回で年内最後となります。いろんなお声を聞きながら、来年もより良い形で継続していきたいです。

全5回の振り返り記事は、また別の機会に執筆したいと考えています。

弊ブログの「Techブログスコア」を算出した

とある記事を見て、自分のブログも執筆数はそこそこあるので良い線行くのではないかと思って集計してみました。


「Techブログスコア」とは?

上述したブログによると「直近1年間の記事数」✕「はてなブックマーク件数の中央値+1」という式で計算されるスコアです。中央値に1を足しているのは、中央値が0になる媒体が多かったための補正とのことです。

本記事では、この計算式の是非の議論は別にして、弊ブログのスコアを計算してみます。

結果

スコアは「直近1年間の記事数」が120、「ブックマーク数の中央値+1」は2で、240となりました。上述したブログのランキングでは、第29位相当でした。

集計方法

Python3系を用いて、スクレイピングAPI呼び出しをしました。

具体的には、公式で提供されている「はてなブックマーク件数取得API」を叩きました。

developer.hatena.ne.jp

最初に、APIを叩くために必要なURLの一覧を取得します。「記事一覧ページ」をスクレイピングしました。

upura.hatenablog.com

その後、取得したURLの一覧をキーにAPIを呼び出し、はてなブックマーク件数を取得しました。

f:id:upura:20191029212723p:plain

取得したデータを集計すると、総記事数は120件、ブックマーク数の中央値は1でした。この結果を計算式に当てはめると、スコアが得られます。

おわりに

本記事では、弊ブログの「Techブログスコア」を算出してみました。ちょっと気になったことをサクッと集計・分析するのも楽しいですね。

ソースコードGitHubで公開しています。

github.com

「初手LightGBM」をする7つの理由

Kaggleなどのデータ分析コンペでテーブルデータを扱う場合、最近は取りあえずLightGBMを利用する場合が多いです。

本記事では、初手の機械学習アルゴリズムとして「LightGBM」*1を採用する理由を紹介します。あくまで2019年10月末時点での個人の主観なので、ご参考までにご覧いただければと思います。

初手としては、手の混んだ特徴量を作らずに、まずは何かしらの予測結果を生成したい場合も多いです。LightGBMは既存のデータセットを極力加工せずに利用するという観点で、特徴量エンジニアリングの負担を軽減してくれる特徴があります。理由1〜3は、これらの特徴によるものです。

  1. 欠損値をそのまま扱える
  2. カテゴリ変数の指定ができる
  3. 特徴量のスケーリングが不要

1. 欠損値をそのまま扱える

LightGBMは、欠損値を含む特徴量も入力として扱うことが可能です。

線形回帰モデルのロジスティック回帰などを用いる場合は欠損値を補完する処理が必要ですが、LightGBMを採用することでその処理を割愛できることになります。欠損値をどのように補完するかを考える時間を省略できる利点があります。

2. カテゴリ変数の指定ができる

LightGBMは、カテゴリ変数に対して特別な処理を自動的に実行してくれます。

機械学習のカテゴリ変数の一般的な処理としては、「One-Hotエンコーディング」と呼ばれる下図のような手法があります。

f:id:upura:20191029182246p:plain

一方で、One-Hotエンコーディングには、一つのカテゴリ変数が多くの値を取る場合に列数が増え過ぎてしまうデメリットがあります。

LightGBMでは「S、Q、C」を単に「0、1、2」という数値に変換しておき、カテゴリ変数として明示することで、そのまま扱うことが可能です。カテゴリ変数の処理に苦心する時間を省略できる利点があります。

import lightgbm as lgb


categorical_features = ['Embarked']

lgb_train = lgb.Dataset(X_train, y_train,
                        categorical_feature=categorical_features)
lgb_eval = lgb.Dataset(X_valid, y_valid, reference=lgb_train,
                       categorical_feature=categorical_features)

LightGBMが欠損値とカテゴリ変数を処理する内部の仕組みについては「lightgbm カテゴリカル変数と欠損値の扱いについて+α」*2で詳しく解説されています。

3. 特徴量のスケーリングが不要

LightGBMは、「決定木」を基にした機械学習アルゴリズムです。決定木では次の図のように、一つの特徴量に対し一つの閾値を定め、次々と条件分岐していきながら予測値を決定します。

f:id:upura:20191029182355p:plain

学習用データセットからは、どの特徴量で、どういう閾値で、どのように判定するかを学びます。ここで大切なのは閾値なので、ロジスティック回帰のように特徴量を標準化する処理は不要となります。

4. feature importanceが確認できる

LightGBMは、特徴量の重要度を計算する機能があります。特徴量の重要度を見ることで、次なる特徴量エンジニアリングの手を考えることが可能です。

fold_importance_df["importance"] = model.feature_importance(importance_type='gain')

5. 精度が出やすく最終的なモデルとして残る可能性が高い

LightGBMは過去のKaggleでの実績からも分かる通り、テーブルデータを扱う上で優秀な機械学習アルゴリズムです。最初からLightGBMを試しておくことで、手戻りの可能性を減らすことができます。

6. 比較的大きいデータも高速に扱える

LightGBMは、比較的大きなデータも高速に扱える利点があります。開発者の一人である大元さんの「PyData.Tokyo Meetup #21」*3での発表資料には、「LightGBMが特に力を入れる2つ」として次の点が挙げられていました*4

  1. 効率の良い並列化による学習の高速化
  2. 大規模なデータに適用できるメモリパフォーマンス

ひとまずの結果を得るために、学習を高速に終えてくれるのは非常に魅力的です。

7. 過去の経験からハイパーパラメータの勘所がある

こちらは個人的な理由ですが、LightGBMは過去にKaggleなどでの利用経験が多く、ハイパーパラメータの調整もある程度は勘所が付いています。先に紹介した大元さんの資料でも言及がある通り、LightGBMはハイパーパラメータのデフォルト設定があまりイケてないです。むしろ、ハイパーパラメータの知見がないとLightGBMの性能を十分に発揮できないかもしれません。

おわりに

本記事では、データ分析コンペでテーブルデータを扱う場合に初手の機械学習アルゴリズムとしてLightGBMを選択する理由を紹介しました。

Adversarial Validationを用いた特徴量選択

先日公開した「IEEE-CIS Fraud Detection」コンペの解法*1の中で、Adversarial Validationの考え方を用いた特徴量選択について何回か質問がありました。

本記事では、Adversarial Validationの考え方を用いた特徴量選択を解説します。

Adversarial Validationとは

以前に書いた自分の記事*2から抜粋します。

いつ使う?

  • TrainデータとTestデータの分布が異なる場合
  • → Trainデータから適切にValidationデータを作成するのが難しい
  • → Kaggleの場合、LocalCVとLBのスコアが一致しないなどの問題が生じる

解決策

  1. 「TrainデータかTestデータかを判定する分類器」を作る
  2. Trainデータを、Testデータに似ている順にソートする
  3. 似ている順に、Trainデータからデータを抽出し、Validationデータとする

Adversarial Validationを用いた特徴量選択

上述の通りAdversarial Validationは元来、優れた検証用データセットを構築するための手法ですが、応用方法の一つとして特徴量選択に利用する方法が提案されています。

『Kaggleで勝つデータ分析の技術』(技術評論社*3のp.295の「Author's Opinion」にも、次のような記述があります。

逆に手元のバリデーションとLeaderboardのスコアの整合性がとれない場合に、自身の作成した特徴量のどこに問題があるのかを探る意味で、adversarial validationを用いるという使い方もできるでしょう。

CPMPさんの「Microsoft Malware Prediction」の解法

Microsoft Malware Prediction」はPublic Leaderboardで2位だったチームがPrivate Leaderboardで1485位に転落するほど、PublicとPrivateの乖離が激しいコンペでした*4

そんな中で、GrandmasterのCPMPさん*5とGibaさん*6のチームは、Public17位&Private6位と、両者で上位に君臨しました。

f:id:upura:20191027203029p:plain

その際に彼らのチームが利用したのが、Adversarial Validationを用いた特徴量選択でした。公開されたDiscussion*7には、次のような記述があります。

With original data, it was easy to get auc over 0.98 for adversarial validation. With processed data it went under 0.7.

彼らは、Adversarial Validationの性能(ここではAUC)を0.98から0.7程度まで意図的に悪化させることで、PublicとPrivateでの特徴量が乖離している問題に対処していました。

振り返ると、Adversarial Validationの課題設定は「TrainデータかTestデータかの判定」でした。Adversarial Validationの性能が高いことは、TrainデータかTestデータかの判定が容易であること、つまりPublicとPrivateで特徴量が十分に乖離していることを意味します。

ここでAdversarial Validationの性能の悪化は、TrainデータかTestデータかの判定が難しいことを示します。特徴量の加工を通じてAdversarial Validationの性能を一定程度下げることで、PublicとPrivateでの特徴量が乖離している状態を緩和できる可能性があります。

具体的なやり方

特徴量の加工を通じてAdversarial Validationの性能を悪化させるには、特徴量の重要度の大きい特徴量を削除するという方法が考えられます。

Kaggleで頻繁に利用される「LightGBM」など、一部の機械学習アルゴリズムには学習・予測に寄与した特徴量の重要度を示す機能があります。ここで上位に来た特徴量はTrainデータかTestデータかの判定に寄与しています。一定数を取り除くことで、Adversarial Validationの性能は悪化します。

f:id:upura:20191027205358p:plain
画像は自分のブログ*8から引用

Adversarial Validationの考え方は最近のKaggleのテーブルデータコンペで頻繁に実践されるようになっており、例えばこのNotebook*9には学習・予測の実行、特徴量の重要度の表示などの一連の処理がまとまっています。自身で実施する際に、ソースコードが流用できるかと思います。

単に削除するだけではなく、適切に変換するという方法もあり得ます。

例えばカテゴリ変数で、時系列的な理由でTrainデータとTestデータで登場する内容が異なる場合を考えます。このとき、この特徴量をそのまま利用してしまうとTrainデータとTestデータを分割する要因になりがちです。こういった場合は「Frequency Encoding」などでカテゴリ変数を意味のある数値に変換するといった対応が考えられるでしょう。

おわりに

本記事では、Adversarial Validationの考え方を用いた特徴量選択を解説しました。

Adversarial Validationは私の理解では、Kaggleのような機械学習コンペディション起因で注目を集めている手法です。こういった実践的な手法を知れるのも、機械学習コンペディションの魅力の一つだと感じています。

「Kaggle Grandmasterに聞く!-トップデータサイエンティストの過去・現在・未来-」に登壇しました

データサイエンティスト協会 6thシンポジウム「Kaggle Grandmasterに聞く!-トップデータサイエンティストの過去・現在・未来-」に、モデレーターとして登壇しました。

www.datascientist.or.jp

私がGrandmasterのJackさん、Onoderaさんに質問する形式のパネルディスカッションでした。データサイエンティストの「過去・現在・未来」という大まかに3つの観点で議論を交わしました。

twitterで実況してくださった方の投稿は、togetterにまとめています。

togetter.com

Grandmasterのお二方とご一緒できて、非常に光栄でした。少しでもKaggleおよびGrandmasterの魅力をお伝えできていれば嬉しいです。

(僕もGrandmasterになるぞ……!)

Kaggle「IEEE-CIS Fraud Detection」コンペ参加録

Kaggle「IEEE-CIS Fraud Detection」コンペに個人で参加して、2485位でした。public lb スコアだと2800位程度の提出でshake upを狙ったのですが妥当な結果に終わった次第です。

本記事では、discussionに投稿した内容を基に、本コンペでの取り組みをまとめます。良い結果ではないですが、何かの教訓になればと思います。

IEEE-CIS Fraud Detection

本コンペの課題は、user の取引データを用いた Fraud(詐欺、不正)判定でした。正例に当たる Fraud の割合が少ない不均衡データで、評価指標は AUC*1 でした。

www.kaggle.com

私の取り組み

www.kaggle.com

本コンペには「train, test」「public lb, private lb」がそれぞれ時系列で分割されているという難しさがありました*2

f:id:upura:20191003131120p:plain
(引用:Public/Private LB test set split! | Kaggle

私はコンペに本格的に取り組み始めたのが終了2週間前くらいだったのもあり、public lbを追いかけないと決めていました。

最終の2サブは、保守的と挑戦的な2つのモデルです。

保守的なモデル

  • Features reduced through adversarial validation
  • Group K Fold
  • Rank averaging of 2 models (public lb: 0.9430)
    • LightGBM (public lb: 0.9432)
    • Catboost (public lb: 0.9359)

挑戦的なモデル

  • Features reduced through adversarial validation (Same)
  • Group K Fold (Same)
  • Rank averaging of 2 LightGBM (public lb: 0.9371)
    • Use all training data (public lb: 0.9432)
    • Use only training data of Dec 2017 (public lb: 0.8918)

Adversarial Validation

Adversarial Validation*3 を通じて、約150個の特徴量を削除しました。Adversarial Validation の AUC は1.00から0.83に減少しています。 「Microsoft Malware Prediction」のCPMPの解法*4を参照しました。

より具体的には、次の通りです。

  1. @kyakovlev が公開していた特徴量*5に、時間に関連する特徴量をいくつか追加
  2. @kingychiu の公開 Kernel*6 の設定を使用して Adversarial Validation を実行
  3. feature importance の高い特徴量を削除
  4. 手順2, 3を AUC が一定程度下がるまで繰り返す

手順2, 3は、合計で3回実行しました。

Models

評価指標が AUC だったので、アンサンブル手法として Rank averaging を利用しました。重みは「scipy.optimize.minimize」*7を使用して CV を最適化しました。

保守的なモデルでは、LightGBM とCatboost を利用しました。同じ特徴量を使っています。

LightGBMのハイパーパラメータは次の通りです。overfitting を回避する狙いがあります。Catboost はほぼデフォルトの設定です。

lgbm_params = {
    'objective': 'binary',
    'boosting_type': 'gbdt',
    'metric': 'auc',
    'n_jobs': -1,
    'learning_rate': 0.01,
    'num_leaves': 2**8,
    'max_depth': 8,
    'tree_learner': 'serial',
    'bagging_fraction': 0.7,
    'feature_fraction': 0.1,
    'colsample_bytree': 0.5,
    'subsample_freq': 1,
    'subsample': 0.7,
    'max_bin': 255,
    'verbose': -1,
    'seed': 777,
    'reg_alpha': 0.1,
    'reg_lambda': 0.1
} 

CV Strategy

@kyakovlev の公開 Kernel*8 同様、GroupKFold を利用しました。月ごとにgroup_idを振った分割になっています。

Challenging Model

探索的データ分析を通じて、private lb のデータセットには2018年12月のデータが多く存在すると分かっていました。

sns.distplot(a=test_transaction['TransactionDT'])

f:id:upura:20191004081058p:plain

そこで、2017年12月と2018年12月のデータ間では特性が類似していると考え、2017年12月のデータのみで LightGBM を学習してみました。public lb の結果は芳しくありませんでしたが、private lb で効果を発揮する可能性はあると信じ、アンサンブルに加えました。

学習データ数が少なくなっている分を補うため、Pseudo Labeling も用いています。具体的には、次のようにデータを水増ししました。

  • テストデータのうち、2018年12月のデータの予測値を検証
  • 予測値が0.7以上の場合は正例、0.005以下の場合は負例として追加

正例510件、負例43760件が追加されています。

おわりに

本記事では、「IEEE-CIS Fraud Detection」コンペの参加録をまとめました。

久々の Kaggle のテーブルデータコンペということで、個人で腰を据えて試行錯誤しながら取り組めたのは良かったと思います。上位の方々の解法で勉強します。

【書評】『Kaggleで勝つデータ分析の技術』(技術評論社)

限定の先行販売*1で紙版を入手した『Kaggleで勝つデータ分析の技術』(技術評論社)を読みました。なお電子版をご恵贈いただく予定です。

gihyo.jp

10月7日の発売を待たずして Amazon*2のベストセラー1位になるなど、注目を集めています。

f:id:upura:20190929113055p:plain

既に著者の一人である threecourse さんは、執筆者視点で見どころを紹介しています*3

本記事では一人の読者、そして Kaggler の視点で書評を記します。なお私は既に1年以上 Kaggle に取り組んでおり、一定程度の知識を有している視点からの書評になります*4

本書の魅力

本書の魅力をあえて3つ挙げるとすると、次の通りです。

  1. データ分析コンペのテーブルデータコンペに注力して書かれた「教科書」である
  2. 技法のみならず筆者および関係者の実体験に基づいた集合知言語化されている
  3. コードが公開されている

1. データ分析コンペのテーブルデータコンペに注力して書かれた「教科書」である

私の知る限り、これまでデータ分析コンペ(以降、簡単のため「Kaggle」と置き換えます)に注力して執筆された日本語の書籍はありませんでした。多くの方は、次のような英語や日本語で書かれた情報を断片的に集めながら、Kaggleに関する知見を蓄えてきたように感じています。

  • discussion に投稿された上位入賞者の解法
  • Kaggle Days や Kaggle Tokyo Meetup での発表資料
  • ブログ記事
  • Twitter や kaggler-ja での議論

Kaggle に限らない観点で言えば、広く機械学習全般を扱っている書籍や、特徴量エンジニアリングなど一部の話題に関する書籍は存在しました。

  • 『Machine Learning実践の極意』*5
  • 機械学習のための特徴量エンジニアリング』*6
  • 『前処理大全』*7

しかし、機械学習全般の話題は、Kaggle 特有のワークフローと必ずしも一致しません。また特徴量エンジニアリングは Kaggle のワークフローの中で非常に重要では有りつつも一部分に過ぎません*8

本書は、Kaggleのテーブルデータコンペに焦点を当てた、体系的かつ網羅的な教科書になっています。異様なほど細かい粒度で書かれた目次を見ると、その網羅性が理解できるかと思います。

章立ては次の通りです。

  • 第1章 分析コンペとは?
  • 第2章 タスクと評価指標
  • 第3章 特徴量の作成
  • 第4章 モデルの作成
  • 第5章 モデルの評価
  • 第6章 モデルのチューニング
  • 第7章 アンサンブル

いずれも、機械学習教師あり学習モデルを扱う上で大切な話題がまとまっています。本書が特徴的なのは、これらの話題の全てが「Kaggleで勝つ」、すなわち「未知のデータセットに対する汎化性能を上げる」という目的のもとで執筆されている点です。

例えば、第2章の「タスクと評価指標」は一般的な書籍ならば一通りの数式や特徴を解説したところで終わりがちですが、本書ではより具体的に次のような話題を取り上げています。

  • 機械学習アルゴリズムで最適化する指標と、実際に目的となる指標の違い
  • コンペ特有の「カスタム評価指標」の扱い方(xgboost のコードの提示)
  • 評価指標を最適化するための閾値の決め方
  • 過去コンペでの実例の紹介

第3章の「target encoding」や第7章の「スタッキング」などは、近年の Kaggle では定石の一つとなりつつも、書籍の形で掲載されている例はほとんどないように思います。このような Kaggle 観点で効果的な技法に紙幅を割き、時に図を交えながら丁寧に解説しているのは本書の大きな魅力です。

第4章では、テーブルデータコンペでのニューラルネットの活用方法にも触れています。近年の Kaggle では画像・テキストコンペだけでなくテーブルデータコンペでもニューラルネットが解法の一つとして用いられています*9。第6章ではハイパーパラメータ調整の文脈で「hyperopt を用いた多層パーセプトロンのチューニング」の解説・ソースコードも掲載されていました。想像以上に新しい傾向を踏まえた内容で、正直なところ驚きました。

その他、随所に Kaggle の知見の体系化を試みている点も評価したいです。例えば第3章の「特徴量の作成」では、作成方法や性質に応じて次のように特徴量エンジニアリングを分類して解説しています。

  • モデルを意識した特徴量の作成
  • 欠損値の処理、数値変数の変換、カテゴリ変数の変換
  • 他のテーブルの結合、集約して統計量をとる
  • 時系列データ
  • 次元削減・教師なし学習
  • 特徴量を作るアイデア

これまで Kaggle に関する体系的な文献は多くなく、今回の執筆に当たっては著者らの多くの議論や試行錯誤があったように感じます。

2. 技法のみならず筆者および関係者の実体験に基づいた集合知言語化されている

本書の著者4名は、いずれも Kaggle の経験が豊富な方々です。

本書では「Author's Opinion」やコラムという形で、時に Kaggler の間でさえ議論が残る話題についても著者の見解が掲載されています。Kaggle では「理論的な根拠が不明瞭だが特定の場合には効果を発揮するとされる技法」や「機械学習の分野で著名ではあるが、あまり使われない技法」などが存在します。また「ハイパーパラメータのチューニング方法」など、明確な正解が存在しない話題への言及もあります。

こういった Kaggle 特有の「暗黙知」の明文化に取り組んでいる点で、非常に貴重な書籍と言えるでしょう。

暗黙知の収集に当たっては、過去の具体的なコンペを例に取りながら、discussionからKaggle Tokyo Meetupの発表資料まで、広く文献が引用されています。特徴量エンジニアリングやアンサンブルなどの話題ごとに、上位入賞者の知見が盛り込まれています。単純に読み物としても面白いですし、コンペで行き詰まった際にアイディアを求めるような使い方も考えられそうです。

3. コードが公開されている

本書では、Python のサンプルコードが随所に掲載されています。現時点では未公開ですが、GitHub リポジトリにて公開される予定の模様です。

Kaggle には「Kernel」と呼ばれる、ユーザが自身のソースコードを公開できるプラットフォームが存在します*10。世界中のデータサイエンティストが公開しているソースコードは非常に有益なのですが、一方で玉石混淆な面があるのも事実です。

本書に付属のソースコードには、次のような特徴があり、大いに有効活用できそうです。

  1. 書籍の解説と対応しているソースコードで、本文と照らし合わせて双方向で理解が深まる
  2. Kaggle で実績を挙げている著者らが実際に使っているソースコードである
  3. 本文だけでなくソースコードもレビューの過程を経ており、信頼性が高い
  4. コメントが日本語で付与されている

ソースコード絡みで言及すると、個人的には第4章の終わりに掲載されたthreecourseさんの「分析コンペ用のクラスやフォルダの構成」が興味深かったです。適度に抽象化された Model クラスや Runner クラスを作成しており、自分なりの機械学習プロジェクト設計を進める上で非常に参考になりました。

どんな人に本書はお勧めか

本書は、大きく次の2パターンの方々にお勧めできると思います。

  1. Kaggleに取り組んだ経験があり、更に上位を目指したい方
  2. 実務で機械学習教師あり学習モデルを扱っており、Kaggleの知見を取り入れたい方

Kaggleに取り組んだ経験があり、更に上位を目指したい方

前者は、まさに私も対象読者です。本記事で上述した通り、本書には Kaggle で役立つ話題が豊富に掲載されています。上位を目指すに当たって、非常に有用な書籍になっています。ある程度 Kaggle に取り組んできた経験がある方だと既に知っている話も少なくないかとは思いますが、本書を通じて自分の理解の「答え合わせ」ができる意味合いも大きいです。

また「知ってたつもり」の技法でも、いくつか意外な気づきもありました。例えば「out-of-fold」です。これは Kaggle で広く使われる有名なデータセットの分割方法ですが、閾値の最適化や特徴量生成など、思いのほか様々な場面で適用すべき可能性がある考え方だと認識を改めました。

第2章の「MCCのPR-AUCによる近似とモデル選択」や第6章の「ベイズ最適化およびTPEのアルゴリズム」など、これまで知らなかった・避けてきた数学的な議論を含んだ話もありました。新たに得た知見も多く、ぜひ次回以降の Kaggle で活用していきたいと考えています。本書全般に言えますが、Kaggle に実際に取り組んで試行錯誤や四苦八苦した経験がある人ほど、実感を持って楽しめる書籍になっていると思います。

実務で機械学習教師あり学習モデルを扱っており、Kaggleの知見を取り入れたい方

後者について、本書には一般の機械学習の技術書にはない技法も多く掲載されています。特に Kaggle 特有の「未知のデータセットに対する汎化性能を上げる」という観点では、特徴量エンジニアリングや機械学習モデルのチューニングなど、必ずしも理論立っていない暗黙知も含めて興味深い知見が得られるのではないかと思います。

実務に活かす観点では「第5章 モデルの評価」も魅力的です。私は業務でも機械学習を扱っていますが、Kaggle で得られた知見のうち最も役立っているのはモデルの評価方法(validation)だと思っています*11

Kaggleでは未知のデータセットに対する性能を競いますが、最終的な順位決定に使われる「private LB」は最後の最後まで公開されません。そのためコンペ開催中は、手元で構築した検証用データセットに対する性能などを参考にモデルの構築を進めていきます。

f:id:upura:20181225141445p:plain

ここで、如何にして信頼に足る検証用データセットを構築するかが、最終的に良い結果を得るために求められます。まともな検証用データセットがないと、モデルを明後日の方向に改善してしまう可能性があるためです。

この考え方は Kaggle のみならず実務でも同様に重要だと思います。最終的に欲しいのはデプロイ後の性能で、手元のデータセットでどれだけ高い性能が出ていても意味はありません。

本書では様々な検証用データセットの構築方法を、Kaggle の過去コンペも題材にしつつ取り上げています。特に時系列データの検証手法を厚く解説している点や、構築に当たって気を付ける点を議論している点が素晴らしいと思います。

あまりお勧めしない読者

強いて挙げるとすれば「これからKaggleに入門するぞ」という方には、情報量が多すぎて必ずしもお勧めできない気はします。

本書では以下の要素が前提となる基本的な知識として示されています。もちろん必要に応じて文章や図による補足が登場しており、数式など一部の記述は飛ばしても十分楽しめる内容ではあると思います。

  • Pythonとそのパッケージの使い方
  • 機械学習の基本的な考え方
  • 微分や行列演算の基本的な考え方

一方で本当の初学者の方だと「どこまでの情報は理解できなくても問題ないか」がなかなか独りでは判断しづらいかもしれません。より手軽に Kaggle に入門したいという意味合いだと、例えば『kaggleのチュートリアル*12などの同人技術誌も選択肢に入ってくるでしょう。手前味噌ながら、私もQiitaにKaggle入門用の記事を公開しています*13

もちろん本書にも、第1章で丁寧にデータ分析コンペの概要や Kaggle の一連の流れ、参加する意義などが端的にまとまっています。本書に掲載されている内容が理解できるように、目標立てて勉強を重ねていく使い方も考えられるでしょう。

本書の「本書で何を扱わないか」にも記載がありますが、機械学習の理論やアルゴリズムを知りたい方には、本書はお勧めしません。また Kaggle の中でも画像・音声・自然言語を扱う具体的な技法については、ほとんど取り扱っていません。画像・音声・自然言語を扱う具体的な技法は研究の進度がテーブルデータに比べて非常に速く、書籍として取りまとめるのはかなり難易度が高いと感じています。

threecourse さんは自身のブログで反省点として「xgboostを使って説明している」ことを挙げていましたが、第4章できちんと実装含め「LightGBM」と「Catboost」を紹介しているので、個人的にはそこまで気になりませんでした。ただしこれは私が勾配ブースティング系の機械学習アルゴリズムにある程度詳しいからこその捉え方になっているかもしれません。

おわりに

本記事では、10月7日の発売の書籍『Kaggleで勝つデータ分析の技術』を書評しました。

日本でも Kaggle が注目度を高めている中で、題目に「Kaggle」を冠した書籍が遂に出たかという思いがあります。Kaggle を題材に商用出版の書籍を執筆するのは、特に次の3点で難しさを感じます。個人的な見解ですが、これらが今までなかなか Kaggle 関連の書籍が世に出てこなかった理由になると思っています。

  1. 機械学習分野の発展に伴い、技術の変遷が激しい
  2. 当然ながら「何にでも効く」技法は存在しないので、書きぶりが難しい
  3. 自分で Kaggle をする方が楽しい

「Kaggleで勝つデータ分析の技術」の公開は、著者自身が Kaggle で勝つ可能性を下げている点にも言及したいと思います。多くの時間を割いて難易度の高い書籍を執筆し、知見を共有してくださった著者の方々に深く感謝するとともに、本記事の結びとします。

f:id:upura:20191002142843p:plain

*1:

*2:https://www.amazon.co.jp/dp/4297108437

*3:threecourse.hatenablog.com

*4:kaggle.com

*5:book.impress.co.jp

*6:www.oreilly.co.jp

*7:gihyo.jp

*8:upura.hatenablog.com

*9:

www.slideshare.net

*10:www.kaggle.com

*11:

*12:note.mu

*13:qiita.com