KaggleのTitanic Tutorialをはじめてみる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/72501dc6-9353-25c8-c62f-9baab6f9f559.png)


今までKaggle関係のコードは見てきていたが、実際にKaggleのcompetitionsとしてやったことはなかったので、今回やってみた。

#1. Kaggle登録

まずはKaggleのサイトで登録だが、Googleアカウントで一瞬で終わった。

https://www.kaggle.com

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/baff56cb-fb0e-d880-1ddd-1006ab063014.png)



#2. Titanicチュートリアル

Kaggleへのアカウント登録が終わると、さっそくいろんなcompetitionsをやってみたくなるが、Kaggle入門者用のcompetitionsが3つほど並んでいたので、有名なタイタニック問題をやってみることにした。普通のcompetitionsは3か月程度の期間指定があるが、これらは常に挑戦出来る初心者用の問題として設置されている。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/fa636385-d9ef-117f-1462-55e419b17135.png)


タイタニックコンペのサイトを開くと、説明等の記載があり、端っこに[Join competition]があるので参加表明する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/771ab1ec-5590-42d5-1fc2-2b9f8ee7424b.png)

参加すると、[New Notebook]ボタンが現れ、ここでPythonコードを書いていく環境を使えるようになる。ここでゴリゴリ頑張っていってもよいが、タイタニックのチュートリアルがあるのを発見したので、まずはそっちをやってみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/bc6620f3-4a2c-df53-c499-ae4d0eac7d9d.png)



#3. Titanic チュートリアル

ALEXIS COOKさん（Googleの人？）という方が作っているTitanicのチュートリアルページがあるのを発見したので、最初はチュートリアル通りやってみて流れをつかむことにした。

https://www.kaggle.com/alexisbcook/titanic-tutorial

チュートリアルはKaggleアカウントの作り方から始まり、Titanic問題の簡単な予測結果をファイル出力して、KaggleへSubmitするところまではいっていた。

コードの中身はチュートリアル参照。

チュートリアルを終了して予測結果(submission.csv)をKaggleへ提出すると、My Submissionsというところで結果が表示される。ここではScore 0.77511となっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/29cdc941-ed3f-6829-44e6-194cc94fb2eb.png)

そして、Leaderboadにもその結果がランキングとして反映されている。ランキング表示されると、ついにKaggle始めたかという気になって地味にうれしい。
しかし予測モデルは完全にチュートリアルのコピーであり自分で考えてないので、次はほかの人がどんなモデル作っているのかを参考に考えていく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/af9b643c-92e1-c247-130b-7bc3473371e4.png)


チュートリアルでは、3時間のIntro to Machine Learning　を推奨していたので、また今度こっちもやってみる。

https://www.kaggle.com/learn/intro-to-machine-learning


#4. 実装の復習

チュートリアルやっているなかで、一部コードの意味が分からなかったので復習をしておく。

#4.1. pandasのget_dummies

データ処理をpandasを使って行っているが、get_dummiesという知らない関数があったので確認。

```python
train_data = pd.read_csv("/kaggle/input/titanic/train.csv")
features = ["Pclass", "Sex", "SibSp", "Parch"]
X = pd.get_dummies(train_data[features])
```

pandas.get_dummies は、pandasのリファレンスを見ると、カテゴリカル変数をダミー変数に変換する処理と書かれている。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html

カテゴリカル変数とは、性別（男、女）や、血液型（A、B、AB、O)などの計数データのことである。
機械学習の前処理として、こういうカテゴリカル変数を、０，１などで扱えるようにダミー変数を用意してフォーマット変換してくれる関数のようである。


変換前のtrain_data[]は、以下のように[Sex]という変数の中に、[male/female]が入っている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/09805a80-3ea6-fc22-bffd-4266d4d489b3.png)

これを変換して、[Sex_female][Sex_male]というダミー変数を作る処理である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/fe6cbb6b-53d9-2c04-b725-f396e1169749.png)

#4.2. Random Forestの使い方

次にScikit-learnのRandom Forestの使い方である。

```python
from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1) #モデル準備
model.fit(X, y)                                   #モデル学習
predictions = model.predict(X_test)              #予測

```

入力データXは、Titanicの元データから一部の列データ（ ["Pclass", "Sex", "SibSp", "Parch"]）に制限して、get_dummies()でカテゴリカル変数をSexをダミーに調整したデータ。教師データyは、そのデータに対応するSurviveデータである

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/e1fab975-02b6-88e9-ee5a-a8648e3f9590.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/08cdba28-4536-1a02-2f8e-d169a5019dec.png)

次に、以下がモデル構築部分であるが、引数のパラメータの意味が分からない。

```python
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1) 
```

scikit-learnのリファレンスを見てみると細かく説明があった。n_estimatorsは決定木の数。100がデフォルト。max_depthは、決定木の深さ。過学習になるから深すぎるのはよくないようである。
random_state では、決定木を構築するときに使用されるサンプルデータのランダム性を制御することができるようであるが詳細は不明。この辺りはパラメータを変えながら結果を見て理解したいところである。

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html


|Parameters  |default  |guide  |
|---|---|---|
|n_estimatorsint  |100  |The number of trees in the forest.  |
|max_depth  |None  |The maximum depth of the tree. If None, then nodes are expanded until all leaves are pure or until all leaves contain less than min_samples_split samples. 
|random_state|None|Controls both the randomness of the bootstrapping of the samples used when building trees (if bootstrap=True) and the sampling of the features to consider when looking for the best split at each node (if max_features < n_features). See Glossary for details.|