Python
Kaggle

Kaggleに登録したら次にやること ~ これだけやれば十分闘える!Titanicの先へ行く入門 10 Kernel ~

事業会社でデータアナリストをしているu++です。

普段ははてなブログでKaggleや競技プログラミングの記事を定期的に書いていて、「Kaggle Tokyo Meetup」というイベントで登壇した経験もあります。

本記事では「Kaggleに登録したら次にやること」と題して、Kaggleに入門したい方に向けて次のようなコンテンツを掲載します。


  • Kaggleの概要

  • 環境構築不要な「Kernel」の使い方

  • 入門 10 Kernel


    • 1. まずはsubmit! 順位表に載ってみよう

    • 2. 全体像を把握! submitまでの処理の流れを見てみよう

    • 3. ここで差がつく! 仮説に基づいて新しい特徴量を作ってみよう

    • 4. 勾配ブースティングが最強?! いろいろな機械学習アルゴリズムを使ってみよう

    • 5. 機械学習アルゴリズムのお気持ち?! ハイパーパラメータを調整してみよう

    • 6. submitのその前に! 「Cross Validation」の大切さを知ろう

    • 7. 三人寄れば文殊の知恵! アンサンブルを体験しよう

    • 8. Titanicの先へ行く①! 複数テーブルを結合してみよう

    • 9. Titanicの先へ行く②! 画像データに触れてみよう

    • 10. Titanicの先へ行く③! テキストデータに触れてみよう



  • メダルが獲得できる開催中のコンペティションに参加しよう

  • さらなる学びのために

Kaggleの入門というと、チュートリアルとして用意されている「Titanic : Machine Learning from Disaster」が有名です。今回も最初はTitanicを題材に話を進めます。しかし個人的には、メダルが獲得できる開催中のコンペティションに参加してこそ、歴戦の猛者たちと切磋琢磨することができ、学びや楽しみも大きいのではないかと感じています。

本記事を経て、少しでも多くの方が開催中のコンテストに参加してくださったら嬉しいです。なお本記事執筆の背景はポエム要素を含むので、はてなブログに掲載予定です。


Kaggleの概要

Kaggleとは、主に機械学習モデルを構築するコンペティションのプラットフォームです。

image.png

(DeNAでデータサイエンスチーム(通称Kaggle枠)のマネージャを務める原田さんの資料より引用)

キスモ取締役の大越さんの資料も、Kaggleとは何かが簡潔にまとめられています。原田さんの資料と合わせて、最初にご覧いただくのがオススメです。


環境構築不要な「Kernel」の使い方


Kernelとは?

Kaggleには、Kernelと呼ばれるブラウザ上の実行環境が用意されています。言語としては現在、Python3とRが対応しています。それぞれScript形式かNotebook形式を選択可能です。

image.png

Kernelには、機械学習モデルの構築に必要なさまざまなパッケージがあらかじめインストールされており、初心者がつまづきやすい環境構築が必要ありません。RAMは16Gあり、GPUも使用可能です。一般的なノートパソコン以上の性能が自由に使える環境が整っています。

image.png

本記事では、このKernelを用いたKaggle入門コンテンツを提供します。

自分で手を動かしながらKaggleのエッセンスを学べるような10つのKernelを用意しました。

言語としてはPython3、形式はNotebookを選択します。


Kernelの使い方

ここでは、Kernelの具体的な使い方を解説します。

次の章にある「1. まずはsubmit! 順位表に載ってみよう」のリンクをクリックして、作業してみてください。

リンクを開くと、次のようなKernelのページが開きます。まずは右上の「Fork」をクリックしてください。

image.png

すると、自分で編集できる画面に遷移します。ForkしたKernelは元のKernelとは別物なので、自分の好き勝手に編集して問題ありません。

image.png

Kernelは「Public」「Private」という公開設定があります。現在の状況は右のサイドバー>Settings>Sharingから確認できます。例えば、私のKennelは皆さんに使ってもらうために「Public」になっています。デフォルトは「Private」なので、意図的に操作しない限りは「Public」にはなりません。安心して自由に記述することが可能です。

Kernelはいくつものセルに分割されています。セルには2種類あり、1つは説明文などを記述する「Markdown」、もう1つはPythonのコードを記述する「Code」です。次の写真で言うと、上のセルがMarkdown、下のセルがCodeです。

