#Kaggleの「Titanic: Machine Learning from Disaster」にチャレンジしてみました。
Kaggleは機械学習の練度を競う武闘会・・・のようです。
エントリーすると初心者向けのコンテンツがありましたので、さっそくガイダンスの動画を見ます。
超早口な英語!!!
中身はタイタニックの事故の概要と、データセットの解説、チュートリアル、Kaggleの使い方などなどでした。
早口すぎて聞き取れないので、日本語Wikiのタイタニック号沈没事故に目を通しておきます。
ざっくりまとめると、
・深夜眠っている間の事故だったので、初動が遅れに遅れた。
・救命道具が十分になかった。(安全だと思われていた)
・貴族と平民、男性と女性、年齢で生存率が大きく違う。
図を見た印象ですが、氷山にぶつかって穴があいたエリアの死亡率が高いのではと思います。
船の全景がわかるトレーラー。映画ですが船の大きさ、人数、当時の雰囲気がつかめると思います。(この人たちがこれから・・・)
###予測に使うデータ
訓練用が891、テストデータが418ありました。
データの定義は次のとおりです。
変数 | 定義 | 備考 |
---|---|---|
Survived | 生存したかどうか | 0 = No, 1 = Yes |
Pclass | チケットのクラス | 1 = 1st, 2 = 2nd, 3 = 3rd |
Name | 名前 | |
Sex | 性別 | |
Age | 年齢 | |
SibSp | 乗船していた兄弟姉妹・配偶者の数 | |
Parch | 乗船していた親・子供の数 | |
Ticket | チケット番号 | |
Fare | チケット料金 | |
Cabin | キャビン番号 | |
embarked | 乗船した港 | C = Cherbourg, Q = Queenstown, S = Southampton |
###さてプログラミング!
プログラムの例は「Notebook」にどっさり投稿されてるので人気のものをいくつかチェック。
日本語のチュートリアルもありました。
Kaggleタイタニック はじめの一歩 (1st Step for Kaggle Titanic)
ざっくり読んで頭がごちゃごちゃになったので、まずは話をカンタンにするため全員生存モデルを作りました。"Survived"がぜんぶ1の列を作ってKaggleにアップするだけです。
###Titanic全員生存モデル["Survived"] = 1
import pandas as pd
# CSVを読み込む
test = pd.read_csv('test.csv')
# Survived列を追加。
test["Survived"] = 1
#確認
print(test["Survived"])
#提出用にPassengerIdとSurvivedだけにする。
test = test.loc[:,['PassengerId','Survived']]
#CSVに出力(インデックスは不要)
test.to_csv('titanic1-1.csv',index=False)
できたCSVを確認し、Kaggleにコミットします。
Public Score 0.37320
lederbord 15800位
Public Score
が実際の生存率(31.9%)に近い値となりました。
lederbord
はその人の最高だったスコアで順位がつくらしく、正確な順位はわからなかったのですが0.37320
は15800位のあたりでした。同じスコアの集団、つまり世界には同じ事を考えている人がこんなにいる・・・これはちょっと・・・感動してしまいました。
最下位は0、下から数えて70位でした。スコア0ということは全問正解の裏返しということで、これはこれで気になるスコアです。
###全員死亡モデル
["Survived"] = 0
としたCSVをKaggleにアップします。
1 - 0.37320 = 0.6268
なので同じくらいの値を期待した所、Public Score:0.62679
でした。だいたい合っています。
###男性死亡、女性生存モデル
今度は男性なら死亡、女性なら生存と単純に割り振ってみます。
タイタニックでは男性の死亡率が高く、女性の生存率が高かったので、これでも予測が上がるはずです。
#pandasを使います
import pandas as pd
# CSVを読み込む
test = pd.read_csv('test.csv')
# Survived列を追加
test["Survived"] = 0
#女性だったら1(生存)に置き換え
test.loc[test["Sex"] == 'female', "Survived"] = 1
#提出用にPassengerIdとSurvivedだけにする。
test = test.loc[:,['PassengerId','Survived']]
#CSVに出力(インデックスは不要)
test.to_csv('titanic1.csv',index=False)
Public Score:0.76555
lederbord:12457位/15000人くらい?
Gender Based Model
のCSVと中身が一緒のようです。
ごくシンプルなモデルでも0.76555
ですから、ここからどうやって予測の精度をあげるかが腕の見せ所なのでしょう。
まずはルールの確認というあたりです。