DatabricksでKaggleのSpaceship Titanicコンペティションにチャレンジしてみる

ある意味、こちらの続きです。

https://qiita.com/taka_yayoi/items/7fcfbaf39dac8326407b

しかし、宇宙船タイタニックとは。SF好きにはたまらない。宇宙船のどの乗客が別次元に転送されてしまったのかを予測する問題。

https://www.kaggle.com/competitions/spaceship-titanic

こちらからサンプルノートブックを取得します。

https://www.kaggle.com/code/gusthema/spaceship-titanic-with-tfdf/notebook

データはこちらから。

https://www.kaggle.com/competitions/spaceship-titanic/data

データは前回同様にボリュームにアップロードします。パスは`/Volumes/takaakiyayoi_catalog/default/data`です。

```sh
%sh
ls /Volumes/takaakiyayoi_catalog/default/data/spaceship-titanic.zip
```
```
/Volumes/takaakiyayoi_catalog/default/data/spaceship-titanic.zip
```

解凍します。

```sh
%sh 
unzip /Volumes/takaakiyayoi_catalog/default/data/spaceship-titanic.zip -d /Volumes/takaakiyayoi_catalog/default/data/spaceship-titanic/
```
```
Archive:  /Volumes/takaakiyayoi_catalog/default/data/spaceship-titanic.zip
  inflating: /Volumes/takaakiyayoi_catalog/default/data/spaceship-titanic/sample_submission.csv  
  inflating: /Volumes/takaakiyayoi_catalog/default/data/spaceship-titanic/test.csv  
  inflating: /Volumes/takaakiyayoi_catalog/default/data/spaceship-titanic/train.csv  
```

`tensorflow_decision_forests`が無いとエラーになったのでインストールします。

```py:Python
%pip install tensorflow_decision_forests
dbutils.library.restartPython()
```

データセットをロードする際にはボリューム上のパスを指定します。

```py:Python
# Load a dataset into a Pandas Dataframe
dataset_df = pd.read_csv('/Volumes/takaakiyayoi_catalog/default/data/spaceship-titanic/train.csv')
print("Full train dataset shape is {}".format(dataset_df.shape))
```
```
Full train dataset shape is (8693, 14)
```

この後でデータの統計情報やデータ型の確認をするのですが、[dbutils.data.summarize](https://docs.databricks.com/ja/dev-tools/databricks-utils.html#data-utility-dbutilsdata)を使うと簡単にプロファイリングできます。

```py:Python
dbutils.data.summarize(dataset_df)
```
![Screenshot 2023-11-14 at 9.46.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4d4755e6-9446-446b-dad0-ec94ec9c2e01.png)

その他のクレンジングなどを行った後にフィッティングを行います。

```py:Python
rf = tfdf.keras.RandomForestModel()
rf.compile(metrics=["accuracy"]) # Optional, you can use this to include a list of eval metrics
```
```py:Python
rf.fit(x=train_ds)
```
```
Reading training dataset...
Training dataset read in 0:00:05.167006. Found 6925 examples.
Training model...
Model trained in 0:00:56.797938
Compiling model...
Model compiled.
<keras.src.callbacks.History at 0x7f6aa9def760>
```

モデルを可視化します。これは便利ですね。

```py:Python
tfdf.model_plotter.plot_model_in_colab(rf, tree_idx=0, max_depth=3)
```
![Screenshot 2023-11-14 at 9.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/13500ee4-ae6f-b0ba-1fc7-ad30fb36cf2d.png)

この他、精度検証などを行い、テストデータセットに対する予測を行います。

```py:Python
# Load the test dataset
test_df = pd.read_csv('/Volumes/takaakiyayoi_catalog/default/data/spaceship-titanic/test.csv')
submission_id = test_df.PassengerId

# Replace NaN values with zero
test_df[['VIP', 'CryoSleep']] = test_df[['VIP', 'CryoSleep']].fillna(value=0)

# Creating New Features - Deck, Cabin_num and Side from the column Cabin and remove Cabin
test_df[["Deck", "Cabin_num", "Side"]] = test_df["Cabin"].str.split("/", expand=True)
test_df = test_df.drop('Cabin', axis=1)

# Convert boolean to 1's and 0's
test_df['VIP'] = test_df['VIP'].astype(int)
test_df['CryoSleep'] = test_df['CryoSleep'].astype(int)

# Convert pd dataframe to tf dataset
test_ds = tfdf.keras.pd_dataframe_to_tf_dataset(test_df)

# Get the predictions for testdata
predictions = rf.predict(test_ds)
n_predictions = (predictions > 0.5).astype(bool)
output = pd.DataFrame({'PassengerId': submission_id,
                       'Transported': n_predictions.squeeze()})

output.head()
```

提出用データセットを出力します。

```py:Python
sample_submission_df = pd.read_csv('/Volumes/takaakiyayoi_catalog/default/data/spaceship-titanic/sample_submission.csv')
sample_submission_df['Transported'] = n_predictions
sample_submission_df.to_csv('/Volumes/takaakiyayoi_catalog/default/data/spaceship-titanic/submission.csv', index=False)
sample_submission_df.head()
```

最終的にはボリュームに以下のようにファイルが格納されることになります。
![Screenshot 2023-11-14 at 9.50.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5949d56b-b5d1-1ad8-ee8c-31e096642292.png)

`submission.csv`をKaggleに提出します。
![Screenshot 2023-11-14 at 9.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2b13cbb5-1e55-0a5e-277c-2e37a157e070.png)
![Screenshot 2023-11-14 at 9.38.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/51e91155-59f7-c114-715c-230657d1882a.png)

提出しました！
![Screenshot 2023-11-14 at 9.39.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c8b73806-a1a6-beb4-5b78-edec87b0165a.png)

時間できたらもう少し頑張ってみます。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)