image.png

セルは自由に追加・削除ができます。新規追加は上の画像で出ている「+Code」「+Markdown」から可能で、移動・削除はセルを選択した状態でメニューバーの「Edit」「Insert」から操作できます。

Codeセル内でSHIFT+ENTERすると、個々の単位でプログラムを実行できます。段階的にプログラムを処理できるので、個々のセルで何が起きているかが理解しやすいかと思います。

Kernelの操作方法やショートカットなどは、Jupyter Notebookとほぼ同様です。さらなる便利な使い方の詳細が知りたい場合は「Jupyter Notebook 使い方」などで調べると良いでしょう。


入門 10 Kernel

ここでは、自分で手を動かしながらKaggleのエッセンスを学べるような10つのKernelを掲載します。

本記事内では理論的な面を解説し、各テーマに対応するKernelで実践していただく構成になっています。本記事を読むだけでも理解できるような構成にしていますが、ぜひKernelをForkしてご自身で操作してみてください。

現在、最初の2つのKernelを公開しています。今後、随時更新予定です。


1. まずはsubmit! 順位表に載ってみよう

このKernelでは、Kaggleでのsubmitの方法を学びます。

Kaggleでは、いくつかの方法で自分が作成した機械学習モデルの予測結果をsubmit可能です。(Kernel経由でしかsubmitできないコンペティションも存在します)


  • Kernel経由

  • csvファイルを直接アップロード


  • Kaggle APIを利用

今回は、Kernel経由でsubmitしてみましょう。

このKernelにはいろいろなセルが含まれていますが、一旦は何も考えずに右上の「COMMIT」をクリックしてみてください。

次のような画面が立ち上がり、Kernel全体が実行されます。

image.png

実行が終わったら「Open Version」をクリックしましょう。

image.png

実行されたKernelの情報が表示されています。KernelはCOMMITするごとに、自動的にバージョンが管理されます。

image.png

左の「Output」タブを押すと、このバージョンのKernelでの予測結果が「submission.csv」というファイルで保存されています。

image.png

「Submit to Competition」を押すと、このファイルがsubmitされます。スコアが計算され、今回の場合は「0.66507」という値が算出されています。

image.png

無事にスコアが付いたので、順位表にも自分のアカウントが登場しました。

image.png

このKernelでは、Kernel経由でsubmitする方法を学びました。「Output」タブから「submission.csv」をダウンロードすることも可能なので、csvファイルを直接アップロードする方法も試してみてください。

なおKaggle APIを利用してsubmitする方法に興味があれば、こちらのブログなどをご覧ください。


2. 全体像を把握! submitまでの処理の流れを見てみよう

このKernelでは、前回は一旦無視したKernelの処理の流れを具体的に見ていきます。ぜひ、実際に一番上からセルを実行しながら読み進めてみてください。

具体的な処理の流れは、次のようになっています。


  1. パッケージの読み込み

  2. データの読み込み

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

  4. 機械学習アルゴリズムの学習・予測

  5. submit(提出)


パッケージの読み込み

import numpy as np

import pandas as pd

まずは、以降の処理で利用する「パッケージ」をimportします。 パッケージをimportすることで、標準では搭載されていない便利な機能を拡張して利用できます。

例えば次のセルでimportするnumpyは数値計算に秀でたパッケージで、pandasはTitanicのようなテーブル形式のデータを扱いやすいパッケージです。

ここでは、最初に必要な2つのパッケージをimportしています。importはどこで実施しても構いません。(特にScript形式の場合は、冒頭でのimportが望ましいです)


データの読み込み

ここでは、Kaggleから提供されたデータを読み込みます。

まずはどういうデータが用意されているかを確認しましょう。詳細はKaggleのコンペティションのページの「Data」タブに記載されています。

train = pd.read_csv("../input/train.csv")

test = pd.read_csv("../input/test.csv")
gender_submission = pd.read_csv("../input/gender_submission.csv")


  • 「gender_submission.csv」は、submitのサンプルです。このファイルで提出ファイルの形式を確認できます。仮の予測として、女性のみが生存する(Survivedが1)という値が設定されています。

  • 「train.csv」は機械学習の訓練用のデータです。これらのデータについてはTitanic号の乗客の性別・年齢などの属性情報と、その乗客に対応する生存したか否かの情報(Survived)が格納されています。

  • 「test.csv」は、予測を実施するデータです。これらのデータについてはTitanic号の乗客の性別・年齢などの属性情報のみが格納されており、訓練用データの情報を基に予測値を算出することになります。


    • 「train.csv」と比較すると、Survivedという列が存在しないと分かります。(この列があったら全て正解できてしまうので当然ですね)



