Kaggle(43) - タイタニックをRandom Forestで予測 - 特徴量を自動で取捨選択

今回は特徴量(カラム数)の取捨選択を自動で行います。

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%となりました。

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