Kaggle Titanic Tutorialやってみた

はい、どうもー。オザキです。
タイトルの通り、Kaggle挑戦してみました。
いきなりですが、やってみての感想を書きます。

チュートリアルなんで、やってることは大して難しくないのですが、データ分析に使うツール(jupyter-notebook、pandasなどのpythonライブラリ)に慣れていないと、詰まるポイントや調べることが多くて挫折する人も多いんだろうなぁ、といった印象です。

でも、そこを乗り越えれば、データの前処理を変えてみたり、他の人のやり方とかも取り入れながら、スコアを上げて行くという、PDCAサイクルが回り始めるのかな、と思っています。

無事に予測結果を提出してLeaderboardに名前が載ると、素直に嬉しいです。
是非、参考にして頂ければ幸いです。

それでは、大まかな流れを書いていきます。
※Jupyter-notebookを実行できる環境は整っている前提です。

1. ライブラリのインポート
2. 訓練データ(train.csv)読込み
3. 訓練データ(train.csv)観察
4. 訓練データ(train.csv)前処理
5. モデル訓練
6. 試験データ(test.csv)読込み&前処理
7. 試験データ(test.csv)をモデルに投入
8. 結果をcsv吐き出し
9. Kaggleへ提出

1. ライブラリのインポート

ライブラリのインポートをします。とりあえず、pandasをpdとして取り込む。

import pandas as pd

2. 訓練データ読込み

では、訓練データを読み込みます。train.csvです。

train_data = pd.read_csv('./train.csv')

3. 訓練データ観察

訓練データを見てみます。head(3)で頭から3行、tail(5)でお尻から5行。

train_data.head(3)

色々な列があります。意味がよくわからない列もあります。

PassengerIdは乗客IDですね。
Survivedは生き残ったか亡くなったか(0 or 1)です。このTitanicチュートリアルでは、このSurvivedを他の列の値から予測して精度を競っています。
Nameは乗客の名前、Sex性別、Age年齢ですね。
SibSp、Parch?知りません。無視ですね。
Ticketはチケット番号、Fare運賃、Cabin部屋番号、Embarked乗った港です。

どうでしょうか、どの列がSurvivedに影響がありそうでしょうか。

私が最初に思ったのは年齢(Age)と運賃(Fare)かなぁ、でしたね。
でも、データ分析するなら、根拠のない勘でパラメータを選びたくないですよね。
それっぽいパラメータを選びたいですよね。

そこで、相関(correlation)を算出します。簡単なので、ご心配なく。

corr = train_data.corr()
corr.style.background_gradient(cmap='coolwarm')

上の表の赤枠が見るべきところです。
-1もしくは1に近いほど相関がある(関連が強い)です。詳しくは相関でGoogleしてみてください。
よって、Pclass(約-0.33)とFare(約0.25)は他と比較して、Survivedと関連が強いですね。

ここで気づいた方もいるかもしれませんが、
上の相関の表にName, Sex, Ticket, Cabin, Embarkedの列がありません。
なぜなら、それらの列の値は文字列だからです。

これらの文字列を数値に変換してやって、相関を見れるようにしたいと思います。
これがデータの前処理って言うやつになります。

4. データの前処理

Name, Sex, Ticket, Cabin, Embarkedとありますが、どれを数値にしましょうか。
僕はNameは生死に影響は小さいと思ったので、Nameは無視します。

Sexは簡単なので数値に変換しておきましょうか。male=1、female=2でいきましょう。
そして、データが入っていない(NaN)には平均値を代入しておきましょう。

train_data.loc[train_data['Sex'] == "female", 'Sex'] = 2
train_data.loc[train_data['Sex'] == "male", 'Sex'] = 1
train_data.loc[train_data['Sex'].isnull(), 'Sex'] = train_data['Sex'].mean()

次、Ticket、これもSurvivedに影響はないんじゃないかな。。と言うことで、無視。
Cabinか、スイートルームのVIPは最初に避難させてくれそう。
金持ちは助かるんだよな。
CabinはNaN(データなし)も結構あるみたいなので、何かしら文字列が入っていたら1を、NaNだったら0を代入します。

train_data.loc[~(train_data['Cabin'].isnull()), 'Cabin'] = 1
train_data.loc[(train_data['Cabin'].isnull()), 'Cabin'] = 0

最後にEmbarked、これもCabinと一緒でいいかな。

train_data.loc[~(train_data['Embarked'].isnull()), 'Embarked'] = 1
train_data.loc[(train_data['Embarked'].isnull()), 'Embarked'] = 0