これらは、Kaggleから提供された大元のデータです。

image.png

例えばName, Sexなどは文字列で格納されており、そのままでは機械学習アルゴリズムの入力にすることはできません。 機械学習アルゴリズムが扱える数値の形式に変換していく必要があります。

Nanというのは、データの欠損です。こうした欠損値は、一部の機械学習アルゴリズムではそのまま扱うこともできますが、平均値など代表的な値で穴埋めする場合も多いです。


特徴量エンジニアリング

次のような処理を「特徴量エンジニアリング」と呼びます。


  • 読み込んだデータを機械学習アルゴリズムが扱える形に変換

  • 既存のデータから、機械学習アルゴリズムが予測する上で有用な新しい特徴量を作成

前者について、例えばSexの'male', 'female'をそれぞれ0, 1に変換します。また欠損を平均値などで穴埋めする処理も行います。具体的な処理内容については、Kernelを参照ください。

後者については、次のKernel「3. ここで差がつく! 仮説に基づいて新しい特徴量を作ってみよう」で詳しく掘り下げていきます。

大元のデータから次のようなデータを作成するイメージになっています。

image.png

特徴量エンジニアリング後のデータを、より一般化して表現したのが、次の図です。

image.png

大元のデータから特徴量エンジニアリングを経て、X_train, y_train, X_testというデータの塊を作ります。大雑把に表現すると機械学習は、X_train, y_trainの対応関係を学習し、X_testに対応する(隠された)y_testの値を当てるという枠組みになっています。


機械学習アルゴリズムの学習・予測

用意した特徴量と予測の対象のペアから、機械学習アルゴリズムを用いて予測器を学習させましょう。

image.png

from sklearn.linear_model import LogisticRegression

clf = LogisticRegression(penalty='l2', solver="sag", random_state=0)
clf.fit(X_train, y_train)

ここではロジスティック回帰という機械学習アルゴリズムを利用します。

機械学習アルゴリズムの振る舞いはハイパーパラメータという値で制御されます。 LogisticRegression() の括弧内の値が該当します。ハイパーパラメータの調整方法については「5. 機械学習アルゴリズムのお気持ち?! ハイパーパラメータを調整してみよう」で詳しくみていきます。

学習を終えると、予測値が未知の特徴量(X_test)を与えて予測させることができます。

y_pred = clf.predict(X_test)

y_predには0か1の予測値が格納されています。


submit(提出)

最後に、Kernel経由でsubmitするために予測値を提出ファイルの形式に整えます。

sub = pd.DataFrame(pd.read_csv("../input/test.csv")['PassengerId'])

sub['Survived'] = list(map(int, y_pred))
sub.to_csv("submission.csv", index = False)

Kaggleの運営側はy_testの中身を把握しているので、y_testとy_predが比較され、自分の提出した予測値の性能がスコアとして返ってくる仕組みになっています。

このKernelでは、submitに向けたKaggleでの処理の流れを追いました。


3. ここで差がつく! 仮説に基づいて新しい特徴量を作ってみよう

1つ目のKernelでは、Kernelを用いてKaggleのコンペティションに提出して順位表に載る方法、2つ目のKernelでは全体の処理の流れを解説しました。

3〜7つ目のKernelでは、既存のKernelに手を加えていきながら、スコアを上げていく方法を学んでいきます。ここで紹介する方法は、メダルが獲得できる開催中のコンペティションにも汎用的に使えるものだと思っています。「このような方法でスコアを上げているんだな〜」と知り、自分でコンペティションに参加していく際の道標になればと考えています。

ここでは、特徴量エンジニアリングの部分で、スコアの向上を体験してみましょう。

さっそく特徴量エンジニアリングの解説を始めようかと思いますが、その前に前提的な話として、Kaggleに取り組む上で欠かせない「再現性」の話をします。


再現性の大切さ

