【kaggle⑤】初心者がタイタニック号の生存予測モデル(Titanic: Machine Learning from Disaster)をやってみる(機械学習、DeepLearning)
これの続きで、今回で一通り終わります。
【kaggle④】初心者がタイタニック号の生存予測モデル(Titanic: Machine Learning from Disaster)をやってみる(学習データ相関確認、分割、正規化) - MotoJapan's Tech-Memo
3. 機械学習
今回は下記6パターンをそれぞれ比較しました。
・Random Forest
・K Nearest Neighbor
・SGDClassifier(パーセプトロン)
・Support Vector Machine
・Gradient Boosting Decision Tree
・Deep Learning(by Chainer)
精度面では結論から言うといまのところ、Support Vector Machineが最も優秀でした。
Random Forest / Support Vector Machine / Deep Learning (by Chainer) がタイでベストスコア。(K Nearest Neighborが6%程悪い)
(17/07/15更新)
上記の内、古典的アルゴリズムは、sklearnに含まれています。
Deep LearningはChainerでシンプルなFFNNを構成しています。
実装はすべてgitにあるので参考にしてください。
sklearnに含まれているものは、どれも同じような呼び方で3行程度書けば学習もでき、評価もsklearn.metricsを使うと簡単です。(素晴らしいですね)
学習方法
sklearnに含まれるアルゴリズムでは、次の5手順で基本的には終わり
K近傍法の場合は下記
#1.アルゴリズムのインポート from sklearn.neighbors import KNeighborsClassifier #2.パラメータを指定してアルゴリズムインスタンス生成 knc = KNeighborsClassifier(n_neighbors=3) #3.学習データで学習 knc.fit(x_train_std, y_train) #4.評価データで推定 y_true, y_pred = y_eval, knc.predict(x_eval_std)
ここでのパラメータはハイパーパラメータと呼ばれており、値によって精度が大きく変わる。
理詰めでハイパーパラメータのあたりをつけるのも良いが、組み合わせ爆発を起こすため、自力で求めず、グリッドサーチといった手法を使う方がベター
pythonには、sklearn.grid_search があるのでこれを使ってインスタンスを生成してベストなパラメータを求める。
今回は、Support Vector Machine / Gradient Boosting Decision Tree で利用。
精度評価
精度評価にはprecision, recall, f1 scoreが用いられるが、忘れやすいので、ここに書き残しておく。
説明 | 数式 | |
precision | 適合率 (正確性:システムが正しいと判定したものの内、本当に正しく判断できたのの割合) | tp/(tp+fp) |
recall | 再現率 (網羅性:正しく判断されるべきものの内、本当に正しく判断できたのの割合) | tp/(tp+fn) |
f1 score | F値 | (2×適合率×再現率)/(適合率+再現率) |
pythonでは上記の情報を1行でかける
from sklearn.metrics import classification_report print(classification_report(y_true, y_pred, target_names=["not Survived", "Survived"]))
これを用いて各精度比較を進める。
各精度比較
データ正規化比較
各アルゴリズムを100回実行した場合の平均値は下記の通りとなりました。
これはF値ではなく、kaggleで扱われる単純な認識精度となります。
正規化による精度改善がうかがえます。
以上、精度 78.974% (順位1777位タイ / 7082 teams) の話でした。
時間ができたら、もっとしっかり特徴量設計したいなぁ。
精度向上のための特徴量ToDo
- 年齢ではなく年齢層を用いる
- 1桁精度の年齢は実は不要な可能性がある
- データ数を間引く
- 全データを必ず使わなければならないというルールはなく、むしろ無理やりフィッティングすることで汎化性能が下がる可能性が高い
- 信頼性のあるデータのみを使うほうがよいかも