Kaggleでさらっと機械学習をお試ししてみる

この記事は[PONOS Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ponos)の23日目の記事です。
![Kaggle_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356727/ad4ecdd3-2c95-cc2f-be82-7a4da3df1963.png)
# はじめに
この記事は面倒くさい準備作業を省いて手っ取り早く機械学習をお試しすることを目的としています。
詳しい手法の解説や問題の解法などには触れません。
# Kaggleに登録
まずは[Kaggle](https://www.kaggle.com/)(カグル)に登録しましょう。
Kaggleは世界中のデータサイエンティストや機械学習エンジニアたちが日夜鎬を削っているプラットフォームです。
web上でpythonの実行環境が用意されており、必要なライブラリや学習データもすべてそろっているのでローカルに環境構築をしなくてもすぐお試しができます。
# タイタニック号沈没事故のデータを使ってお試し
Kaggleでは日々コンペが開かれており、色々なデータに触れることができます。
今回は開催中のコンペではなくチュートリアルとして常時開かれている[Titanic: Machine Learning from Disaster](https://www.kaggle.com/c/titanic)を使用します。
このコンペの目的はタイタニック号の乗客名簿（名前、年齢、性別、客室クラスなど）と生存したかどうかを学習データとして、生存情報のない乗客が生存したかどうかを判定することです。
### コンペに参加する
Join Competitionを押すと参加できます。
### Notebookを作る
Notebooksタブに移動してNew Notebookを押すと作成できます。
設定画面に移動します。デフォルトのままで良いのでそのままCreateを押します。
### データを見る
まずは学習するデータを見てみます。
最初から書かれているコードを消して以下のコードを書きます。

```python:cell1
import pandas as pd
```

ctrl+enterを押すか、左側の再生ボタンを押すとそのセルの内容を実行できます。
ここではライブラリを読み込んでいるだけなので何も変化は起こりません。
bを押すか、セルの下側に表示される+codeを押して新しいセルを追加して以下のコードを書きます。

```python:cell2
train = pd.read_csv('../input/titanic/train.csv')
test = pd.read_csv('../input/titanic/test.csv')
passenger_id = test.PassengerId # 提出用に保存しておく
train.head(3)
```

実行してテーブルが表示されたら成功です。今回はこの中からSurvived, Pclass, Sex, Age, SibSp, Parch, Fare, Embarkedを使用します。

```python:cell2
train = train.iloc[:, [1, 2, 4, 5, 6, 7, 9, 11]]
test = test.iloc[:, [1, 3, 4, 5, 6, 8, 10]]
```

### データを整形する
学習するためには数値データが必要なので、データを整形していきます。
まずデータ欠損を補修します。
train.Age, train.Embarked, test.Age, test.Fareは欠損しているデータがあるのでこれをいい塩梅の数値で埋めます。今回はEmbarkedはS、他は中央値で埋めます。

```python:cell2
train.Age = train.Age.fillna(train.Age.median())
train.Embarked = train.Embarked.fillna('S')
test.Age = test.Age.fillna(test.Age.median())
test.Fare = test.Fare.fillna(test.Fare.median())
```

次にSex, Embarkedをワンホットエンコーディングで数値に変換します。

```python:cell2
train = pd.get_dummies(train)
test = pd.get_dummies(test)
```

最後にAgeとFareを離散値に変換します。numpyを使用するのでライブラリを読み込みます。

```python:cell1
import numpy as np
```

```python:cell2
train.Age = np.digitize(train.Age, bins=[10, 20, 30, 40, 50])
train.Fare = np.digitize(test.Fare, bins=[10, 20, 30])
test.Age = np.digitize(train.Age, bins=[10, 20, 30, 40, 50])
test.Fare = np.digitize(test.Fare, bins=[10, 20, 30])
```

### 学習する
今回はランダムフォレストを使います。少しずつ違う決定木を学習させてそれらを平均する手法です。
まずライブラリ(scikit-learn)を読み込みます。

```python:cell1
from sklearn.ensemble import RandomForestClassifier 
```

先ほどの学習データのSurvivedを分離します。新しいセルを追加して以下のコードを書きます。

```python:cell3
X = train.iloc[:, 1:]
y = train.iloc[:, 1]
```

学習データの準備ができたので学習させていきます。

```python:cell3
forest = RandomForestClassifier(n_estimators=5, random_state=0)
forest.fit(X, y)
```

学習ができたのでテストデータを使って予測をします。

```python:cell3
predictions = forest.predict(test)
```

最後に予測結果をファイルに保存します。

```python:cell3
submission = pd.DataFrame({ 'PassengerId': passenger_id, 'Survived': predictions })
submission.to_csv('submission.csv', index=False)
```

### Kaggleに提出する
Commitボタンを押すとポップアップウィンドウが表示されます。
完了になったらOpen Versionボタンを押します。
新しく開いた画面のOutputの欄に先程保存したsubmission.csvとSubmit to Competitionボタンがあるのでこれを押します。
提出が完了するとスコアが表示されます。
0.76（1に近付くほど良いスコア）ぐらいになると思います。

# そして実際のコンペティションへ…
今回お試ししたように学習部分は大体ライブラリがやってくれます。
実際に大変なのは圧倒的にデータ成形部分でした（精度を出そうと思ったらもっと大変）。
こういった作業が得意な人は機械学習の道に足を踏み込んでみるのも良いかもしれません。