「再現性がある」とは、何度実行しても同じ結果が得られることです。Kaggleで言うと、同一のスコアが得られると言い換えても良いでしょう。

再現性がないと、実行ごとに異なるスコアが得られてしまいます。今後、特徴量エンジニアリングなどでスコアの向上を試みても、予測モデルが改善されたか否かを正しく判断できなくなる問題が生じます。

実は、2つ目のKernelには再現性がありません。その原因は、Ageという特徴量の欠損値を埋める際の乱数です。ここでは標準偏差を考慮した乱数で欠損値を穴埋めしているのですが、この乱数は実行ごとに値が変わるようになってしまっています。

age_avg = data['Age'].mean()

age_std = data['Age'].std()

data['Age'].fillna(np.random.randint(age_avg - age_std, age_avg + age_std), inplace=True)

何度実行しても同じ値を発生させるためには、seedというものを固定すれば良いです。

np.random.seed(seed=777)

機械学習アルゴリズムの大半は乱数を利用するので、再現性を担保するためにはseedを設定しておかなければなりません。2つ目のKernelを振り返ると、機械学習アルゴリズムのロジスティック回帰のハイパーパラメータとして random_state=0 を与え、seedを固定していました。

clf = LogisticRegression(penalty='l2', solver="sag", random_state=0)

このようにKaggleを進めていく際には、きちんと再現性が取れていることを随時確認していきましょう。(なお、GPUを利用する場合など、どうしても再現性が担保できない場合もあります)


仮説から新しい特徴量を作る

仮説と可視化から新しい特徴量を作る Kaggleのタイタニックを例に」に書いたような内容を掲載予定です。


特徴量エンジニアリングの技法を学ぶ


4. 勾配ブースティングが最強?! いろいろな機械学習アルゴリズムを使ってみよう

これまでは機械学習アルゴリズムとして、ロジスティック回帰を採用していました。

ここでは、いろいろな機械学習アルゴリズムを紹介します。

現在のKaggleでよく使われているのは、勾配ブースティングという機械学習アルゴリズムの「LightGBM」というパッケージです。実際にKernelでLightGBMを使って学習・予測を実行し、スコアの変化を確認してみたいと思います。


5. 機械学習アルゴリズムのお気持ち?! ハイパーパラメータを調整してみよう

先にも説明したように、機械学習アルゴリズムの振る舞いはハイパーパラメータという値で制御されます。もちろん、ハイパーパラメータの値次第で予測結果は変わり得ます。

ハイパーパラメータの調整は、主に2種類の方法があると思います。


  • チューニングツールを使う

  • 手動で調整

前者としては、Grid search, Bayesian Optimization,Hyperopt, Optunaなど、いくつかのツールがあります。Kernelでは、これらの使い方を解説予定です。

ただし最近のKaggleのコンペティションでは、データサイズが大きいため上記のツールでのハイパーパラメータ調整が現実的な時間で終わらない問題もあります。また一般に、ハイパーパラメータでのスコアの上がり幅は特徴量エンジニアリングで良い特徴量を見つけた場合に劣るので、あまり時間をかけずに手動で微調整をする場合も多いように感じます。

チューニングツールを使うにせよ、手動で調整するにせよ、機械学習アルゴリズムをブラックボックス的に利用するのではなく、ハイパーパラメータを正しく理解することが非常に大切です。

LightGBMを利用する場合は、英語ですが公式のdocumentationの一読をオススメします。なお日本語の記事だと、例えばこちらにLightGBMなどの勾配ブースティングの主要なハイパーパラメータ解説がありました。


6. submitのその前に! 「Cross Validation」の大切さを知ろう

3〜5つ目のKernelでは、特徴量エンジニアリング・機械学習アルゴリズム・ハイパーパラメータの面で、スコアを上げていく方法を学びました。

これまでスコアの上昇は、実際にKaggleに提出することで確認していました。しかし実際には、Kaggleのコンペティションには1日のsubmit回数に制限があり、スコアが上がる保証もないのに気軽に提出するのは得策ではありません。

またメダルが獲得できるコンペティションでは、y_testの一部データのみがpublic LBに利用されておりスコアを随時確認できますが、最終順位は残りのprivate LBのデータに対する性能で決定します。

image.png

public LBで良いスコアが出ても、public LBのデータのみに過学習した結果の可能性があり、必ずしもprivate LBでの性能に寄与するかは分からないということです。

