Kaggle事始め

## はじめに

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

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

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


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

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



## Kaggle Accountを作成しSign inする
まず、Kaggle上のAccountを作成してSign inする必要が有ります。[ここからKaggle Accountを作成します](https://www.kaggle.com/account/login)。GoogleやFacebookなどのAccountでSocial loginさせる事も可能です。

![login.png](https://qiita-image-store.s3.amazonaws.com/0/67592/a0d1d57f-4044-3f45-d3cb-7406c6c12f9d.png)



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

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

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

![competition.png](https://qiita-image-store.s3.amazonaws.com/0/67592/adaa3f87-3abd-975e-54f6-ad23b4c5dc8a.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](https://qiita-image-store.s3.amazonaws.com/0/67592/2a75e472-24b7-788d-c1f3-2fc05d5fcac9.png)



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

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

![dataset.png](https://qiita-image-store.s3.amazonaws.com/0/67592/5ab9d2dd-db37-732f-93b0-704dfc09d870.png)


## Competitionで計算すべき内容を理解する
Dataset fileをDownloadしたので、2つのfileの中身を簡単に解説しておきたいと思います。csvを開いてみてください。

**train.csv**

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

**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](https://qiita-image-store.s3.amazonaws.com/0/67592/387a68e8-202c-4e25-b7e4-2a817a2d30dc.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`に書きだしています。

`pandas`, `scikit-learn`が必要なので、未だの場合は事前に`sudo pip install pandas scikit-learn`を実行してlibraryをinstallして下さい。

```py
import pandas as pd
import csv as csv
from sklearn.ensemble import RandomForestClassifier

# Load training data
train_df = pd.read_csv("train.csv", header=0)

# Convert "Sex" to be a dummy variable (female = 0, Male = 1)
train_df["Gender"] = train_df["Sex"].map({"female": 0, "male": 1}).astype(int)
train_df.head(3)

# Complement the missing values of "Age" column with average of "Age"
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

# remove un-used columns
train_df = train_df.drop(["Name", "Ticket", "Sex", "SibSp", "Parch", "Fare", "Cabin", "Embarked", "PassengerId"], axis=1)
train_df.head(3)

# Load test data, Convert "Sex" to be a dummy variable
test_df = pd.read_csv("test.csv", header=0)
test_df["Gender"] = test_df["Sex"].map({"female": 0, "male": 1}).astype(int)

# Complement the missing values of "Age" column with average of "Age"
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

# Copy test data's "PassengerId" column, and remove un-used columns
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)

# Predict with "Random Forest"
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)

# export result to be "titanic_submit.csv"
submit_file = open("titanic_submit.csv", "w")
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](https://qiita-image-store.s3.amazonaws.com/0/67592/5b76707a-e07a-d2a0-6f27-d47e231ae4eb.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 Language`、`All Output Types`、`Hotness`などのPull downを変更して、参考になるScriptを探してみて下さい。

![scripts.png](https://qiita-image-store.s3.amazonaws.com/0/67592/93394a6b-c5a2-c8a3-068f-bfca69dff9f5.png)

#### **上位入賞者のテクニック**
Kaggleでは、自分が使った手法やCodeそのものを開示する事は必須ではありませんが、大きなCompetitionの上位入賞者は[Kaggleの公式Blog](http://blog.kaggle.com/)において、自己紹介と使った手法の概要紹介をするケースが良くあります。[公式BlogのWINNERS' INTERVIEWS](http://blog.kaggle.com/category/winners-interviews/)を見てみると、上位入賞者がどんなアルゴリズム/手法を使っているのかとても参考になります。


## 最後に
良いKaggle生活を！