Kaggleで始める機械学習入門

機械学習を学んで何かをコードを作ってみよう、と思うときにネックになるのが学習用データと実行環境ですよね。何千件もあるデータを用意するのは大変ですし、初学者にとって高価なGPUを購入するのはハードルが高いです。

そこで機械学習のプラットフォームであるKaggleを利用し、チュートリアルでタイタニック生存者予測に取り組んでみます。

## Kaggleにユーザ登録する

まず[Kaggle](https://www.kaggle.com/)を開き、Registerボタンをクリックします。Googleアカウントでユーザ登録するか、メールからユーザ登録するか、お好きな方でどうぞ。
Kaggleは英語のみですので、DeepLなどで翻訳しながら進めると良いかもしれません。

![kaggle_register.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113146/23276fd6-826f-c13f-9d88-e2862487f11d.png)

## コンペに参加する

ユーザ登録できたら、「Competitions」を開き、おそらく先頭に表示されているであろう「Titanic」を選んでください。次のURLから直接アクセスしてもOK。
https://www.kaggle.com/competitions/titanic

「Titanic」を開くと初めの方に「click on the "Join Competition button"」なんて書かれてますが、Join Competitionボタンは見当たりません。たぶんデザインが変わったんでしょうね、特に気にしないことにします。

![kaggle_competition.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113146/78c3b480-84df-35ed-b299-4a3a5e8ab4f1.png)

## Notebookを作る

さて、これで準備は整いました。
ここからは
1. Kaggle Notebookでコードを書く
1. タイタニックの生存者を予測する
1. 予測データを投稿し、スコアをもらう

という流れになります。Kaggle Notebookとは、Kaggle上のJupyter Notebookのことです。ブラウザ上でPythonコードを書き、無料でGPUを使って解析できます。

「Code」->「+ New Notebook」を選択してください。すると、最初からInputとしてタイタニック用のデータがセットされた状態のNotebookが作成されます。便利ですね。

セットされているデータは
train.csv: 学習用のデータ
test.csv: 予測用のデータ
gender_submission.csv: 投稿する予測データのサンプル
となります。

![newNotebook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113146/edf1387f-dd41-7e29-cd7a-6e7e7318d18e.png)

![newNotebook2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113146/efaa02f3-d06b-957a-f52b-2b7fe8e8e462.png)

## コードを書く

さあ、いよいよ本題です。[スターターページ](https://www.kaggle.com/code/gusthema/titanic-competition-w-tensorflow-decision-forests)に沿って、タイタニックの生存者を予測するコードをNotebookに書いてみましょう。今回はお試しということで一部の過程は省略します。

### 学習用データのを読むこむ

まず、学習用データを読み込みます。
「+」ボタンで新しいセルを作り、「Code」になっていることを確認してください（「Markdown」だとメモを書けるだけで実行できません）。コードを書いたら、「▷」をクリックして実行です。うまく書けていたら、学習用データの一部が表示されます。IDの他に、生存したかどうか、等級（１等客室、２等客室…）、名前などが記載されていることがわかります。

![code1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113146/6547ddaf-6197-3c99-5880-65e9bb5953ea.png)

```Python
import numpy as np
import pandas as pd 
train_df = pd.read_csv("/kaggle/input/titanic/train.csv")
train_df
```

### 項目リストを作る

解析に使う項目のリストを作成します。使わない項目は削除します。

```Python
input_features = list(train_df.columns)
input_features.remove("Ticket")
input_features.remove("PassengerId")
input_features.remove("Survived")

print(f"Input features: {input_features}")
```

### TensorFlow用のデータセットに変換する

```Python
import tensorflow as tf
import tensorflow_decision_forests as tfdf

def tokenize_names(features, labels=None):
    """Divite the names into tokens. TF-DF can consume text tokens natively."""
    features["Name"] =  tf.strings.split(features["Name"])
    return features, labels

train_ds = tfdf.keras.pd_dataframe_to_tf_dataset(train_df,label="Survived").map(tokenize_names)
```

### トレーニングを行う

GradientBoostedTreesモデルを使い、デフォルトパラメータでトレーニングを行います。

```Python
model = tfdf.keras.GradientBoostedTreesModel(
    verbose=0, # Very few logs
    features=[tfdf.keras.FeatureUsage(name=n) for n in input_features],
    exclude_non_specified_features=True, # Only use the features in "features"
    random_seed=1234,
)
model.fit(train_ds)

self_evaluation = model.make_inspector().evaluation()
print(f"Accuracy: {self_evaluation.accuracy} Loss:{self_evaluation.loss}")
```

### 予測用データで予測する

さてモデルができたので、いよいよ予測を行います。生成されたsubmission.csvをダウンロードします。

```Python
serving_df = pd.read_csv("/kaggle/input/titanic/test.csv")
serving_ds = tfdf.keras.pd_dataframe_to_tf_dataset(serving_df).map(tokenize_names)

def prediction_to_kaggle_format(model, threshold=0.5):
    proba_survive = model.predict(serving_ds, verbose=0)[:,0]
    return pd.DataFrame({
        "PassengerId": serving_df["PassengerId"],
        "Survived": (proba_survive >= threshold).astype(int)
    })

def make_submission(kaggle_predictions):
    path="/kaggle/working/submission.csv"
    kaggle_predictions.to_csv(path, index=False)
    print(f"Submission exported to {path}")
    
kaggle_predictions = prediction_to_kaggle_format(model)
make_submission(kaggle_predictions)
!head /kaggle/working/submission.csv
```


## 予測データを投稿し、スコアをもらう

Notebookを離れ、Competitionsのページへ戻ってください。「Submit Prediction」ボタンを押し、先ほどダウンロードしたsubmission.csvを投稿します。しばらくすると、「Submissions」に今回のスコアが表示されます。

![submit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113146/d84c58a7-cbed-005d-5300-7253f4689dbe.png)
![score.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113146/11ac96ac-43fc-462d-57be-ac39894d33c3.png)

## 最後に

これでKaggleのコンペでの一通りの流れを体験できました。あとは他の人が保存したモデルを調べたり、自分のモデルを改良して再度投稿したり（１日１０回まで投稿できます）、Discussionで質問してみたり（英語ですが）、他のコンペに参加するなどして、学習を進めてみてください。

それでは素敵なKaggleライフを！