それでは、もう一度相関をみてみましょうか。

corr = train_data.corr()
corr.style.background_gradient(cmap='coolwarm')

まず、列が増えましたね。
で、Survivedと相関が高めなのは、
Pclass(約-0.33)、Sex(約0.54)、Fare(約0.25)、Cabin(約0.31)ですね。

5. モデル訓練

それでは、Survivedの予測に使うパラメータも絞り込めたところで、モデルの訓練に入りたいと思います。
機械学習のモデルって、たくさんあります。
ですので、目的に応じて良さそうなモデルを選ぶ必要があります。
今回は決定木分析(Decision Tree)を使います。
もちろん他のモデルを使ってもOKです。
(ちなみに使うモデルを間違うと、予測精度も相当低く出ます)

そして、機械学習のモデルをたくさん持っているライブラリをインポートします。
scikit-learn(sklearn)ってライブラリです。
今回は深さ(depth)を4、でやってみます。

from sklearn import tree
ketteigibunseki = tree.DecisionTreeClassifier(max_depth=4)

次に、モデルの訓練に使うパラメータを準備します。
モデルに入力するパラメータXと、結果として出力されるパラメータY(今回はSurvivedのこと)を用意します。
モデルに入力するパラメータXは上で相関をみて決めた、Pclass、Sex、Cabin、Fareを使います。
結果としてモデルから出力されるパラメータYは、Survivedですね。

x_params = train_data[['Pclass','Sex','Cabin','Fare']]
X = x_params.as_matrix() 
Y = train_data['Survived'].as_matrix()

はい、これで訓練の準備OKです。
訓練開始します。

ketteigibunseki.fit(X, Y)

はい、訓練終了です。
スコアをみてみましょう。

ketteigibunseki.score(X, Y)

0.8170594837261503

0.8170594837261503

うん、悪くない。

6. 試験データ読込み&前処理

モデルの訓練も無事に終わりましたので、
試験データ(test.csv)を読み込みます。簡単ですね。

test_data = pd.read_csv('./test.csv')

訓練データでやったのと同様に前処理しますね。
訓練データの前処理と少し違うところは、AgeとFareにNaNが入っていてモデル投入時にエラーが出たので、NaNに平均値を代入しています。

test_data.loc[test_data['Age'].isnull(), 'Age'] = test_data['Age'].mean()
test_data.loc[test_data['Sex'] == "female", 'Sex'] = 2
test_data.loc[test_data['Sex'] == "male", 'Sex'] = 1
test_data.loc[test_data['Sex'].isnull(), 'Sex'] = test_data['Sex'].mean()
test_data.loc[~(test_data['Cabin'].isnull()), 'Cabin'] = 1
test_data.loc[(test_data['Cabin'].isnull()), 'Cabin'] = 0
test_data.loc[test_data['Fare'].isnull(), 'Fare'] = test_data['Fare'].mean()

7. 試験データをモデルに投入

モデルに投入するパラメータXを作成します。

x_params = test_data[['Pclass','Sex','Cabin','Fare']]

試験データからの結果(Survived)の予測は、下記のpredictで行います。
test_dataに新しくSurvived列を作って、そこに予測結果を書き込みます。

test_data['Survived'] = ketteigibunseki.predict(x_params)

それでは結果がSurvived列に出力されているか、みてみましょう。

test_data.head(5)

ちゃんとSurvived列に0, 1が入っていますね。

8. 結果をcsv吐き出し

CSVファイルに出力します。
提出するCSVに必要な列はPasssengerIdとSurvivedだけです。
また、index=Falseにしないと、最左端に番号が勝手に振られるので注意してください。

test_data[['PassengerId','Survived']].to_csv("./submission.csv", index=False)

これでsubmission.csvという、提出用のCSVファイルが出来上がりました。

9. Kaggleへ提出

いよいよ提出です。
下記の画面のStep 1に、CSVファイルをドラッグ&ドロップ
Step 2で、説明を適当に記入(my first submission!とかでもいいです)
Make Submissionボタンを押す

少し待てば、結果が出ます。

結果をお楽しみに。



今回はKaggle初挑戦ということで、Titanicチュートリアルに挑戦しましたが、
Deep learningを使ったより高度な分析へもチャレンジしようと、Udemyの下記のコースで勉強中
※購入はセールのタイミングをオススメします、大体1000円くらいです。

【Kaggleで学ぼう】Python と Keras で学ぶディープラーニング開発入門

それでは、また!

Please share this page:

コメントを残す