Kaggleコンペの参加チュートリアル（３．推論ファイル投稿編）

# はじめに
- 育休中のエンジニアの私が、自宅でのウォームアップと勉強を兼ねてKaggleコンペに参加してみることにしたので、その記録を残したいと思う。
- 今回は、Kaggleの概略を知り、Begginer向けコンペへ参加することで、基本的な参加方法や使い方を理解することを目指す。
- Kaggleの概要～参加登録までの流れは、前々回の[「Kaggleコンペの参加チュートリアル（１．参加編）」](https://qiita.com/m_sugimura/items/4ec138dfb2e5164e1228)参照。
- その後の前処理～モデル開発は、前回の[「Kaggleコンペの参加チュートリアル（２．前処理～モデル開発編）」]()参照。

# 「タイタニックの生存予測」コンペに投稿
- 前回、Beginner向けコンペである「タイタニックの生存予測」のデータを使って、モデルの学習を行った。
- 今回は、学習済モデルを使って投稿用の推論ファイルを作成し、実際にコンペに投稿する。

## テストデータ推論
- 学習済モデルを使って、テストデータを推論させる。
- 推論コードは以下。

```python:estimate.ipynb（推論コード）
#%load_ext autoreload
#%autoreload

import os
from datetime import datetime
import pandas as pd
import numpy as np
import torch
from torch.utils.data import DataLoader
from src.dataset.dataset import DatasetWithTag, DatasetNoTag
from src.network.simplefcn import SimpleFCN

# config
TRAIN_FILE = "./data/train_prepro.csv"
TEST_FILE = './data/test_prepro.csv'
MODEL = './model/20210618_063522/049_losstrain_0.3914_lossval_0.3814.pth'

BATCH_SIZE = 100
INPUT_N = 7
OUTPUT_N = 2
NODE_N = 64

if __name__ == '__main__':
    # dataloader
    dataset_t = DatasetWithTag(TRAIN_FILE)
    mean, std = dataset_t.get_mean_std()
    dataset = DatasetNoTag(TEST_FILE, mean, std)
    dataloader = torch.utils.data.DataLoader(dataset, batch_size=BATCH_SIZE, shuffle=False, num_workers=1)
    
    # Network
    net = SimpleFCN(INPUT_N, OUTPUT_N, NODE_N)
    model = torch.load(MODEL)
    net.load_state_dict(model, strict=True)
    #net.eval()
    
    # prepare output
    test_df = pd.read_csv('./data/test.csv')
    test_data = test_df.values
    passangerids = test_data[:, 0]
    result = np.zeros((passangerids.shape[0], 2))
    result[:, 0] = passangerids

    # estimate
    for i, (batch) in enumerate(dataloader):
        est = net(batch).data
        estmax = torch.max(est, 1)[1]
        result[i*BATCH_SIZE : (i+1)*BATCH_SIZE, 1] = estmax.T
        # result[i*BATCH_SIZE : (i+1)*BATCH_SIZE, 2:] = est
    
    # output result
    filename = './result/' + os.path.basename(MODEL) + '.csv'
    np.savetxt(filename, result, delimiter=',', fmt='%d')
    print('save file to {}'.format(filename))
```

- 実行結果

```
save file to ./result/049_losstrain_0.3914_lossval_0.3814.pth.csv
```

## コンペへの投稿
- 「Submit Predictions」を選択。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1047932/885a3929-95fe-bbf3-b684-fc2bbf17084e.png)
- 推論結果のCSVファイルをアップロードし、コメントを書いて「Make Submission」。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1047932/e3d48fea-2932-8143-8180-6f35f4974906.png)
- 投稿できました！<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1047932/c19f50f8-fc52-120c-34ea-29bd7e9642b4.png)

## 投稿結果の確認
- 早速LeaderBoardを確認。<br>
- スコアは0.76555、39216/49676位。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1047932/52b683f8-6310-7aa0-11e8-fa75677a482c.png)

## コードをGithubリポジトリに保存
- 作成したコード一式を、Githubのプライベートリポジトリに保存しておく。
- まず、Githubにログインしてリポジトリを作成。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1047932/453578e9-32b5-6019-b70e-0efa7a109454.png)
- Amazon Sagemakerにログインし、ノートブック→Gitリポジトリから「リポジトリの追加」を選択し、設定画面へ。
- リポジトリの設定を以下の例のように入力して、「リポジトリの追加」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1047932/5fdab84e-94c6-5e49-84e2-4f5a9afcb18f.png)
- ノートブックインスタンスを一旦「停止」して、「編集」からGitリポジトリを追加。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1047932/21c357e9-d4d9-67a7-7512-898085874240.png)
- ノートブックインスタンスをJupyter Labから起動し、TerminalからコマンドでGithubにPushする。

```
sh-4.2$ cd SageMaker/titanic
sh-4.2$ git init
sh-4.2$ git add *
sh-4.2$ git commit -m "1st submitted base model"
sh-4.2$ git push origin master
```

# 最後に
- ひとまず、Kaggleコンペに参加してみることができました。
- 次はもう少し実用的なコンペにTryしたいと思います。