今回は特徴量(カラム数)の取捨選択を自動で行います。
SelectKbestを使うと特徴量の取捨選択を自動化することができます。
(データの前処理は省略します。こちらの記事をご参照下さい。)
特徴量の自動取捨選択
特徴量を自動で20個に絞り込むためには、select = SelectKBest(k = 20)という形で指定します。(15行目)
特徴量の数を10~903までループしながら、正解率が高くなる特徴量の数を調べます。
[ソース]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import warnings warnings.simplefilter('ignore')
from sklearn import ensemble, model_selection clf = ensemble.RandomForestClassifier(n_estimators=100, max_depth=9, criterion='gini')
from sklearn.pipeline import make_pipeline from sklearn.feature_selection import SelectKBest
x = [] # グラフ表示用x軸 y = [] # グラフ表示用y軸 for k in range(10, 904): print('k=', k) x.append(k) select = SelectKBest(k = k) pipeline = make_pipeline(select, clf)
score = model_selection.cross_val_score(pipeline, x_titanic, y_titanic, cv=3) # cv=4は4分割の意 print('各正解率', score) print('正解率', score.mean()) y.append(score.mean())
|
[結果]

上記で調べた特徴量の数ごとの正解率をグラフ化します。
[ソース]
1 2 3 4
| import matplotlib.pyplot as plt
plt.plot(x, y) plt.show()
|
[結果]

明確な最適解は分かりにくいのですが、今回は特徴量の数を420で予測することにしました。
Kaggleに提出
特徴量の数を420に指定して(1行目)、学習・予測を行います。
最後に提出用に出力したCSVファイルをKaggleに提出します。
[ソース]
1 2 3 4 5 6 7 8 9 10 11
| select = SelectKBest(k = 420) pipeline = make_pipeline(select, clf)
# # 学習 pipeline.fit(x_titanic, y_titanic)
pre = pipeline.predict(df_test.drop(['Survived'], axis=1))
result = pd.DataFrame(df_test['PassengerId']) result['Survived'] = pre.astype(int) result.to_csv('result0321.csv', index=False)
|
[提出結果]

正解率79.18%となりました。
前回結果よりも少々正解率が落ちてしまいました・・・・やっぱり難しいです。