(その3-5) タイタニックのデータセットの変数選択にてモデリング用のデータを作成し、エクスポートするコードを記載していましたが分かりずらかったので簡略しまとめました。
上から順に流していけばtitanic_train.csvとtitanic_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)