LoginSignup
3
6

More than 5 years have passed since last update.

kaggleのtitanic問題に挑戦

Posted at

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

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

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

train.head()

キャプチャ.JPG

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

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
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:乗船場と生存率の関係性はわからないが一応残す

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

次にデータの整えていきます。

まず、性別は文字列のままでは使えないので0と1に変換します。

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

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

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

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

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つ欠損値があるので中央値で埋めます。

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

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

train.head()

キャプチャ.JPG

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

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でグリッドサーチを行います。

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ファイルを作成して完了です。

# 予測を実行
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

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

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6