Kaggle / Titanic - Machine Learning from Disaster / 写経2 / @jun40vn / Day1
環境
Jupyter Lab / Local
新たに挑戦すること
表題のテーマについて自力でDay7で上位5.6%(Bronze Medal相当)に達したのですが、そこから上へいく、0.8以上を目指すことへのハードルがとてつもなく高かったので、自力から写経に戻ることにしました。
お手本は、こちら"KaggleチュートリアルTitanicで上位2%以内に入るノウハウ"です。
学んだこと
One Hot Encoding(ワンホットエンコーディング)
# ------------- 前処理 --------------- # 推定に使用する項目を指定 df = df[['Survived','Pclass','Sex','Age','Fare','Embarked','Title','Family_label','Cabin_label','Ticket_label']] # ラベル特徴量をワンホットエンコーディング df = pd.get_dummies(df) # データセットを trainとtestに分割 train = df[df['Survived'].notnull()] test = df[df['Survived'].isnull()].drop('Survived',axis=1) # データフレームをnumpyに変換 X = train.values[:,1:] y = train.values[:,0] test_x = test.values
`df = pd.get_dummies(df)'の部分のことです。
今まではEmbarkedについてS, Q, Cと3タイプあったカテゴリデータを0, 1, 2のように数値カテゴリ型に変換して1つの変数として扱っていました。が.get_dummies(df)
を使うことでEmbarked_S, Embarked_Q, Embarked_Cという3変数に自動的に分解し、中身をBool(0/1)型に置き換えてくれます。
変換のための.map()
等を使ったコーディングをする必要がないということもありますが、それ以上に後述するsklearn.feature_selection
からインポートできるライブラリ関数SelectKBest()
を活用することで、EmbarkedのS, Q, CそれぞれをAIモデルに学習させるかどうかを個別に選択することができるようになるメリットが巨大でした。
モデリングにおけるSelectKBestの活用
# ----------- 推定モデル構築 --------------- from sklearn.feature_selection import SelectKBest from sklearn.ensemble import RandomForestClassifier from sklearn.pipeline import make_pipeline from sklearn.model_selection import cross_validate # 採用する特徴量を25個から20個に絞り込む select = SelectKBest(k = 20) clf = RandomForestClassifier(random_state = 10, warm_start = True, # 既にフィットしたモデルに学習を追加 n_estimators = 26, max_depth = 6, max_features = 'sqrt') pipeline = make_pipeline(select, clf) pipeline.fit(X, y)
k=20
のところでモデル(今回はRandomForestの分類)に学習させる変数を20個に限定して、効果のあるものを選び出してくれます。この処理においてEmbarked_Qだけが学習データから除外されていることが分かります。先ほどのワンホットエンコーディングによる変数のBool型分解が効いています。
所感
この2つの処理については目鱗でした…。おかげで上位2%台に乗りましたが自力ではないので、今度は自力でここにたどり着けるか頑張ってみます。
航海は続きます。