kaggleのtitanic問題に挑戦

[AidemyのPremiumPlan](https://aidemy-premium.net/)が完了しました。そこで、学習したことを参考にkaggleのtitanic問題に取り組んでみたいと思います。
kaggleとは何かについては他の記事に譲るとして早速内容に入っていきます。

まずはデータを読み込みます。

```python
import numpy as np
import pandas as pd
train = pd.read_csv("train.csv")
test  = pd.read_csv("test.csv")

train.head()
```

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/100978/b7bf9c89-4d0d-6127-ea13-e02f47f401d7.jpeg)

欠損値の数を確認します。

```python
train.isnull().sum()
```
```
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64
```

```python
test.isnull().sum()
```
```
PassengerId      0
Pclass           0
Name             0
Sex              0
Age             86
SibSp            0
Parch            0
Ticket           0
Fare             1
Cabin          327
Embarked         0
dtype: int64

```

いらないデータは削ってしまいましょう。

PassengerId：ただのIDなので削除
Suvived：目的変数なのでそのまま
Pclass：チケットのクラス。クラスによって生存率が変わるかもしれないため残しておく。
Name：名前によって生存率が変わるとは思えないので削除
Sex：性別。一応残しておく
Age：年齢。これも一応残しておく
SibSp：乗船していた兄弟と配偶者の数。家族を助けようとして助からなかったケースもあると考えられるので残す
Parch：乗船していた両親と子供の数。上と同様残す
Ticket：ただのIDなので削除
Fare：旅客運賃。チケットのクラスと同じ理由で残す
Cabin：欠損値が多すぎるため削除
Embarked：乗船場と生存率の関係性はわからないが一応残す

```python
del train['PassengerId']
del train['Name']
del train['Ticket']
del train['Cabin']

del test['PassengerId']
del test['Name']
del test['Ticket']
del test['Cabin']

train.head()
```

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/100978/e25a7c67-50b7-c33c-097c-49fcf062228f.jpeg)

次にデータの整えていきます。<br>
まず、性別は文字列のままでは使えないので0と1に変換します。

```python
train.Sex = train.Sex.replace(['male', 'female'], [0, 1])
test.Sex = test.Sex.replace(['male', 'female'], [0, 1])
```

訓練データとテスト用データの年齢は欠損値があるので補完します。今回は中央値を使います。

```python
train.Age = train.Age.fillna(train.Age.median())
test.Age = test.Age.fillna(test.Age.median())
```

訓練データの乗船場は欠損値が2つしかないので、一旦Sで埋め、その後数値で埋めます。

```python
train.Embarked = train.Embarked.fillna("S")

train.Embarked = train.Embarked.replace(['C', 'S', 'Q'], [0, 1, 2])
test.Embarked = test.Embarked.replace(['C', 'S', 'Q'], [0, 1, 2])
```

テスト用データのFareに1つ欠損値があるので中央値で埋めます。


```python
test.Fare = test.Fare.fillna(test.Fare.median())
```

現在の状況です。だいぶすっきりしましたね。

```python
train.head()
```

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/100978/0a5999f7-0c1c-c26b-69bb-e54930ba7c3c.jpeg)

説明変数と目的変数に分割します。

```python
y_train = train["Survived"].values
X_train = train[["Pclass", "Sex", "Age", "SibSp", "Parch","Fare","Embarked"]].values

X_test = test[["Pclass", "Sex", "Age", "SibSp", "Parch","Fare","Embarked"]].values
```

モデルを作成します。 パイプラインを使って、標準化を行ったあとSVCでグリッドサーチを行います。

```python
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

# パイプラインを定義
pipe_svc = Pipeline([('scl', StandardScaler()),
            ('clf', SVC(random_state=1))])

# パラメータの種類を定義
param_range = [0.001, 0.01, 0.1, 1.0, 10.0,]

# グリッドサーチするパラメータの組み合わせ
param_grid = [{'clf__C': param_range,  # パラメータの範囲
               'clf__kernel': ['linear']}, # SVCのパラメータ
                 {'clf__C': param_range, 
                  'clf__gamma': param_range, 
                  'clf__kernel': ['rbf']}]

gs = GridSearchCV(estimator=pipe_svc, # アルゴリズム（パイプライン）
                  param_grid=param_grid, # グリッドサーチするパラメータ
                  scoring='accuracy',
                  cv=10,
                  n_jobs=-1)
gs = gs.fit(X_train, y_train)
print(gs.best_score_)
print(gs.best_params_)
```
```
0.8249158249158249
{'clf__C': 1.0, 'clf__gamma': 0.1, 'clf__kernel': 'rbf'}
```

予測を実行し、提出用のCSVファイルを作成して完了です。

```python
# 予測を実行
predictions = gs.predict(X_test)

# テスト値を再読み込みして，SVMでクラス分類したカラムを追加
df_out = pd.read_csv("test.csv")
df_out["Survived"] = predictions

# outputディレクトリに出力する
df_out[["PassengerId","Survived"]].to_csv("submission.csv",index=False)
```

結果は・・・

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/100978/ba28004c-4676-1358-2780-192ef8bc9c8a.jpeg)

11,181中、1750位だった！！！
なかなかよい結果です。
もう少し工夫の余地はありそうなので、またチャレンジしてみたいと思います。