と。

統計学は趣味、マーケティングは義務。

xonshを使ってkaggle APIでkernelにpushする

はじめに

  • kaggle APIはローカルPCのターミナル(コマンドプロンプト)からshellコマンドでkaggleの環境を操作することができる呪文.Pythonで実装されている
  • xonshはPythonで実装されている(?)shell
  • kaggle APIã‚’xonshで動かせばxonsh人口もkaggle API人口も増えて幸せなのではないか?

というわけでkaggle APIをxonshから使ってみましょう. ただ,1から書いていくとアレなので主に

  • xonshからkaggle APIへのアクセス
  • xonshからkaggle APIを通してkernelにPush

の部分を記録します.kaggle APIやxonshの導入については以下を参照してください. また,installationには日本語の記事もありますので参照してください*1

xonsh

xon.sh

日本語による紹介記事

vaaaaaanquish.hatenablog.com

kaggle API

github.com

日本語による紹介記事

www.currypurin.com

前提

  • kaggle APIとxonshは導入できつつある*2
  • 私はwindowsという保守的なOSを使っている上,ほかのOSでの動作検証はしていないので,動作の保証はできません.

つかkernelって何?

kernelはブラウザ上でkaggleのコンペティションに使っているコードを実行できる環境です. 実行だけじゃなくて編集もできます.すごいね! ローカルPCのスペックに不安のあるキミも,買ったばっかりのPCのファンが悲鳴を上げ始めたキミも, マシンスペックをkernelに頼ればあとは好きにCodingしてCommitしよう!

kaggle APIを導入する

詳細は上の記事を参考にしていただきつつ,簡単に導入プロセスを確認します.

  1. Pythonでpip install kaggle
  2. kaggleのページでAPIトークンを取得
  3. 特定のフォルダ(win: C:\Users\<UserName>\.kaggle)に保存
  4. cmdでkaggle -h

これでエラーなくヘルプっぽい文章がでれば成功です.

xonshを導入する

詳細はry

  1. Pythonでpip install xonsh windowsの場合,公式ドキュメントよると以下のコマンドでインストールしてほしそうにしています.
conda config --add channels conda-forge
conda install xonsh

私はこっちで実装しました.環境に応じて適宜.

  1. cmdにxonshと打つ.

これでそれっぽい画面が出たらxonsh成功です!

xonshからkaggle APIを叩く

基本的にxonshはPythonが動くShellなので,上記のInstallationが滞りなく進めば,xonsh上でkaggle -hコマンドを打つとちゃんと動いているはずです.

xonshからkaggle APIを使ってkernelにコードをpushする

とりあえず何が必要なのか,公式ドキュメントとヘルプを見てみましょう. どうやらAPIとしてはkernelsでカーネルを操作できるらしいですね! xonshでkaggle kernel -hを打つとこんな感じの画面が!

f:id:kinuit:20190310175149p:plain

イケてんな.

しかも過去に実行したことのあるコマンドと似ていると「お前コレ打とうとしてない?」ってやってくれます.

f:id:kinuit:20190310175321p:plain

イケてんな.

……それはともあれ,ちょっとkernelをプッシュしてみましょう.

今回はいつもどおりTitanic

www.kaggle.com

データダウンロード

せっかくだしこっからはじめましょう.TitanicのページにあるDataタブをクリックすると, ご丁寧にkaggle APIコマンドがあります.しかもコピーできる. xonsh上で

kaggle competitions download -c titanic

を打つか,xonshのターミナル上で右クリックするとペーストされます*3. こうするとxonshの動いているディレクトリ上にデータがDLされていると思います.*4

メタデータファイルを生成

kaggleをpushするためには,どうやらメタデータが必要な様子です. kaggle kernels initコマンドを実行するとメタデータのjsonファイルが生成されます. jsonファイルをエディタか何かで開いて,このドキュメントをベースに逐次情報を書き込み,保存ましょう.

pushしたいスクリプトを生成

今回はとりあえずcsvを読み込んでみましょう. ついでに挨拶もしときましょう.

import pandas as pd
import numpy as np

train_df = pd.read_csv("../input/train.csv")
test_df  = pd.read_csv("../input/test.csv")

train_df.describe()
print("hello, kaggler!")

push準備

コードを書いたらさっき作ったjsonファイルを編集します.一部は事前でも編集できますが,まあ順序はお好みで.味は変わりません.

  • id: kernelのアドレス

通常UserName/おすきなkernelの名前を入れるといいと思います.必須.記号はハイフンのみ有効?(未検証)

  • title: kernelのタイトル

idで指定した名前と同じようにするといいでしょう. - code_file: kernelにpushしたいファイル

コードのファイル名を指定します.メタデータのあるフォルダからの相対パスでいけますが不安なら絶対パスぶっこんでも問題ないです.

  • language: kernelの言語

pushしたいファイルが何で書かれているかを指定します.python,r,rmarkdownが選べます.

  • kernel_type

scriptかnotebookかを選べます.

  • is_private

kernelの公開情報を指定できます.デフォルトはtrueです

kernelのGPUを使うかどうかを指定できます.

おそらくpushコマンド実行後,インターネット接続を確立し続けるかみたいなことだと思います. デフォルトはfalseです.

  • enable_internet

インターネット接続云々情報ですが,謎です.デフォルトはfalse

  • dataset_sources

データセットの出処がkaggleで公開されたデータセットの場合,ここにデータセット名を書き込みます.

  • competition_sources

データセットの出処ががkaggleのコンペティションの場合,ここにコンペティション名を書きます.

  • kernel_sources

多分他の人のkernelをpullしたときに,kernel名を指定します.

という感じです.公式ドキュメントに丁寧に書いてるのでそちらも参考に. 今回の場合はこんな感じになります

{
  "id": "UserName/my-first-kernel",
  "title": "My First Kernel",
  "code_file": "hoge.py",
  "language": "python",
  "kernel_type": "script",
  "is_private": "true",
  "enable_gpu": "false",
  "enable_internet": "false",
  "dataset_sources": [],
  "competition_sources": ["titanic"],
  "kernel_sources": []
}

push

ここまでできたら簡単です.jsonファイルが保存されている場所でxonshを立ち上げて,kaggle kernels pushと打ってEnterを音高く鳴らします.

そうすると

Kernel version 1 successfully pushed. Please check progress at https://www.kaggle.com/jsonのidで指定したアレ

というメッセージが!これでpush成功です.kaggleのページに行くとkernelの環境下で実行もできています

f:id:kinuit:20190310185434p:plain

おわりに

ながくなりましたが,こんな感じでxonshからローカルで組んだコードをkernel環境で実行することができそうです. jsonファイルがちょっと面倒ですが多分そのへんも自動化する術はあるでしょう.

せっかくのAPI,使い倒してやりましょう.

*1:多くはないのでこの記事しかないというところもあります.これから流行るものという確信をもってやっていきましょう.

*2:この前提の時点でこの記事の価値は10円ガムよりも安い

*3:windows10のコマンドプロンプトはCtrl+C/Vでコピペできるんですが,xonshはそれができないようです.

*4:ディレクトリを移動したい場合,UNIXコマンド同様cdコマンドで移動できます.