ここでは以上のKaggleのコンペティションに参加していく上での問題を踏まえて、訓練用データを用いて予測モデルの性能を測る「Cross Validation」という手法を解説します。

Cross Validationはなぜ重要なのか【kaggle Advent Calendar 3日目】」に書いたような内容を掲載予定です。


7. 三人寄れば文殊の知恵! アンサンブルを体験しよう

ここでは、機械学習における「アンサンブル」について解説します。アンサンブルとは、複数のモデル(学習器)を組み合わせることで精度の高いモデルを獲得する手法です。

『Kaggle Ensembling Guide』はいいぞ【kaggle Advent Calendar 7日目】」に書いたような内容を掲載予定です。


8. Titanicの先へ行く①! 複数テーブルを結合してみよう

Titanicでは訓練用データが「train.csv」という1つのcsvファイルにまとまっていますが、複数ファイルが用意されている場合も多いです。

例えば「Home Credit Default Risk」というコンペティションでは、次の図のような関係を持つ複数のファイルが提供されました。

image.png

(画像はHome Credit Default Riskの「Data」タブから引用)

個人的には、こういったコンペティションに直面した際のデータの扱い方が分からず、Titanicの次へ行く障壁の1つになっているのではないかと考えています。

ここでは、複数のファイルを結合して機械学習アルゴリズムに入力するためのデータを用意する方法を掲載予定です。


9. Titanicの先へ行く②! 画像データに触れてみよう

Kaggleのコンペティションで扱うデータは、大きく分けて次の3種類があります。


  • テーブルデータ

  • 画像データ

  • テキストデータ

Titanicのデータはテーブルデータに該当しますが、他のコンペティションでは画像データやテキストデータを扱う場合も多いです。

PetFinder.my Adoption Prediction」のように、3種類全てのデータを扱うコンペティションも存在します。テーブルデータとしてはペットの犬種や年齢、画像データとしてはペットの写真、テキストデータとしてはペットの説明文といった情報が提供されました。

image.png

9〜10つ目のKernelでは、それぞれ画像とテキストデータを扱う方法を解説予定です。


10. Titanicの先へ行く③! テキストデータに触れてみよう

ここでは、テキストデータを扱う方法を解説します。


メダルが獲得できる開催中のコンペティションに参加しよう


入門 10 Kernelで学んだこと


  • 1つ目のKernelでは、Kernelを用いてKaggleのコンペティションに提出して順位表に載る方法、2つ目のKernelでは全体の処理の流れを解説しました。

  • 3〜7つ目のKernelでは、既存のKernelに手を加えていきながら、スコアを上げていく方法を学びました。

  • 8〜10つ目のKernelでは、Titanicでは扱わない複数テーブルを結合する方法、画像・テキストデータを扱う方法を紹介しました。

(3つ目以降はKernelはまだ無いですが、Kernelで取り扱う内容には触れました。私のKernel準備が整う前に、ご自身で検索するなどして勉強することもできそうです)

タイトルにもある通り「これだけやれば十分戦える!」と言える内容になっているかと思います。ぜひ次は、メダルが獲得できる開催中のコンペティションに参加してみてください。


開催中のコンペティションを確認する

開催中のコンペティションの一覧は、KaggleのCompetitionsというページの「Active Competitions」で確認できます。それぞれのページでは具体的なコンペティションの内容が記載されています。

ただし、Titanicと同様のチュートリアル的なコンペティションなど、開催中でもメダルが獲得できないコンペティションもあるので注意が必要です。Kaggleでメダルが獲得できるコンペティションか否かは、トップページの「Tiers」部分の表記で確認できます。

例えば、メダルが獲得できるコンペティションでは、次のような表記です。

image.png

一方で、メダルが付与されないコンペティションでは、次のような表記になっています。

image.png

なお、Kaggleのコンペティションには、いくつかの分類があります。一概には言えませんが、ある程度この分類でもメダル獲得の可否が判断できます。


  • Common Competition Types


    • Featured

    • Research

    • Getting Started

    • Playground



  • Other Competition Types


    • Recruitment

    • Annual

    • Limited Participation



こちらの分類の日本語訳は、こちらで解説されています。


初心者にオススメの戦い方

