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()
欠損値の数を確認します。
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()
次にデータの整えていきます。
まず、性別は文字列のままでは使えないので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()
説明変数と目的変数に分割します。
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)
結果は・・・
11,181中、1750位だった!!!
なかなかよい結果です。
もう少し工夫の余地はありそうなので、またチャレンジしてみたいと思います。