更新日:2020.01.19  作成日:2020.01.19

タイタニック号の生存率予測③ -モデル作成と予測-

はじめに

 前回まででデータの可視化と前処理を実施した。今回は処理したデータを使用しモデル作成と結果予測し、Kaggleに提出する。  コードは前回の続きであるため、ライブラリのimportや、データの読み込みなどは前回の記事に記載。

タイタニックの生存予測 スコア「0.78947」

 節に記載の通り、結果は0.78947であった(0.8超えれなかった。悲しい)。その際に利用したモデル作成方法を記載する。

各ラベルの相関の可視化

 各ラベルの相関を可視化。(1に近いほど関連性が強い)
 図を見る限りSurvivedに強い相関を持つラベルが無さそうである。

plt.figure(figsize=(18,18))
sns.heatmap(df_train.corr(), annot=True, cmap='Blues')

1

説明変数と目的変数

今回は説明変数にPclass、Sex、Embarked、CG_Age、CG_Sibsp、CG_Parch、CG_FamilySize、CG_Fare、CG_Ticket、Title_numを使用する。

#目的変数
y = df_train.loc[:,["Survived"]] 
#説明変数
x = df_train.loc[:,['Pclass','Sex','Embarked','CG_Age','CG_Sibsp','CG_Parch','CG_FamilySize','CG_Fare','CG_Ticket','Title_num']]

#予測する際に使用する説明変数
x_test = df_test.loc[:,['Pclass','Sex','Embarked','CG_Age','CG_Sibsp','CG_Parch','CG_FamilySize','CG_Fare','CG_Ticket','Title_num']]

モデルの作成

 必要なライブラリのimportする。モデル比較のためLogisticRegressionとxgboostを使用する。
scikit-learnに実装されているGridSearchCV(グリッドサーチ)を使いハイパーパラメータを決める。また、モデルの評価にはROU曲線のaucを使用する。

ROU曲線については以下参考。

from xgboost.sklearn import XGBClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler          
from sklearn.pipeline import Pipeline
from sklearn.metrics import roc_auc_score

# pipeの準備
pipe_logit = Pipeline([('scl', StandardScaler()),('est', LogisticRegression(random_state=1))])
pipe_xgbc  = Pipeline([('scl', StandardScaler()),('est', XGBClassifier())])

# 使用するハイパーパラメータ
param_grid_logit = {'est__C':[0.1,1.0,10.0,100.0], 'est__penalty':['l2']}
param_grid_xgbc  = {'est__n_estimators':[5,10,30,50,80,100],'est__learning_rate':[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0],'est__max_depth':[2,3,5,10,15]}

# pipe
models = [pipe_logit,pipe_xgbc]
params = [param_grid_logit, param_grid_xgbc]

# ハイパーパラメータ調査(ハイスコア確認)
res_models = []
for model, param in zip(models, params):
    gs = GridSearchCV(estimator=model, param_grid=param, scoring="roc_auc", cv=5)
    gs.fit(x, y.values.ravel())
    res_models.append(gs)

BestScoreなハイパーパラメータの確認。今回はXGboostを用いたモデルで、Scoreが0.88であるため、 learning_rate:0.3、max_depth’: 3、n_estimators:10を用いる。

▶︎ 
for res in res_models:
    print(">> Best Hyper Parameter")
    print(res.best_params_)
    print(">> Best Score")
    print(res.best_score_)
    print("-----------------------")

<div class = code_re>
>> Best Hyper Parameter
{'est__C': 0.1, 'est__penalty': 'l2'}
>> Best Score
0.8452831572488299
-----------------------
>> Best Hyper Parameter
{'est__learning_rate': 0.3, 'est__max_depth': 3, 'est__n_estimators': 10}
>> Best Score
0.8802058478683927
-----------------------
</div>
#最適なパラメータでのモデル作成
pipe_final = Pipeline([('scl', StandardScaler()),('est', XGBClassifier(learning_rate=0.3, max_depth=3, n_estimators=10))])

#予測する説明変数の適合
pipe_final.fit(x, y.values.ravel())
prob = pipe_final.predict_proba(x_test)
prob_1 = np.where(prob[:,1] > 0.5, 1, 0)

#データフレーム形に変更
df_ans = pd.DataFrame(prob_1,columns=['prob'])

#提出する形に整形しファイル出力
df_result = pd.read_csv("gender_submission.csv") 
df_result['Survived'] = df_ans['prob']
df_result.to_csv("04_Titanic_submission_v9.csv",index=False) #ファイル名

結果:Kaggleに提出

 結果は 0.78947。前回が0.72727だったため0.06ほどスコアがあがったが0.8を超えることができなかった。 0.8を超えるためにはデータの処理と利用するデータの選択を工夫する必要がありそうだ。
 他にも試したいが、ひとまずタイタニックの生存予測はこれで終わり。お疲れ様でした!!!

2

とりあえず実施した内容を書き殴っただけなのでおいおい記事の内容を厚くするかも。

参考