ここでは参加するコンペティションが決まった後、初心者にオススメの戦い方を書いておきます。tkm2261さん流のKaggle入門方法にも、似たような内容が記載されています。


  1. ベースラインとなるKernelを探す

  2. 本記事の内容を参考に、ベースラインを改善する


ベースラインとなるKernelを探す

今回は「Santander Customer Transaction Prediction」を例に解説します。

まず「Kernels」タブに行き、右のプルダウンで「Most Votes」を選びましょう。

image.png

すると、参加者に多く「いいね」された順にKernelが表示されます。

image.png

0.9, 0.901 など数字の数字は、そのKernel経由でsubmitされスコアが付いていることを意味します。稀に、csvファイルでのアンサンブルのみを実施しているKernelが上位に来ているのは注意が必要です。きちんと、Kaggleから提供された大元のデータからsubmitまでの一連の流れを実行しているKernelをベースラインとすると良いでしょう。

最上位のKernelはタイトルに「EDA」と入っています。これは「Explanatory Data Analysis」、日本語だと「探索的データ分析」を意味します。これらのKernelは、提供されたデータの特徴などを解説してくれており、ベースラインとして適していると思います。


本記事の内容を参考に、ベースラインを改善する

ベースラインのKernelが決まったら、本記事の入門 10 Kernelと同様に、KernelをForkして自分で手を動かしてみてください。

例えば特徴量エンジニアリングで新しい特徴量を追加したり、機械学習アルゴリズムを差し替えたり、ハイパーパラメータを調整したり、アンサンブルをしてみたり、いろいろな手数があるかと思います。自分のアイディアでスコアが増減する経験を楽しんでみてください。

できれば、自分が取り組んだコンペティションには終了日まで継続して取り組んでみてほしいです。Twitterのタイムラインなどで一喜一憂したり、終了後に共有される上位者の解法から多くのことを学んだり、Kaggleの醍醐味が味わえるかと思っています。

その意味では、締切2週間前くらいのコンペティションに参加するのも1つの手だと思います。(コンペティションの参加は締切1週間前に締め切られる点には注意してください)


さらなる学びのために

最後に、さらなる学びに向けたリンクをいくつか掲載します。


kagger-ja slack

主に日本人のKagglerが集まっているSlackのワークスペースです。質問が飛び交うチャンネルやコンペティションの解法を共有するチャンネルなどが活発で、参加して閲覧しているだけでも多くの知見が得られると思います。メールアドレスをフォームに入力するだけで、誰でも参加可能です。

過去ログはこちらで公開されています。


kaggler-ja wiki

kagger-ja slackで話題になった内容などを体系的にまとめたページです。次のようなコンテンツがまとめられています。


  • kaggle初心者ガイド

  • なんでもkaggle関連リンク

  • よくある質問

  • 過去コンペ情報


Kaggle Tokyo Meetupの動画・資料

Kaggle Tokyo Meetupは、Kagglerが一堂に会すイベントです。上位に入賞した方が解法をプレゼンしたり、多種多様なLTがあったり、学びの多いイベントです。

過去5回開催されており、特に第4回は動画も公開されているのでオススメです。


tkm2261さんのKaggle入門動画

次のコンテンツが動画で用意されています。


  • Kaggleについて

  • Porto Seguroコンペについて

  • GCP立ち上げ(アカウント作ると付いてくる$300クーポン使用)

  • Bitbucketでgitリポジトリ作成

  • GCPの使い方

  • Ubuntuセットアップ

  • Anacondaセットアップ

  • Pythonコーディング (Pandas, scikit-learn, xgboost)

  • Gitの使い方

  • loggerの使い方

  • ロジスティック回帰

  • Cross Validation解説

  • Grid Search解説

  • xgboost解説

  • on hot encoding解説

  • Kaggleの提出方法

  • おまけ: 私の過去コンペのコードの解説


twitter Kaggle リスト

私が日々見ているKagglerを集めたtwitterのリストです。Kaggleに取り組む方々の日常から、さまざまな刺激を受けています。


おわりに

本記事では「Kaggleに登録したら次にやること」と題して、Kaggleに入門したい方に向けた情報を掲載しました。少しでも多くの方のお役に立てていれば幸いです。

Kaggle入門者に向けたより良いコンテンツになるよう、随時更新を重ねていきたいと思います。