kaggleコンペに参加してみた

#この記事は
機械学習を始めたばかりの素人がkaggleのcompetisionに参加するまでの記事です。
実際に参加してどういったことが学べたのか、書きたいと思います。

#kaggleとは
データサイエンティストが登録している世界最大のデータ解析コンペサイトです。
https://www.kaggle.com/
賞金も出ます。リクルートさんやメルカリさんもコンペ開催して一時期話題になってました。

#なんのコンペに参加するか
有名なタイタニック号の事故の生存率に参加します。
https://www.kaggle.com/c/titanic
データもここからダウンロードします。

#分析環境
MacBook Air (13-inch, Mid 2012) ←買い換えたい
python version3.6.3

##手順

###用意されてるデータ
ライブラリのimportとデータの中身を見ます。

```python3
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
import matplotlib.pyplot  as plt
import seaborn as sns
%matplotlib inline

df = pd.read_csv('train.csv')
df.head()
```
![スクリーンショット 2017-12-29 16.36.32.png](https://qiita-image-store.s3.amazonaws.com/0/44747/dec8bac2-8255-9e2a-f8b7-0c60a132ff74.png)

```python3
df.info()
```
![スクリーンショット 2017-12-29 16.42.09.png](https://qiita-image-store.s3.amazonaws.com/0/44747/1c3cd29c-3e19-98c0-5fb3-216c412a4034.png)

```python3
df.describe()
```
![スクリーンショット 2017-12-29 16.45.06.png](https://qiita-image-store.s3.amazonaws.com/0/44747/f0685a1f-421e-40ad-5009-54e5b4325f89.png)
countが列の数、meanが中央値、stdが標準偏差を表しています。
Ageの欠損値が多いよう。

↓以下は参考にデータの中身を可視化。

```python3
sns.countplot('Sex',data=df)
```
![スクリーンショット 2017-12-29 16.51.08.png](https://qiita-image-store.s3.amazonaws.com/0/44747/f3b62583-482e-b05b-35b5-6a9ec988684b.png)
男性多し

```python3
sns.countplot('Pclass',data=df)
```
![スクリーンショット 2017-12-29 16.51.57.png](https://qiita-image-store.s3.amazonaws.com/0/44747/16651ad0-6679-05e1-22b6-d7cf1b158c41.png)
3等の乗客が一番多い。

```python3
sns.countplot('Pclass',data= df,hue='Sex')
```

![スクリーンショット 2017-12-29 16.52.23.png](https://qiita-image-store.s3.amazonaws.com/0/44747/a7285019-3541-f56b-1339-b8084293c04a.png)
特に3等には男性が多い。女性は基本男性の配偶者の立場で乗船していたんだろうと推測。


```python3
df['Age'].hist(bins=80)
```
![スクリーンショット 2017-12-29 16.54.23.png](https://qiita-image-store.s3.amazonaws.com/0/44747/57da897a-6339-3572-fae7-852e4a83e089.png)
ヒストグラムで見ると20代〜30代の若者が多い。

```python3
plt.figure(figsize=(10,5))
sns.pointplot(x='Embarked', y='Survived',data=df, color='g')  
```
![スクリーンショット 2018-01-04 12.32.40.png](https://qiita-image-store.s3.amazonaws.com/0/44747/6d0fa9ba-33f0-01e6-f14b-7606cac6a089.png)
乗船した港と生存率。S港とC港では1.5倍の生存率の差がある。



```python3
sns.factorplot('Embarked','Survived', col='Pclass',data=df)
```
![スクリーンショット 2018-01-04 12.29.16.png](https://qiita-image-store.s3.amazonaws.com/0/44747/f06312bd-4c6e-644b-5384-b9672beb7197.png)
乗船した港と客室グレード、それに対する生存率。

###特徴量の設計
やっていることは
・Ageの欠損値を中央値に
・文字列を数値に変換
・予測値に関係なさそうな値を削除

```python3
df.Age = df.Age.fillna(df.Age.mean())
df = df.replace('male',0).replace('female',1).replace('C',0).replace('Q',1).replace('S',2)
df.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1, inplace=True)
df = df.dropna()
df_data = df.values
df.head(10)
```
![スクリーンショット 2017-12-29 16.56.57.png](https://qiita-image-store.s3.amazonaws.com/0/44747/7a944106-3f8b-380d-3d5f-c0468ede4b9e.png)


```python3
corrmat = df.corr()
corrmat
```
![スクリーンショット 2017-12-29 16.59.38.png](https://qiita-image-store.s3.amazonaws.com/0/44747/f16227fc-14f7-cc2d-7d9e-54fb356f20cb.png)
Pclass,Sex,Fareが特に相関ありそう。

##モデル作成
random forestを使います。
####random Forestとは？
多様なたくさん作り、それぞれ個別の木のアウトプットの多数決を取るアルゴリズムです。
下記図は決定木のイメージです。これの木の数と木の深さが予測精度を決める重要な要素になってきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44747/0995c697-4fae-51a1-17ad-0e18e3ec7371.png)


以下はモデル作成とkaggle提出用のcsv作成。

```python3
from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators =90)
forest = forest.fit(df_data[0::,1::],df_data[0::,0])

test = pd.read_csv('test.csv')
ids = test["PassengerId"].values
test.Age = test.Age.fillna(test.Age.mean())
test.Fare = test.Fare.fillna(test.Fare.mean())
test = test.replace("male",0).replace("female",1).replace("C",0).replace("Q",1).replace("S",2)
test = test.drop(["Name", "Ticket", "Cabin", "PassengerId"], axis=1)
test_data = test.values
submit = forest.predict(test_data)

import csv
submit_file = open("submit.csv", "w")
file = csv.writer(submit_file)
file.writerow(["PassengerId","Survived"])
file.writerows(zip(ids, submit.astype(np.int64)))
output_file.close()
```
これで出来ました。投稿出来ます。

##気になる順位は？
結果は、、、
予測精度0.75598
順位は9716中8713位でした！
低い！特徴量の設計とモデルも見直します。

#所感
・順位が表示されてやる気が出る。
・特徴量の設計からモデル作成して実際に予測するところまで出来て、データサイエンスの一通りの手順を学べる。
・色々なデータサイエンティストが投稿していて刺激を受ける。
・普通に楽しい

#参考
https://towardsdatascience.com/enchanted-random-forest-b08d418cb411