Kaggle事始め

  • 180
    いいね
  • 1
    コメント

はじめに

データ解析の情強な方なら、Kaggle はご存じだと思います。データ解析のSkillを競うCompetitionサイトで、与えられたテーマ(Dataset)に対して、世界中のデータ解析有識者が様々なデータ解析手法を駆使してより高い正答率(Score)を競い合う場所です。

が、Kaggleそのものは知っていても、どうやればKaggleに実際に参加できてランキングに加われるのかは知らない、と言う方は多いと思います。この記事では、とりあえずKaggleの何らかのCompetitionに参加して、解析結果をSubmitして、(その時点の)順位/Scoreを確認するまでの操作手順/流れをチラ裏したいと思います。

KaggleのWeb pageは色々な情報/Linkが詰まっているので、ぱっと見取っ付きにくいかもしれませんが、ポイントをつかめば参加してScoreを付けて貰う所まではとても簡単です。Scoreと順位が決まると俄然ヤル気が出てきますので、本記事がKaggleで色々挑戦するキッカケになれば幸いです。

大枠の流れ

本記事でチラ裏している手順は大きく以下の様になります。

  1. Kaggle Accountを作成しSign inする
  2. 参加したいCompetitionを決めDataset等をDownloadする
  3. Competitionで計算すべき内容を理解する
  4. Datasetを処理しSubmit用Dataを作成する
  5. Submitして順位とScoreを確定させる

Kaggle Accountを作成しSign inする

まず、Kaggle上のAccountを作成してSign inする必要が有ります。ここからKaggle Accountを作成します。GoogleやFacebookなどのAccountでSocial loginさせる事も可能です。

login.png

参加したいCompetitionを決めDataset等をDownloadする

Competitionを選ぶ

このページ、もしくは上のCompetitionsをクリックすると、Competitionの一覧が表示されます。開催されている(Activeな)Competitionは日々変わりますが、今回は下の方にあるTitanic: Machine Learning from Disasterに参加して見ましょう。

ご承知の様に、TitanicやIrisのDatasetは機械学習でとてもよく使われます。このCompetitionもKaggleの入門/Tutorialみたいな位置づけで、(たぶん)常にActiveなので、初めてTryしてみるには良いCompetitionだと思います。

competition.png

Competitionの詳細を確認する

Titanic: Machine Learning from Disasterをクリックすると、Competitionの詳細ページに飛びます。Competition固有の情報/操作は各詳細ページからLinkで辿れる様になっています。簡単に詳細ページにある各Link先の解説をします。

Data (もしくはGet the Data) :訓練/テストデータ, Submission用データのひな形などのDownloadページ
Make a submission:解析結果をSubmitしてScoreを付けて貰うページ
Submission Instructions:Submit用fileのformatなどの説明ページ
Forum/Scripts:ある意味一番重要なページです!Competitionの参加者からの情報共有ページで、ScriptやJupyter notebookそのものを上げている人も多く、とても勉強になります。
Leaderboard:CompetitionのScore/順位のページ。解析結果をSubmitすると自分の名前もここに載ります。

submission.png

DatasetをDownloadする

Get the Dataをクリックすると、DatasetのDownloadページに行きます。このページには、Dataset fileそのものと、fileの中の変数の説明やどんな解析をすれば良いかが書かれて居ます。

このCompetitionの場合、幾つかのcsvとpython scriptが置かれていますが、Submitにはtrain.csvtest.csvの2つがあれば最低限OKですので、この2つのfileをDownLoadして下さい。

dataset.png

Competitionで計算すべき内容を理解する

Dataset fileをDownloadしたので、2つのfileの中身を簡単に解説しておきたいと思います。csvを開いてみてください。

train.csv

  • 1行目はHeaderで、その後に891行 x 12列のデータのcsv
  • 1列目がPassangerId, 2列目がTitanicの事故で生存したかのFlag(Survived), 3列目以降が客の属性
  • 客の属性には、名前, 年齢, 性別, 船室クラス, 同乗した兄弟や子供などの人数など10個の属性データがある
  • 客の属性データの一部は欠損している (PassangerIdSurvivedは全て埋まっている)
  • いわゆる訓練用データ

test.csv

  • 1行目はHeaderで、その後に418行 x 11列のcsv
  • csvの構成は、train.csvとほぼ同等だが、Survivedの列だけ無い
  • いわゆるテスト用データ

という事で、train.csvの891名のデータからTitanicの事故で生存したかの2クラス分類器を作り、test.csvの418名のデータに対して生存したかの予測をすれば良い、という事が解ります。

左ペインのSubmission Instructionsをクリックすると、Submit用のFileの詳細formatのページに行きます。以下を読むと、解析結果としてsubmitすべきcsv fileは、header+418行で、PassengerIdとSruvivedの2列を持つべしという事が解ります。

