自分のキャリアをあれこれ考えながら、Pythonで様々なデータを分析していくブログです

タイタニックのモデリング用データの作成まとめ

Data Analytics
Data Analytics

(その3-5) タイタニックのデータセットの変数選択にてモデリング用のデータを作成し、エクスポートするコードを記載していましたが分かりずらかったので簡略しまとめました。

上から順に流していけばtitanic_train.csvtitanic_eval.csvが作成されますので、モデリング用データ読み込みのためにご利用ください。

スポンサーリンク

訓練データとテストデータの読み込み

import pandas as pd
import numpy as np

# タイタニックデータセットの訓練データを読み込み
df = pd.read_csv("/Users/hinomaruc/Desktop/notebooks/titanic/train.csv")

# タイタニックデータセットの評価用データを読み込み
df_eval = pd.read_csv("/Users/hinomaruc/Desktop/notebooks/titanic/test.csv")
スポンサーリンク

訓練データの加工

Embarkedの欠損値処理

# fill missing value for Embarked column
from sklearn.impute import SimpleImputer

# missing_values = int, float, str, np.nan or None
imp = SimpleImputer(missing_values=np.nan, strategy="most_frequent")

imp.fit(np.array(df.loc[:,"Embarked"]).reshape(-1,1))
df["Embarked"] = imp.transform(np.array(df.loc[:,"Embarked"]).reshape(-1,1))

特徴量エンジニアリング

# the number of family member travelling with. including him/her self
df['FamilyCnt'] = df['SibSp'] + df['Parch'] + 1

# The number of members who may travel with using the same ticket number. probably correlated to FamilyCnt
df["SameTicketCnt"] = df.groupby('Ticket')["Ticket"].transform('count')
from sklearn.preprocessing import OneHotEncoder

enc = OneHotEncoder(categories='auto',handle_unknown='ignore') #エラーは0になるオプション

# change datatype of Pclass to str for creating dummpy variables
df['Pclass_str'] = df['Pclass'].apply(str)

# fit to create dummy variables
enc.fit(df[['Pclass_str','Sex','Embarked']])

# OneHotEncoderでダミー化した変数をDataFrameに追加
cols=enc.get_feature_names_out(['Pclass_str','Sex','Embarked'])
df = df.join(pd.DataFrame(enc.transform(df[['Pclass_str','Sex','Embarked']]).toarray(),columns=cols))

Ageの欠損値処理

# 学習用データの作成
df_train = df.dropna(subset=['Age'])

# 投入変数
FEATURE_COLS=[
   'SibSp'
 , 'Parch'
 , 'Fare'
 , 'Pclass_str_1'
 , 'Pclass_str_2'
 , 'Pclass_str_3'
 , 'Sex_female'
 , 'Sex_male'
 , 'Embarked_C'
 , 'Embarked_Q'
 , 'Embarked_S'
]

# 説明変数と目的変数に分ける
X_train = df_train[FEATURE_COLS] # 説明変数 (train)
Y_train = df_train["Age"] # 目的変数 (train)

import xgboost as xgb

# すでにGridSearchでベストパラメータを求めた結果を利用
bestmodel = xgb.XGBRegressor(objective = 'reg:squarederror'
                         , colsample_bytree = 0.2
                         , eta = 0.1
                         , gamma = 4
                         , max_depth = 3
                         , min_child_weight = 2
                         , subsample = 0.7
                        )

# fitする
bestmodel.fit(X_train,Y_train)
Out[0]
    XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,
                 colsample_bynode=1, colsample_bytree=0.2, enable_categorical=False,
                 eta=0.1, gamma=4, gpu_id=-1, importance_type=None,
                 interaction_constraints='', learning_rate=0.100000001,
                 max_delta_step=0, max_depth=3, min_child_weight=2, missing=nan,
                 monotone_constraints='()', n_estimators=100, n_jobs=1,
                 num_parallel_tree=1, predictor='auto', random_state=0, reg_alpha=0,
                 reg_lambda=1, scale_pos_weight=1, subsample=0.7,
                 tree_method='exact', validate_parameters=1, verbosity=None)
# Age推定
df["Age_predicted"] = bestmodel.predict(df[FEATURE_COLS])

# Ageの欠損値をAge_predictedで補完してあげる
df.Age = np.where(df.Age.isnull(), df.Age_predicted, df.Age)
スポンサーリンク

評価用データの加工

訓練データで作成した説明変数と同じものを評価用データにも作成します。

作成したモデルを使ってSurvivedを予測するのに必要になるためです。(同じ情報がないと予測できない)

特徴量エンジニアリングと欠損値処理

# 特徴量エンジニアリング
df_eval['Pclass_str'] = df_eval['Pclass'].apply(str)
df_eval = df_eval.join(pd.DataFrame(enc.transform(df_eval[['Pclass_str','Sex','Embarked']]).toarray(),columns=cols))
df_eval['FamilyCnt'] = df_eval['SibSp'] + df_eval['Parch'] + 1
df_eval["SameTicketCnt"] = df_eval.groupby('Ticket')["Ticket"].transform('count')

# Ageの推定
df_eval["Age_predicted"] = bestmodel.predict(df_eval[FEATURE_COLS])
df_eval.Age = np.where(df_eval.Age.isnull(), df_eval.Age_predicted, df_eval.Age)

# FareをPclass=3の中央値で置換
replace_val = df.loc[df.Pclass == 3].groupby(['Pclass'])['Fare'].median().values[0]
df_eval["Fare"] = df_eval["Fare"].fillna(value = replace_val)
スポンサーリンク

不必要カラムの削除とデータのエクスポート

# 不必要カラムの削除
df = df.drop(columns=["Pclass_str","Age_predicted"])
df_eval = df_eval.drop(columns=["Pclass_str","Age_predicted"])
スポンサーリンク

モデリング用データのエクスポート

# モデリング用データのエクスポート
df.to_csv("titanic_train.csv", index=False)
df_eval.to_csv("titanic_eval.csv",index=False)
タイトルとURLをコピーしました