Google Colaboratory で始める Kaggler 生活(データ入手と提出編)

Google Colaboratory で Kaggle コンペに参加したいときの
データの入手方法や提出方法についてまとめました。

実際の学習を行う部分は省略していますのでご注意ください。

記事よりも下記の成果物とリンク見たほうが早いと思います。

# リンク

* [今回の成果物 | google ](https://colab.research.google.com/drive/1uhT8Q8FfbmgKg9haEe5fLqCj_RvwEBa7)
  * Chrome 以外のブラウザだとうまく開けない可能性あります
* https://github.com/Kaggle/kaggle-api
* https://github.com/google/google-api-python-client
* [Using kaggle datasets into Google Colab - Stack Overflow](https://stackoverflow.com/questions/49310470/using-kaggle-datasets-into-google-colab)
* [Kaggle API with Colab | Colab notebook](https://colab.research.google.com/drive/1eufc8aNCdjHbrBhuy7M7X6BGyzAyRbrF)

# 必要なもの

* Google アカウント
* Google Chrome

# 各手順

お好きなノートブック上で以下のコマンドを打ってください。

## 1. kaggle コマンド(api) のインストール

```python
!pip install kaggle
```

```text
Collecting kaggle
  Downloading kaggle-1.1.0.tar.gz
Requirement already satisfied: certifi in /usr/local/lib/python3.6/dist-packages (from kaggle)
Requirement already satisfied: python-dateutil in /usr/local/lib/python3.6/dist-packages (from kaggle)
Requirement already satisfied: six>=1.10 in /usr/local/lib/python3.6/dist-packages (from kaggle)
Requirement already satisfied: urllib3>=1.15 in /usr/local/lib/python3.6/dist-packages (from kaggle)
Building wheels for collected packages: kaggle
  Running setup.py bdist_wheel for kaggle ... - done
  Stored in directory: /content/.cache/pip/wheels/2a/cc/c6/e4c872c053261660031b4a3e35ac958725b284c6fde9ff05c8
Successfully built kaggle
Installing collected packages: kaggle
Successfully installed kaggle-1.1.0
```

ただしこれだけではまだ API は使えません。

```python
!kaggle datasets list
## => Unauthorized: you must download an API key from https://www.kaggle.com/<username>/account
## => Then put kaggle.json in the folder /content/.kaggle
```

次に API key を入手します。

## 2. Kaggle API Key の入手

* `https://www.kaggle.com/<UserName>/account` で自分のアカウントページを開いてください
* 上記ページ内の `Create New API Token` をクリックして `kaggle.json` をダウンロードしてください
  * API Key が載ってるので、扱いには注意

## 3. Google ドライブに `kaggle.json` をアップロード

* https://drive.google.com/drive/my-drive を開いてください
* ドライブ上の好きな場所に `kaggle.json` をアップロードしてください
  * ドラッグ & ドロップで OK です

## 4. Google ドライブから Colaboratory 上に `kaggle.json` をダウンロード

```python
# download API key from google drive
## Original: https://colab.research.google.com/drive/1eufc8aNCdjHbrBhuy7M7X6BGyzAyRbrF#scrollTo=y5_288BYp6H1
## When you run for the first time, you will see a link to authenticate.

from googleapiclient.discovery import build
import io, os
from googleapiclient.http import MediaIoBaseDownload
from google.colab import auth

auth.authenticate_user()

drive_service = build('drive', 'v3')
results = drive_service.files().list(
        q="name = 'kaggle.json'", fields="files(id)").execute()
kaggle_api_key = results.get('files', [])

filename = "/content/.kaggle/kaggle.json"
os.makedirs(os.path.dirname(filename), exist_ok=True)

request = drive_service.files().get_media(fileId=kaggle_api_key[0]['id'])
fh = io.FileIO(filename, 'wb')
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
    status, done = downloader.next_chunk()
    print("Download %d%%." % int(status.progress() * 100))
os.chmod(filename, 600)
```
* 初回実行時は Google アカウント認証ページが表示されます
  * 別タブで認証ページ開いてください
* 認証したらコードが表示されるので、コードをコピーしてセルの下にある入力欄に入力してください
* 上手く認証できればダウンロードされて `Download 100%.` と表示されます。

これで API が使えるようになります。 `!kaggle competitions list` などを打ち込んでみてください。
詳細は [ここ](https://github.com/Kaggle/kaggle-api) で確認してください。


## 5. コンペに必要なデータのダウンロード

ここでは 3月26日現在開催中のコンペ "TalkingData AdTracking Fraud Detection Challenge" に必要なデータをダウンロードします。

### 5.1 コンペ一覧から該当コンペがあるか確認

```python
# I want to search 'TalkingData AdTracking Fraud Detection Challenge'
!kaggle competitions list -s talkingdata
```

```text
ref                                     deadline             category   reward  teamCount  userHasEntered  
--------------------------------------  -------------------  --------  -------  ---------  --------------  
talkingdata-mobile-user-demographics    2016-09-05 23:59:00  Featured  $25,000       1689           False  
talkingdata-adtracking-fraud-detection  2018-05-07 23:59:00  Featured  $25,000       1581            True 
```

### 5.2 必要なデータのダウンロード

次に必要なデータのダウンロードを行います。

**【注意】予めコンペへの参加 (コンペルールへの同意) は済ませてください**

まずダウンロードする前のストレージ使用状況を確認します。

```python
!df -h
```

```text
Filesystem      Size  Used Avail Use% Mounted on
overlay          40G  4.9G   33G  14% /
tmpfs           6.4G     0  6.4G   0% /dev
tmpfs           6.4G     0  6.4G   0% /sys/fs/cgroup
/dev/sda1        46G  5.6G   40G  13% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs           6.4G     0  6.4G   0% /sys/firmware
```

あと **33GB** 使えます。
次にダウンロードを行います。

```python
# download data for competition
## Before download data, you should accept competition rules at https://www.kaggle.com/c/<competition-name>/rules.
## Reference: https://github.com/Kaggle/kaggle-api
## When I ran it ended within 1 minute
!kaggle competitions download -c talkingdata-adtracking-fraud-detection
```

私が実行した時は 1分かからないくらいでダウンロードが終わりました。

```text
train.csv.zip: Downloaded 1GB of 1GB
train_sample.csv.zip: Downloaded 1MB of 1MB
test.csv.zip: Downloaded 162MB of 162MB
sample_submission.csv.zip: Downloaded 40MB of 40MB
test_supplement.csv.zip: Downloaded 494MB of 494MB
```

ダウンロードした後のストレージ使用状況を確認します。

```python
!df -h
```

```text
Filesystem      Size  Used Avail Use% Mounted on
overlay          40G  6.8G   31G  19% /
tmpfs           6.4G     0  6.4G   0% /dev
tmpfs           6.4G     0  6.4G   0% /sys/fs/cgroup
/dev/sda1        46G  7.5G   38G  17% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs           6.4G     0  6.4G   0% /sys/firmware
```

残り **31GB** になりました。

またダウンロードしたファイルは `/content/.kaggle/competitions/` の下に配置されます。

```python
# file path
!ls /content/.kaggle/competitions/talkingdata-adtracking-fraud-detection/ -a
```

```text
.   sample_submission.csv.zip  test_supplement.csv.zip	train_sample.csv.zip
..  test.csv.zip	       train.csv.zip
```


## 6. コンペに提出

上記のファイルを使ってモデルを構築して予測を行ったとします（本稿では触れません）。

予測結果は以下のようにして提出することができます。
コマンドだけで完結できるので楽です。

```python
# submit
!kaggle competitions submit -c <competition-name> -f <submit.csv> -m "My submission message"
```

# さいごに

* コンペむずかちいけどたのちいです
* 一緒に参加してくれる方募集中です
  * twitter@fam_taro まで