u++の備忘録

『Kaggle Ensembling Guide』はいいぞ【kaggle Advent Calendar 7日目】

本記事は、kaggle Advent Calendar 2018の7日目の記事です。

qiita.com

TwitterでこのAdvent Calendarに書く話題を募集したところ、次のようなリプを頂きました。

この話題については、私自身が記事を書くよりも、既にKaggleの一部界隈の人はご存知?の有名エントリ『Kaggle Ensembling Guide』があります。

https://mlwave.com/kaggle-ensembling-guide/

正直言って、これ以上のまとめを書くのは相当に骨が折れそうなので、今回は紹介記事という形にしたいと思います。(単なる日本語訳も需要がありそうですが、権利的な問題が把握できていないので、今回はやめておきます)

Kaggle Ensembling Guide

f:id:upura:20181206142601p:plain

『Kaggle Ensembling Guide』は、その名の通り、Kaggleにおけるensembling(アンサンブル)の技法を紹介している記事です。

機械学習における「アンサンブル」は、複数のモデル(学習器)を組み合わせることで精度の高いモデルを作成する手法を意味します。『Kaggle Ensembling Guide』では「サブミットファイルによるアンサンブル」や「Stacked Generalization」、「Blending」といった様々な技法について、具体例と合わせて紹介がなされています。

この記事単体でも十分に価値があるのですが、さらに素晴らしい点はGitHub上でコードが公開されていることです。このコードを用いて実際に手を動かすことで、より一層理解が深まると思います。

github.com

アンサンブルの威力

さすがにリンク2つの紹介では味気ないので、本記事では最後にアンサンブルの威力を示す例を2つ提示したいと思います。

三人寄れば文殊の知恵

1つ目の例は、『Kaggle Ensembling Guide』の冒頭から引用します。

ここでは、10個のyに対して、0か1の二値分類を考えます。

つまりは

(y_0, y_1, ... , y_9) = (0, 1, ... , 0)

のような予想をする問題です。簡単のため、以後は右辺の括弧内だけを取り出して次のように表現したいと思います。次の例は「 y_4 y_9のみで1と予想した」という意味です。

0000100001

さて、ここで正解が全て1であるような問題を考えます。

1111111111

この問題に対して、モデルA・B・Cがそれぞれ次のような予測をしたとしましょう。

モデルA = 80% accuracy
1111111100
モデルB = 70% accuracy
0111011101
モデルC = 60% accuracy
1000101111

単純に一番良いモデルを選んだ場合、モデルAを採用すれば80%の正解率を得られる状況です。しかし、ここでアンサンブルを使うと80%以上の正解率を出すモデルを得ることができます。

今回使うアンサンブルは、非常に単純な「多数決」の技法です。 y_0, y_1, ... , y_9のそれぞれで各モデルの予測を確認し、多数決で最終的な予測結果を導出します。

例えば y_0について、モデルAとモデルCは1を、モデルBは0を予測しています。そのため、最終的な予測結果は1とします。

同様に考えていくと、下記が最終的な予測結果です。

最終的な予測結果 = 90% accuracy
1111111101

なんと、基にした全てのモデルよりも高い正解率を得ることができました。

数式的な説明は『Kaggle Ensembling Guide』に記載があるので割愛しますが、それぞれのモデルの悪い部分を補完し合い、全体として良い予測結果が得られています。

「Avito Demand Prediction Challenge」(31stから9thへ)

2つ目は、先日開催された「Kaggle Tokyo Meetup #5」で発表された「Avito Demand Prediction Challenge」での事例を紹介します。

connpass.com

最終的には9位となったこのコンペについて、Koheiさんがアンサンブルに関して解法を説明しました。

単体モデルのベストスコアはprivate LBで31位相当でしたが、アンサンブルの技法の一つ「Stacked Generalization」を実施した結果、15位まで精度が向上したそうです。さらにpublic LBのスコアを用いて重みを計算し「Blenging」を実施した結果、最終的な9位のモデルが誕生したとのことでした。

詳細は発表資料をご覧いただければと思いますが、この「黒魔術」的な手法に会場は大いに盛り上がりました。

Twitterハッシュタグでも盛り上がりが観測できます。
togetter.com

おわりに

本記事では『Kaggle Ensembling Guide』と言う名エントリを紹介し、具体的なアンサンブルの威力も紹介しました。

アンサンブルはKaggleなどのコンペにおける最後の一押しとして、大きな成果を発揮する場合があります。時には「実際の業務には役に立たない」と批判される対象にもなるものですが、個人的には「良くも悪くも機械学習コンペの特徴」と言えるものの一つだと思っています。

英語ではあるのですが、ぜひお時間のあるときにご一読をお勧めしたいです。