Kaggleをはじめる - Titanic

データ分析に興味があり,次の本に一通り目を通しました.

本書では,「テーブルデータ」形式でデータが与えられるコンペについて詳しく書かれています.コンペの問題は

  1. 「特徴量と目的変数」がセットになった「学習データ」をもとに,
  2. 「特徴量」だけが与えられた「テストデータ」の「目的変数」を予測する
というものです.

この書籍の「1.5 上位を目指すためのポイント」では,チュートリアル的なコンペである,"Titanic - Machine Learning from Disaster"について,コードを交えて解説しています(*1).問題は,タイタニックの乗客データをもとに,生存しているか否かを予測することです.

さっそく,実際に手を動かして行こうと思います.

Overviewを読む

まずは,Overviewを読みました.はじめはリンクへは飛ばずに,通読したほうが良さそうです.

問題の背景の説明や,提出ファイルのフォーマットなどの説明があります.

英語ですが,そんなに難しい内容ではありません.わからない部分はGoogle翻訳やDeepL翻訳/DeepL Translateを使えば大丈夫です.

Alexis Cook’s Titanic Tutorial

Overviewに,チュートリアルのリンクがありました.submissionまでの手順が丁寧に解説されているようなので,まずはこれに取り組みます.

【追記】2時間くらいでできる内容だと思います.

与えられたデータ

学習データ(train.csv)には891人の乗客データが与えられ,テストデータ(test.csv)には418人の乗客データが与えられています.

予測対象(目的変数)である,生存か否かの情報は,学習データにだけ与えられています.

gender_submission.csvは,提出ファイルの例です.このファイルは,女性なら生存(Survived=1),男性なら死亡(Survived=0),と予測した場合を例としています.

gender_submission.csvをダウンロードして,「Submit Predictions」ボタンから,ファイルのsubmissionを試してみます.スコアは0.76555でした.

予測値を提出すると,Public Leaderboardで順位が確認できます.順位は22401でした.

このスコアをベンチマークとして,予測を改善していきます.

データを読み込む

コーディング・実行は,自分のPCに何かをインストールする必要はなく,全てKaggle Notebook 上で行うことができます.

コンペページの「Codeタブ(名称が変わっているようです)」で"New Notebook"をクリックすることでNotebookが作成できます.
※Notebookの表示も,チュートリアル作成時から変わっているようです.

デフォルトでNotebookに書かれているコメントにあるように,"../input/" 以下にデータが保存されています.デフォルトコードを「▶ボタン」で実行することで,具体的なファイルの場所がわかります.

※今のNotebookの表示では,右側のDataというところでフォルダの構造とデータの場所が見えるようになっています.

Kaggle Notebook
Kaggle Notebook (2021.04.04).下の方にある,Consoleという黒いバーをクリックすると,コマンドの入力画面が表示される.

「+Code」をクリックすると,さらにコードの入力画面を追加できます.ここに

train_data = pd.read_csv("/kaggle/input/titanic/train.csv")
train_data.head()

を入力して実行する(▶ボタンか,[Shift] + [Enter])と,学習データが"train_data"として読み込めたことが確認できます.

さらに「+Code」で入力欄を増やし,

test_data = pd.read_csv("/kaggle/input/titanic/test.csv")
test_data.head()

を入力して実行すると,テストデータが"test_data"として読み込めたことが確認できます.



ここで,読み込んだデータをもとに,女性の生存率を

women = train_data.loc[train_data.Sex == 'female']["Survived"]
rate_women = sum(women)/len(women)

print("% of women who survived:", rate_women)

によって計算すると"% of women who survived: 0.7420382165605095"となります.同様に,男性の生存率を

men = train_data.loc[train_data.Sex == 'male']["Survived"]
rate_men = sum(men)/len(men)

print("% of men who survived:", rate_men)

によって計算すると"% of men who survived: 0.18890814558058924"となります.

上で提出したgender_submission.csvは,女性なら生存,男性なら死亡として予測値を計算していましたが,このような背景でそこそこ良い精度で予測できていたことがわかります.

機械学習モデルを作る

gender_submission.csvは,性別という1の情報だけを扱ってきました.複数の情報を組み合わせることで,予測値を改善できると考えられます.

ここでは,random forest modelと呼ばれるモデルでこれを実現します.

from sklearn.ensemble import RandomForestClassifier

y = train_data["Survived"]

features = ["Pclass", "Sex", "SibSp", "Parch"]
X = pd.get_dummies(train_data[features])
X_test = pd.get_dummies(test_data[features])

model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)
predictions = model.predict(X_test)

output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('my_submission.csv', index=False)
print("Your submission was successfully saved!")

これを実行すると,"my_submission.csv"という予測データが"output/kaggle/working"に保存されます.

"Save Version"ボタンから,"Save and Run All"を選択して保存すると,実行済みのNotebookが保存されます.これは,Notebookの左下のアイコンからOpen in Viewerを選択すると見ることができます.

保存したKaggle Notebookを見る
保存したNotebookを見るには,Open in Viewerを選択する. (2021.04.04).

Open in Viewerで開いたNotebookの下の方に"Output"という項目があります."Submit"ボタンをクリックすることで,作成した"my_submission.csv"を提出することができます.

"My Submissions"タブでスコアを確認すると,0.77511となっており,スコアが改善できたことがわかります.

このチュートリアルは,最後に機械学習のコースの紹介があって終わりです.

Kaggleで勝つデータ分析の技術のチュートリアル

次に,書籍「1.5 上位を目指すためのポイント」に沿って予測してみたいと思います.コードはGitHub - ghmagazine/kagglebookで公開されています.

そのままNotebookに貼り付ければ,(警告は出ますが)実行でき,提出ファイルが作成できます.

ただし,モデルチューニング後や,アンサンブル後に提出ファイルを作成するコードが抜けているので,それらのモデルの予測値を使いたい場合,追加する必要があります.具体的には,①「アンサンブル」の部分で,「モデルチューニング」で探索したハイパーパラメータを使う:

# xgboostモデル
model_xgb = XGBClassifier(n_estimators=20, random_state=71,
                          max_depth=best_param[0], min_child_weight=best_param[1])

さらに,②「アンサンブル」のコードの最後に提出ファイルを作成するコードを追加する(「モデル作成」のコードからコピペ(※ファイル名は変更)):

# 提出用ファイルの作成
submission = pd.DataFrame({'PassengerId': test['PassengerId'], 'Survived': pred_label})
submission.to_csv('submission_second.csv', index=False)

2つのファイルを作った場合は,Open in ViewerでNotebookを開き,"Output"→"Submit"ボタンで提出する際,どのファイルを提出するか選ぶことができました.

Notebookから予測値を提出する際,ファイルを選べる.
Notebookから予測値を提出する際,ファイルを選べる. (2021.04.04).


スコアは0.77751で,Public Leaderboardで順位を確認すると,9012でした.

*1:書籍の1.5.7で,タイタニックのデータセットは機械学習の初心者向けではないと注意書きがあります.理由は,

  1. データ数が少ないため,効果的な特徴量をつくっても「ぶれ」によって精度が悪くなることがある
  2. レコード間の関係性がある(家族関係)
という背景によるそうです.そのため,タイタニックのコンペでは分析の流れを理解することに留めて,他のコンペに参加することを推奨しています.