テストエンジニアが機械学習してみた備忘録

広島とジト目が好きなテストエンジニアが機械学習に手を出した備忘録。

Kaggleのタイタニックでランダムフォレストの練習

何番線じかわかりませんが。

バグやリファクタリングと戦いつつなんとかシストレを稼働にまで持って行けたので、機械学習の勉強を再開するということでKaggleに登録してみました。

Kaggleについてとか、サイト内の案内とか、タイにタックってなんやねんとかは以下のような良記事があるので、分析部分の備忘録。

条件の整理

評価指標

評価指標にはAccuracyを用いるようです。モデルの評価方法については以下の記事でまとめています。 scikit-learnを使うのであればsklern.metricsのaccuracy_score()を使えばよい、ということを思い出す。

gratk.hatenablog.jp

Accuracyは生存者を生存者、死亡者を死亡者と正しく予測できればできるほど高くなります。 つまり、例えば100人中80人死亡していたら、全員死亡と判定してもスコアは0.8になるので、 せめて「全員◯◯」よりはいい成績を出したいところです。

スコアの提出

スコアの提出は418行+ヘッダのCSV。カラムはPassengerIdとSurvivedの2つ。 Survivedについては、生存している場合は1、死亡している場合は0とするとのこと。

分析時の備忘録

欠損値

欠損値の扱いについては以下のような記事が参考になりそうです。

ひとまず今回は初手ということで下の記事にある「統計量(平均)の代入」で補完しましたが、 他に上がっているアプローチも今後は試してみたいですね。

cross validation

前にランダムフォレストをやってみた時に、scikit-learnによるcross validationについては調べていました。おさらいすると、sklearn.cross_vlidationは0.20で廃止されるため、sklearn.model_selectionを使う必要があります。ぐぐると結構sklearn.cross_validationの記事が残っているので注意。

scikit-learn 0.20からクロスバリデーションの使い方が変更される模様 - verilog書く人

使い方の例は以下の通り。

kf = KFold(n_splits=5)
kf.get_n_splits(train)

for train_index, test_index in kf.split(train):
    (以下略)

上記のコードでは、trainを5分割してcross validationを行う。ループ内では、train_indexに教師データとして扱うtrainのデータのindexが、test_indexにテストデータとして用いるtrainのデータのindexが入る。

結果

とりあえずやってみたところ、scoreは0.73684で2018-03-04の時点で約1万人中8868位でした。精進します。