2017年11月9日 更新

KaggleチュートリアルTitanicで上位1%に入った話。(0.87081)

前回書いた「KaggleチュートリアルTitanicで上位3%以内に入るには。(0.82297)」 から久々にやり直した結果上位1%の0.87081を出せたのでどのようにしたのかを書いていきます。

52,031 view お気に入り 1

さてここまでからわかるように、LightGBMに学習させ、閾値を決め、提出し、結果が高いものがあればそれをまたトレーニングデータとする。これを繰り返していけばある程度まで行けます。0.84210ぐらいまでは行けます。ところがいつからか結果が上がらなくなります。
それは0.48で生存、0.55なのに死亡のようなデータがあるためです。そのためにこれから結果を高めたいならば0.5周辺のものに絞って何個かずつ変えて検証して行く必要があると思います。そして地道に結果をメモりながら頑張って行く必要があります。これを行うと永遠に結果が高まって行くような気がします。もしかすると100%までいけるかもしれません。時間がとてもかかるでしょうが…
これをやっているうちに気がついたことがあります。leaderboardの上の方に書いてありますが。
This leaderboard is calculated with approximately 50% of the test data.
The final results will be based on the other 50%, so the final standings may be different.
と書いてあります。なのでたまに生存予測が0でも1でも結果に関係ないものがあります。なので何回もやっていると結果が上がらなかったりしてめんどくさくなります。私はとりあえず上位1%を目指してその日に提出できるだけ提出した結果が、087081でした。もっと上もいけると思いますがここらでタイタニックは終わりたいです。

for i in range(418):
    if X_pred[i]>=0.6:
        X_pred[i]=1
    elif 0.6>X_pred[i]>0.4:
        X_pred[i]=1111
    else:
        X_pred[i]=0
python.py

下のコードは一番良い結果と今回の予測結果を比べるものです。

ex= pd.read_csv("087081.csv")
tre= pd.read_csv("Predict_result_data.csv")
for i in range(417):
    if ex['Survived'][i]-tre['Survived'][i]!=0:
        print(ex['PassengerId'][i])
python.py

4.データ分析

 今回やって行く中でID:1261のPallas y Castello, Mr. Emilioは生存したはずですが予測は基本的に0.3など低めの生存予想になっていました。問題児でした。すぐに誤分類されてしまいます。前回の結論から死亡しやすいのは、男性、一人乗り、乗った席のグレードが低いの3つでした。この1261番の方は、2等に乗った29歳の男性それも一人乗りです。確かにこの人は死亡していてもおかしくはない特徴をかなり持っています。ですが生き残りました。
何が言いたいかというと、そもそも複数のデータだけから100%生存したかどうかを当てるというのは不可能ではないかということです。ましてや船の沈没ならば偶然亡くなった人、生き残った人がいても不思議ではないということです。逆のことも言えます、このデータから85%もの人の生き死にを当てることができるというのも面白いです。

5.モデル検証

 さてここで新たに検証してみたいと思います。今回の予測モデルがどこまで正しいのか実際に新たにタイタニックの事故を起こして結果を確かめたりすることはできないので、今回のテストデータ418人分と私が予測した結果を使って逆にトレーニングデータ891人分の生存予測をしてみたいと思います。今回は完全に生存の結果はわかるので検証しやすいはずです。
コードは今までと大して変わらないので省略します。結果は正答率が0.8428732ということで約84%。これはまあまあいい結果なのではないかと思います。先ほどよりトレーニングデータが少なくなったのに対して結果は3%落ちただけということです。

6.感想

 正直にいうとこの結果にどのくらい意味があるのかが気になります。 たかだか機械学習の勉強を初めて六ヶ月の人間がこの結果を出せるということは、逆に言えば、今後明らかに簡単に今よりもたくさんの人が機械学習をできるようになるということだと思います。
何よりも私自身データ分析はできたとしてもRandomForestやLightGBMがどういう原理でできているのかがわかりません。 データ分析ができる人は今後当たり前になってくる中で、難しいのはデータの収集と加工なような気がします。SQLなどの知識や機械学習の理論をもっと学ぶ必要があると思いました。 今回はじめにいい結果が出たのは私に時間があってパラメータチューニングがたまたまうまくいっただけで、今後パラメータチューニングはきっと自動化されるのではないのかと思います。 とは言えKaggleは楽しいので今後も色々やってみようと思います。 ここまで読んでくださった方ありがとうございます。

7.実際の予測結果

0.82296=array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1])

087081=array([0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1])

23 件

関連する記事 こんな記事も人気です♪

KaggleチュートリアルTitanicで上位3%以内に入るには。(0.82297)

KaggleチュートリアルTitanicで上位3%以内に入るには。(0.82297)

まだ機械学習の勉強を初めて4ヶ月ですが、色々やってみた結果、約7000人のうち200位ぐらいの0.82297という記録を出せたので、色々振り返りながら書いていきます。
Takumi Ihara | 190,109 view
Python × TensorFlow ② ~TensorFlow を扱う上で必要な知識「定数・変数」~

Python × TensorFlow ② ~TensorFlow を扱う上で必要な知識「定数・変数」~

TensorFlow を扱う上で必要な以下3つの知識のうち「定数と変数」について解説していきたいと思います.
井上 大輝 | 9,080 view

この記事のキーワード

この記事のキュレーター

Takumi Ihara Takumi Ihara