MotoJapan's Tech-Memo

技術めも

【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"]))

f:id:motojapan:20170630005035p:plain
これを用いて各精度比較を進める。

各精度比較

古典的アルゴリズム

F値精度を比較しました。
f:id:motojapan:20170630013252p:plain

  • SVMは精度が軒並み高く優秀
  • 一方、ワーストはSGD
    • 特にSurvivedの認識精度が悪い(データ数の問題か、表現力の問題か、、)

DeepLearning

FFNN (DeepLearning by Chainer)については、4層モデルを構築した。
1層当たりのunit数を調整しながら検証したが、8程度が過学習しないちょうどよいモデルであった。
ただし、データ量も少なくあまり良い成果は出なかった。(SVMには劣る結果)

unit数=8の場合

学習曲線(損失)
f:id:motojapan:20170630021025p:plain
学習曲線(精度)
f:id:motojapan:20170630021035p:plain

データ正規化比較

アルゴリズムを100回実行した場合の平均値は下記の通りとなりました。
これはF値ではなく、kaggleで扱われる単純な認識精度となります。

f:id:motojapan:20170630015326p:plain

  • 全体傾向は改善方向
  • KNN、SGDは大幅な精度改善が見える 5~10ポイント以上の改善
  • SVMでも、0.14ポイント精度改善
  • 手法によって精度が悪くなるパターンもあるがほぼステイ

正規化による精度改善がうかがえます。


以上、精度 78.974% (順位1777位タイ / 7082 teams) の話でした。

時間ができたら、もっとしっかり特徴量設計したいなぁ。

精度向上のための特徴量ToDo

  • 年齢ではなく年齢層を用いる
    • 1桁精度の年齢は実は不要な可能性がある
  • データ数を間引く
    • 全データを必ず使わなければならないというルールはなく、むしろ無理やりフィッティングすることで汎化性能が下がる可能性が高い
    • 信頼性のあるデータのみを使うほうがよいかも