nanoseeingの技術系ブログ

機械学習・競プロなど。アウトプットが目的。

Google Colab上でKaggleのダウンロードからサブミッションをするまで

Kaggleの実行環境は何かと不便(週あたりの制限時間があるなど)。 そのため、Google Colab上でダウンロードからサブミッションまでを全てやってみる。


コンペは、タイタニックで試す。 www.kaggle.com

Google Driveに接続

入力データなどは、全てDrive上に保存しておくと便利。
まずは、Driveに接続する。

from google.colab import drive
drive.mount('/content/drive')

認証コードを聞かれるので、URL先からコピペすること。

なお、Driveのフォルダ構成は、以下を想定している。

(Drive直下)
MyDevelopment/
  |-Kaggle/
  |  |-kaggle.json
  |  |-titanic/
  |     |-input/
  |     |-output/
  |-my_modules/

kaggleライブラリを読み込む

Kaggle APIを使いたいため、kaggleライブラリをimportする。
単純にpipでインストールしてやればよいが、Google Colabが再起動されるたびにインストールし直さなければならず面倒。そのため、Drive上にモジュールを保存し、パスを教えてやることで解決する。

import sys
module_path = '/content/drive/MyDrive/MyDevelopment/my_modules/'

# kaggleライブラリをDrive上に保存していない場合は、pipから保存する。
# !pip install --target=$module_path kaggle

# パスを追加
sys.path.append(module_path)

jsonファイルの保存、読み込み

kaggle.jsonファイルは、Kaggleのプロフィールページから作成できる(Your Profile > Account > API > Create New API Token)

jsonファイルを作成できたらDrive上に保存する。

jsonファイルを読み込んで、Colab上の環境変数を設定してやることで、Kaggle APIが使えるようになる。

import json

json_file_path = '/content/drive/MyDrive/MyDevelopment/Kaggle/kaggle.json'
os.chmod(json_file_path, 777)

with open(json_file_path, 'r') as f:
    json_data = json.load(f) 
    os.environ['KAGGLE_USERNAME'] = json_data['username']
    os.environ['KAGGLE_KEY'] = json_data['key']

データのダウンロード

「kaggle competitions download -c (コンペ名)」で、データをダウンロードできる。コンペティションページのdataタブを開くと、コマンドをコピペできるので、それを使っても良い。

今回は、下記ページのコマンドをコピペして、タイタニックのデータをダウンロードしてみる。
https://www.kaggle.com/c/titanic/data

import kaggle

input_path = '/content/drive/MyDrive/MyDevelopment/Kaggle/titanic/input/'
os.chdir(input_path)

# データのダウンロード
! kaggle competitions download -c titanic

提出用ファイルを作成

適当な前処理と、ランダムフォレストで学習してみる。
提出用ファイルはoutputフォルダに出力した。

import os
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier

# ルートパスを設定して移動
root_path = '/content/drive/MyDrive/MyDevelopment/Kaggle/titanic/'
os.chdir(root_path)

# データ読み込み
train_path = './input/train.csv'
test_path = './input/test.csv'
gender_submission_path = './input/gender_submission.csv'

train = pd.read_csv(train_path)
test = pd.read_csv(test_path)
gender_submission = pd.read_csv(gender_submission_path)

# 前処理

data = pd.concat([train, test], sort=False)

data['Sex'].replace(['male', 'female'], [0, 1], inplace=True)
data['Embarked'].fillna(('S'), inplace=True)
data['Embarked'] = data['Embarked'].map({'S': 0, 'C': 1, 'Q': 2}).astype(int)
data['Fare'].fillna(np.mean(data['Fare']), inplace=True)
data['Age'].fillna(data['Age'].median(), inplace=True)

delete_columns = ['Name', 'PassengerId', 'Ticket', 'Cabin']
data.drop(delete_columns, axis=1, inplace=True)

# 学習
train = data[:len(train)]
test = data[len(train):]

y_train = train['Survived']
X_train = train.drop('Survived', axis=1)
X_test = test.drop('Survived', axis=1)

clf = RandomForestClassifier(n_estimators=100, max_depth=2, random_state=0)
clf.fit(X_train, y_train)

# 予測
y_pred = clf.predict(X_test)
sub = pd.read_csv(gender_submission_path)
output_sub_path = './output/submission_randomforest.csv'
sub['Survived'] = list(map(int, y_pred))
sub.to_csv(output_sub_path, index=False)

サブミッション

「! kaggle competitions submit (コンペ名) -f (提出ファイル) -m "(コメント)"」でサブミッションできる。

実際に試してみる。

! kaggle competitions submit titanic -f $output_sub_path -m "test submission"


下記サブミッションページから結果を確認。
https://www.kaggle.com/c/titanic/submissions

f:id:nanoseeing:20210303143101p:plain
サブミッション結果

うまくいった。

みなさんも良いKaggleライフを。