やること
- Kaggle公式イメージ(kaggle/python)をつかってコンテナ起動
-
kaggle ~
コマンドでcsvファイルをダウンロードする -
kaggle ~
コマンドで公開notebookをダウンロードする
まずはまとめ
-
kaggle.json
をDL (kaggle.com > My Account > Create New API Tokenボタン) -
$ docker run -it --rm --mount type=bind,src=
pwd,dst=/root/dev kaggle/python
$ pip install kaggle
$ mkdir ~/.kaggle
$ cp /root/dev/kaggle.json ~/.kaggle
$ chmod 600 ~/.kaggle/kaggle.json
$ kaggle competitions download -c titanic -p input/titanic
$ unzip input/titanic/titanic.zip input/titanic
$ kaggle kernels pull arthurtok/introduction-to-ensembling-stacking-in-python -p ./
データセットはタイタニックコンペのものをダウンロードしてます
問題なく動いた方はここで閉じでもらって大丈夫です
環境
macOS 10.14.6 (Mojave)
Docker 19.03.4
なんでDockerつかうの?
- notebook不安定
- VSCodeでコード書きたい
- グローバル環境を汚したくない
- pipとcondaの衝突コワイ
- Kaggle公式イメージがあるので安心
Kaggle APIってなにさ?
Kaggleのサイト上でやってる操作をコマンドラインでできちゃうやつ
たとえば?
- データセットのダウンロード
- サブミット
- 参加可能コンペを一覧表示
- リーダーボードをダウンロード
などなど…
詳しくは公式リポジトリを
kaggle competitions {list, files, download, submit, submissions, leaderboard}
kaggle datasets {list, files, download, create, version, init}
kaggle kernels {list, init, push, pull, output, status}
kaggle config {view, set, unset}
こんな構成をつくっておきます
kaggle_titanic
├── input
│ └── titanic <- ここにcsvファイルをダウンロードできれば勝ち
└── working <- ここにipynbファイルをダウンロードできれば優勝
Kaggle API Tokenを取得
kaggle.json
がダウンロードされるので kaggle_titanic
ディレクトリに保存しておく
中身はこんなかんじ
{"username":"anata_no_namae","key":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
ちなみに
こっちでトークンを無効化できます
「まちがえてGitHubにkaggle.jsonもプッシュしちまった!」みたいな時が押し時
コンテナ起動
Kaggleの公式イメージ kaggle/python
をつかう
kaggle_titanicディレクトリで以下のコマンド
docker run -it --rm --mount type=bind,src=`pwd`,dst=/root/dev kaggle/python
オプションの説明なんかはココに書いているのでもしよろしければ
-> 【画像で説明】DockerでAnaconda環境をつくり、コンテナの中でVSCodeを使う
ここからはコンテナ側のシェルで
マウントしたディレクトリに移動
cd /root/dev
中身が同期されてればOK
ls
input kaggle.json working
kaggleパッケージをインストール
pip install kaggle
ちゃんと動くかバージョン確認してみる
kaggle -v
Traceback (most recent call last):
File "/opt/conda/bin/kaggle", line 7, in <module>
from kaggle.cli import main
File "/opt/conda/lib/python3.6/site-packages/kaggle/__init__.py", line 23, in <module>
api.authenticate()
File "/opt/conda/lib/python3.6/site-packages/kaggle/api/kaggle_api_extended.py", line 149, in authenticate
self.config_file, self.config_dir))
OSError: Could not find kaggle.json. Make sure it's located in /root/.kaggle. Or use the environment method.
めっちゃ怒ってきよる
kaggle.jsonが見当たらんみたいなこと言ってますね
kaggle.jsonを配置
~/.kaggle/
ディレクトリをつくってその中にkaggle.json
をコピーします
※$ kaggle -v
のタイミングで~/.kaggle/
ディレクトリが作られている場合がありますが問題ないです
mkdir ~/.kaggle # <- すでにディレクトリあるよーっていわれるかもしれないけど気にせず
cp /root/dev/kaggle.json ~/.kaggle
今度こそ
kaggle -v
Warning: Your Kaggle API key is readable by other users on this system! To fix this, you can run 'chmod 600 /root/.kaggle/kaggle.json'
Kaggle API 1.5.6
一応つかえるけど、まだ怒ってるな
他のユーザーにもAPI Keyが読めちゃうから権限変えなさいって
権限変更
chmod 600 ~/.kaggle/kaggle.json
次こそは
kaggle -v
Kaggle API 1.5.6
ふぅ
毎回やるのめんどい
ここの一連の処理はまとめてセルで実行してもいいかもです
ファイル化して使い回すって作戦もあります
!pip install kaggle
!mkdir ~/.kaggle
!cp /root/dev/kaggle.json ~/.kaggle
!chmod 600 ~/.kaggle/kaggle.json
それではデータのダウンロード
-c
でコンペ名指定
-p
保存先パス指定
kaggle competitions download -c titanic -p input/titanic
ls input/titanic
titanic.zip
titanic.zip
がダウンロードされました
コンペ名はURL上の表記をつかう
例えば Severstal: Steel Defect Detection
コンペであればコレ
解凍
ダウンロードしたtitanic.zip
を解凍
unzip input/titanic/titanic.zip -d input/titanic
ls input/titanic
gender_submission.csv test.csv titanic.zip train.csv
gender_submission.csv
, test.csv
, train.csv
の3つが入ってました
これでデータセットのダウンロードはOK
次はnotebookをpullしてみる
kaggle kernels pull arthurtok/introduction-to-ensembling-stacking-in-python -p ./working
ls ./working
introduction-to-ensembling-stacking-in-python.ipynb
ちゃんとpullされているので優勝
VSCodeをあわせてつかうと便利かも
インテリセンスや自分キーバインドなどでコード書けるのがいい
【画像で説明】DockerでAnaconda環境をつくり、コンテナの中でVSCodeを使う
jupyterつかいたい人はこう
コンテナ起動時に-p 8888:8888
オプションを追加 (ホスト側とコンテナ側のポートを紐付ける)
docker run -p 8888:8888 -it --rm --mount type=bind,src=`pwd`,dst=/root/dev kaggle/python
そしてこんなかんじでjupyterを立ち上げる ※オプションの説明は[こちら](https://qiita.com/komiya_____/items/96c14485eb035701e218#dockerfile)
jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token=''
ブラウザのアドレスバーからlocalhost:8888
をひらけばOK
おしまい
最後まで読んで頂いてありがとうございました