submission_instruction.png

Datasetを処理しSubmit用Dataを作成する

DatasetをDownLoadして、計算すべき内容もわかったので、実際に分類器を作りSubmit用のFileを作ってみます。

以下、train.csvを使って予測器を作り、Submit用のcsv fileを作る超簡易Codeです。最低限の処理しかしていないので、予測の精度は高くないです。Codeの中身は、解説するまでも無いですが、Gender(SexをDummy変数化)/Age/Pclassの3つの変数からRandom Forestで予測器を作り、予測結果をtitanic_submit.csvに書きだしています。

import pandas as pd
import numpy as np
import csv as csv
from sklearn.ensemble import RandomForestClassifier

#訓練データの読み込み
train_df = pd.read_csv("train.csv", header=0)

# Sexをダミー変数に変換(female = 0, Male = 1)
train_df["Gender"] = train_df["Sex"].map( {"female": 0, "male": 1} ).astype(int)
train_df.head(3)

# 年齢の欠損値は、年齢の平均値で補完する
median_age = train_df["Age"].dropna().median()
if len(train_df.Age[ train_df.Age.isnull() ]) > 0:
    train_df.loc[ (train_df.Age.isnull()), "Age"] = median_age

# 学習に必要無い列を削除する
train_df = train_df.drop(["Name", "Ticket", "Sex", "SibSp", "Parch", "Fare", "Cabin", "Embarked","PassengerId"], axis=1) 
train_df.head(3)

#テストデータの読み込み, Sexをダミー変数に変換
test_df = pd.read_csv("test.csv", header=0)
test_df["Gender"] = test_df["Sex"].map( {"female": 0, "male": 1} ).astype(int)

# 年齢の欠損値は、年齢の平均値で補完する
median_age = test_df["Age"].dropna().median()
if len(test_df.Age[ test_df.Age.isnull() ]) > 0:
    test_df.loc[ (test_df.Age.isnull()), "Age"] = median_age

# テストデータのPassengerId列を退避させ、テストデータの不要な列を削除する
ids = test_df["PassengerId"].values
test_df = test_df.drop(["Name", "Ticket", "Sex", "SibSp", "Parch", "Fare", "Cabin", "Embarked","PassengerId"], axis=1) 
test_df.head(3)

#ランダムフォレストで予測
train_data = train_df.values
test_data = test_df.values
model = RandomForestClassifier(n_estimators=100)
output = model.fit(train_data[0::,1::], train_data[0::,0]).predict(test_data).astype(int)

#結果を"titanic_submit.csv"として書き出す
submit_file = open("titanic_submit.csv", "wb")
file_object = csv.writer(submit_file)
file_object.writerow(["PassengerId","Survived"])
file_object.writerows(zip(ids, output))
submit_file.close()

作成されたtitanic_submit.csvを開き、Submission Instructionsの内容に沿って居るか確認して下さい。

Submitして順位とScoreを確定させる

最後に、Submit用のFileをuploadして、Scoreと順位を確認します。

Make a submissionをクリックすると、そのCompetitioに初めてSubmitする場合 は、Competition Rulesのページがまず表示されます。このページの一番下にあるI understand and acceptをクリックするとSubmitが出来る様になり、Make a submissionのページに移動します。

Click or drop your submission hereをクリックして先ほど作成したtitanic_submit.csvを選択し、Submitをクリックすると、fileのuploadとScoreの計算が行われ、結果がLeader board上で表示されます。

submission.png

これにて、無事Submitが行われScoreが確定しました。最後にLeaderboardに行き、自分の名前が載っているか確認してみてください。

その他

Scoreの計算方法

Scoreの計算方法は、Evaluationに詳細が載っています。今回の事例の場合2クラス分類なので、Scoreは正しく予測ができた割合になり、数字が大きく1に近いほど良いScoreとなります (Your score is the percentage of passengers you correctly predict.)。

多クラス分類の場合は、multi-class logarithmic lossという評価手法が使われ、数字が小さく1に近いほど良いScoreになります。

Forum/Scriptsのページ

Forum, Scriptsのページには、世界中のデータ解析の有識者から様々なScriptなどが活発に共有され、とても勉強になります。個人的にはCompetitionそのものよりも重要だと思っていますし、Codingの参考にもなります。All LanguageAll Output TypesHotnessなどのPull downを変更して、参考になるScriptを探してみて下さい。

scripts.png

上位入賞者のテクニック

Kaggleでは、自分が使った手法やCodeそのものを開示する事は必須ではありませんが、大きなCompetitionの上位入賞者はKaggleの公式Blogにおいて、自己紹介と使った手法の概要紹介をするケースが良くあります。公式BlogのWINNERS' INTERVIEWSを見てみると、上位入賞者がどんなアルゴリズム/手法を使っているのかとても参考になります。

最後に

良いKaggle生活を!