Dragon Arrow written by Tatsuya Nakaji, all rights reserved animated-dragon-image-0164

Google Collaboratory で kaggle を扱う

Jan 09, 2020

Google Collaboratory で kaggle を扱う


Google Colaboratory


完全にクラウドで実行される Jupyter ノートブック環境です。設定不要で、無料でご利用になれます。

Colaboratory を使用すると、コードの記述と実行、解析の保存や共有、強力なコンピューティング リソースへのアクセスなどをブラウザか

らすべて無料で行えます。


Kaggle


Kaggleは企業や研究者がデータを投稿し、世界中の統計家やデータ分析家がその最適モデルを競い合う、予測モデリング及び分析手法関連プラットフォーム及びその運営会社である。 モデル作成にクラウドソーシング手法が採用される理由としては、いかなる予測モデリング課題には無数の戦略が適用可能であり、どの分析手法が最も効果的であるか事前に把握することは不可能であることに拠る。


メリット


CPUだけのPCでは、計算に時間がかかりすぎたり、データをダウンロードする空きがなかったりする。

そこで、Colabortoryでレンタルマシンを使って、kaggleの機械学習を行う。


手順


1. kaggle.jsonをkaggleからダウンロード


https://www.kaggle.com/

よりログインして、右上のプロフィール画像、"My Account"の順にクリックする



これでkaggle.jsonがダウンロードされます。


(kaggle.json)

{"username":"######","key":"xxxxx"}




2. Google Colaboratory に kaggle.jsonを配置

やり方は2通りある。

なお、jupyter notebookのセルからコマンドを実行するときは ! を先頭につける


・method_1 .kaggleに配置


コマンドのインストール

!pip install kaggle


ダウンロードしたkaggle.jsonを~/.kaggle/kaggle.jsonに設置して、以下のコマンドを実行

!chmod 600 ~/.kaggle/kaggle.json


以上でkaggleコマンドが使えるようになる。コマンドについて、詳しくは以下のドキュメントを見る。

https://github.com/Kaggle/kaggle-api



・method_2. 環境変数に渡す

kaggle.jsonの usernameパラメータを"KAGGLE_USERNAME"という環境変数に、

とkeyパラメータを"KAGGLE_KEY"という環境変数に渡す。


export KAGGLE_USERNAME=##########
export KAGGLE_KEY=xxxxxxxxxxxxxx

もしくは、

import os
os.environ['KAGGLE_USERNAME'] = #######
os.environ['KAGGLE_KEY'] = xxxxxxxxxxx
# print("KAGGLE_USERNAME: " + os.environ["KAGGLE_USERNAME"])
# print("KAGGLE_KEY: " + os.environ["KAGGLE_KEY"])

以上でkaggleコマンドが使えるようになる。


[method_1のメリットとデメリット]

メリットは、とにかく簡単。.kaggleフォルダを作って配置するだけ。

デメリットは、Google Colaboratoryが再起動したり、初期化されるたびに、わざわざkaggle.jsonを配置しなければならない。(フォルダやファイルは消えて初期状態に戻るため)

しかし、Google Colaboratoryではなく自分の実機パソコンでkaggleを行う場合、初期化はされないため、間違いなくこのやり方が良い。


[method_2のメリットとデメリット]

 メリットは、Google Colaboratoryが再起動したり、初期化されようが、再び実行するだけでよい(ファイルをいちいち手動で配置する必要がない)

デメリットは、ファイルの内容が他人に見せられない。理由は、環境変数で渡す時に、kaggle.jsonの内容が含まれているから。


そこでどうする...


筆者のやり方


[Google Driveにkaggle.jsonを配置]


Google DriveのMy Driveにkaggleフォルダを作り、kaggle.jsonを配置

当然ながら、colaboratoryが初期化されても、GoogleDriveは初期化されないので、毎回jsonファイルを読み込んで環境変数で渡せば良い。


[コード公開]

Google Driveに接続

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

GoogleDriveの「My Drive/kaggle/kaggle.json」から読み込んで、環境変数に渡す

import os
import json
f = open("/content/drive/My Drive/kaggle/kaggle.json"'r')
json_data = json.load(f) #JSON形式で読み込む
os.environ['KAGGLE_USERNAME'] = json_data['username']
os.environ['KAGGLE_KEY'] = json_data['key']
# print("KAGGLE_USERNAME: " + os.environ["KAGGLE_USERNAME"])
# print("KAGGLE_KEY: " + os.environ["KAGGLE_KEY"])

これでkaggleコマンドが使える。

Google Colaboratoryが初期化されてもGoogle Driveから読み込むので問題なし。

認証トークンもバレずに済む!


よく使うコマンドのおまけ


・kaggleデータセットのダウンロード

!kaggle competitions download -c "コンペ名" -p "ダウンロードファイルが置かれるパス"


・ダウンロードファイルがzip形式の時に開封する

!unzip -u "zipファイルのパス"


・データをデータフレームで読み込む

import pandas
import os
DATA_FOLDER = '/root/dataset'
# DATA_FOLDER = '~/dataset' # 上と同じ意味 ~は /rootを意味する
train = pd.read_csv(os.path.join(DATA_FOLDER, 'train.csv'))
test = pd.read_csv(os.path.join(DATA_FOLDER, 'test.csv'))


・データフレームで読み込んだ後はきちんと確認

print("----------先頭データ----------")
print(train.head(5))
print("-----------統計情報-----------")
print(train.info())
print("-----------データの型-----------")
print(train.dtypes)
print("----------非存在-----------")
print(train.isnull().sum())
print("----------欠損値-----------")
print(train.isna().sum())
print("----------Shape----------")
print(train.shape)


・kaggleに予測結果のcsvファイルを提出するとき

!kaggle competitions submit -c "提出するコンペ名" -f "提出するファイル" -m "メッセージ"


・データフレームをcsvファイルで出力(pandas)

MySubmissionDataframe.to_csv('submission.csv', index=False)


・データフレームをpickleファイルとして保存(python)

TrainingData.to_pickle('train.pkl')

pd.read_pickle('train.pkl')で読み込み


・配列や変数をpickleファイルとして保存(python)

pickle.dump(Y_predict, open('Y_predict.pickle', 'wb'))