kaggleパッケージをインストールして、VS Codeの統合ターミナルからKaggle APIにkaggleコマンド を使ってアクセスし、ローカル環境でKaggleノートブックを実行してみましょう。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
筆者は前回までKaggleのTitanicコンペティションに取り組みながら、EDAや特徴量エンジニアリング、ハイパーパラメーターチューニングがどんな感じかを体感してきました。が、今回はガラリと話を変えて、Kaggleのコンペティション(以下、コンペとします)にVisual Studio Code(以下、VS Code)で参加する方法を見てみます。
何かとVS Codeに話題を持っていくのは悪い癖かもしれません(笑)。[かわさき]
僕もほとんどVS CodeでKaggleしていますよ。VS CodeのJupyterノートブック機能がどんどん良くなってきていますからね。他の人がVS Codeをどう使っているのかは気になるので、お勧めの設定とか知りたいです。[一色]
Kaggleが提供するWebベースのノートブック環境はそれなりに使いやすいのですが、普段からコードはVS Codeで書いているのであれば、KaggleについてもVS Codeを使って挑戦したいと考えるかもしれません。
筆者は「WebならWebでそれなりに、VS CodeならVS Codeでそれなりに」派なのですが、VS Codeでノートブックを書き始めると、やはり手になじんでいるなぁという感覚はあります。
KaggleはそのAPIにコマンドラインまたはPythonコードからアクセスすることを可能とするkaggleパッケージを提供しています。今回はこれを使って、VS Codeの統合ターミナル(というか、コマンドライン)からKaggleの機能にアクセスしてみることにしましょう。
どういうことかというと、統合ターミナルを使ってKaggleからデータセットやノートブックをダウンロードして、それをVS Code内で実行し、その結果をサブミットしてみよう、ということです。
kaggleパッケージを使う前には、もちろん、これをインストールしておく必要があります。「pip install kaggle」などのコマンドを実行しておいてください。
このとき、Windowsで「py」コマンドを使って、Python処理系を起動するようになっている場合(「C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python310」などのPython処理系が格納されているディレクトリにパスが通っていない場合)には、kaggleパッケージをインストールしても、コマンドラインからkaggleコマンドを実行できないことには注意してください。このときには、環境変数PATHに使用するPython処理系のディレクトリ(とその下にあるScriptsディレクトリ)を追加するか、Kaggleに取り組むプロジェクトを含むディレクトリ内にvenvモジュールなどを使って仮想環境を構築した上で、その仮想環境にkaggleパッケージをインストールします。
本稿では、Windows上で仮想環境を構築して、そこにkaggleパッケージをインストールした状況を例として画面をキャプチャーすることにします。
kaggleパッケージをインストールしただけでは、kaggleパッケージを使うことはできません。KaggleのユーザーとしてAPIにアクセスするためのクレデンシャルが必要です。これを取得するには、まずKaggle公式サイトの右上にある自分のアカウントのアイコンをクリックし、そこから[Account]を選択します。
そして、表示されたページを下にスクロールしていくと、[API]というセクションがあるので、そこで[Create New API Token]ボタンをクリックします。
これにより、kaggle.jsonファイルがダウンロードされます。このファイルに自分のユーザー名と、Kaggle APIにアクセスするためのキーが保存されているので、これをKaggleの構成ファイルを保存するディレクトリに保存してください。macOSを含むUNIX系統のOSでは「~/.kaggle/kaggle.json」として保存します。Windowsでは「C:\Users\<ユーザー名>\.kaggle\kaggle.json」となります。環境変数KAGGLE_CONFIG_DIRを使って、kaggle.jsonファイルを保存する位置を変更することも可能です。
kaggle.jsonファイルには自分のユーザー名とKaggle APIにアクセスするためのキーが含まれているので、自分以外のユーザーに読み取られないようにしておく必要もあります。UNIX系統のOSでは「chmod 600 ~/.kaggle/kaggle.json」とします。Windowsではファイルのプロパティから適宜設定をしてください。
あるいは環境変数KAGGLE_USERNAMEとKAGGLE_KEYに上記のファイルに含まれている情報を記述することも可能です。
準備完了! というわけで、試しに使ってみましょう。
本稿の冒頭でも述べましたが、kaggleパッケージにはコマンドラインツールとして使う方法と、「import kaggle」行を実行して、その後、PythonのコードからKaggle APIを呼び出す方法があります。以下ではコマンドラインツールとして、これを使ってみます。
コマンドラインツールとしてのkaggleパッケージの基本的な構文は以下のようになります。
最初の「コマンド1」は、今からどのカテゴリの処理を行うかを以下の4つの中から指定します。
コマンド | 説明 |
---|---|
competitions/c | コンペに関する処理を行う |
datasets/d | データセットに関する処理を行う |
kernels/k | カーネル(ノートブックやユーティリティースクリプトの実行環境)に関する処理を行う |
config | 構成に関する処理を行う |
kaggleコマンドに与える最初の引数 |
「config」以外は全て複数形になっていることに注意してください。
表にも書きましたが、competitions/datasets/kernelsの各コマンドにはそれぞれc/d/kという短縮形もあるので、慣れてきたら短縮形を使うことをお勧めします。
「コマンド2」に指定できるのは「コマンド1」に応じて変わります。例えば、「competitions」であれば、コンペの一覧を取得する「list」、コンペで使用するデータセットをローカルにダウンロードする「download」、推測結果を提出する「submit」などを指定可能です。
どんなコマンドを指定できるかは「kaggle コマンド1 --help」とすることで一覧できます。例えば、以下はコマンドパレットから[Python: Create Terminal]コマンドを実行して、仮想環境を有効化したターミナルをオープンして、「kaggle kernels --help」コマンドを実行したところです。
「コマンド2」を指定した状態で「--help」オプションを指定して、kaggleコマンドを実行すると、さらに詳細なヘルプが表示されます。例えば、以下は「kaggle kernels pull --help」コマンドを実行したところです。
このコマンドは、kernel引数に「ユーザー名/カーネル名」を指定することで、Kaggle上のカーネルからローカル環境にコード(ノートブック)をダウンロードするものです。このときには「-p」「--path」オプションにダウンロード先を指定できることが上の結果からは分かりますね。
このように、特定のコマンドを初めて使うときや、使い方に不安があるときには「--help」を付加することでヘルプを表示できるので活用しましょう。
というわけで、以下では幾つかのコマンドを実際に使いながら、ノートブックやデータセットのダウンロードなどを行ってみます。
「kaggle competitions」コマンドあるいはその短縮形である「kaggle c」コマンドを使うと、コンペに関する処理を行えます。まずはどんなコンペがあるかを調べてみましょう。これには「kaggle competitions list」コマンドを実行します。
さまざまなコンペがあることが分かります。「ref」列にはコンペの識別子が表示されています。例えば、上から6行目にはTitanicコンペを表す「titanic」が表示されています。この後で実際に行いますが、Titanicコンペのデータセットをダウンロードするには「kaggle competitions download」コマンドで今述べた識別子「titanic」を指定することになります。
「category」列にはコンペのカテゴリが表示されています。特定のカテゴリのコンペを一覧するなら、「kaggle c list --category カテゴリ」を実行できます(カテゴリにはall/featured/research/recruitment/gettingStarted/masters/playgroundを指定可能)。
既に述べましたが、「kaggle competitions list」コマンドの詳細なヘルプについては「--help」オプションを付けて、このコマンドを実行してください。
この操作でTitanicコンペの識別子が「titanic」であることが分かりました。次に、このコンペで使用するデータセットをダウンロードしてみましょう。これには「kaggle competitions download」コマンドを使います。このコマンドではcompetition引数にコンペを指定する識別子を指定しますが、これに加えて、以下のようなオプションがあります(一部)。
オプション | 説明 |
---|---|
-f FILE_NAME --file FILE_NAME |
FILE_NAMEに指定したファイルのみを取得。省略時は全てのファイルを取得 |
-p PATH --path PATH |
PATHで指定したディレクトリにファイルを保存。省略時はカレントディレクトリにファイルを保存 |
-o --force |
同名ファイルがあった場合に上書きする |
kaggle competitions downloadコマンドで指定可能なオプション(一部) |
例えば、Titanicコンペのデータセットをカレントディレクトリにダウンロードするのであれば、「kaggle c download titanic」コマンドを実行すればよいということです。このコマンドを実行した結果を以下に示します。
実行結果を見ると分かる通り、titanic.zipファイルがダウンロードされました。Titanicコンペにはtrain.csv/test.csv/gender_submission.csvの3つのファイルがあったので、titanic.zipを展開すれば、これらが得られます。それはよいのですが、気を付けたいのは、これら3つのファイルと以前に特徴量エンジニアリングによって得た2つのCSVファイル(今回、実際の学習に使うのはこちらです。次の「kaggle datasets」コマンドで取得します)、それから「kaggle kernels pull」コマンドで取得するノートブックをどこに配置すればよいかです。
既にTitanicコンペに挑戦しているのであればお分かりでしょうが、CSVファイルが保存されているのは自分がノートブックを記述している作業ディレクトリの1つ上の階層にあるinputディレクトリでした。この階層構造をローカルの環境でも維持しないと、ノートブックにあるCSV読み込みコードを変更する必要が出てきます(そして、それをKaggleに書き戻すときには、Kaggle上で動くように元に戻す必要があります)。
というわけで、ここではカレントディレクトリにinputディレクトリを作成して、CSVファイルはそこに保存し、ノートブックは何か適当な名前のディレクトリを作成して、そこに保存することにします。
上の画面を見ると分かる通り、筆者のVS Codeでは統合ターミナルにはPowerShellを使っているので、「Expand-Archive」コマンドレットでZIPファイルを展開して、展開されたファイルを含むtitanicディレクトリをinputディレクトリに移動しました。macOSやLinuxならunzipコマンドなどを使って同様な操作を行えばよいでしょう。
次にデータセットに関する処理を行ってみます。といっても、ここでいうデータセットとは、Kaggleのユーザーが作成し、Kaggleにアップロードしたもののことです。ここでは、前々回に紹介したこちらのノートブックで作成して、Kaggleに自分用のデータセットとして追加してあるmytrain.csv/mytest.csvファイルをダウンロードしてみることにします。
その前に「kaggle datasets」コマンドで実行できる操作を幾つか挙げておきましょう(一部)。表に挙げたもの以外に、データセットを作成したり、データセットの改訂を行ったり、データセットに付随するメタデータの初期化やダウンロードを行ったりするコマンドもありますが、ここでは省略します。また、「datasets」の代わりに省略形として「d」を使用できることも思い出してください。
コマンド | 説明 |
---|---|
list | データセットの一覧を取得 |
files | 指定したデータセットに含まれるファイルの一覧を取得 |
download | 指定したデータセットをダウンロード |
init | データセットに関するメタデータを初期化 |
metadata | データセットのメタデータをダウンロード |
「kaggle datasets」コマンドで使用できるコマンド(一部) |
ここでは触れませんが、データセットをアップロードするときには、対応するメタデータ(dataset-metadata.jsonファイル)を、データセットが保存されているフォルダに置いておく必要があります。「kaggle d init」「kaggle d metadata」の2つのコマンドはこれに関連しています。詳細については「Dataset Metadata」などを参考にしてください。
「kaggle d version」というコマンドもあります。ということは、データセットもバージョン管理が可能ってことですね。
Kaggleサイトのデータセットページで、タイトルの下にある[(Version ○○)]という部分をクリックすると、バージョン履歴が表示されて過去バージョンのデータセットも取得できますよ。
知らなかった〜〜〜。orz
例として、自分が作成したデータセットの一覧を「kaggle d list」コマンドで取得してみましょう。単純に「kaggle d list」コマンドを実行すると、以下のようにさまざまなユーザーが作成したデータセットが一覧されます。
自分が作成したデータだけを取得するには「-m」「--mine」オプションを指定します。以下は、これを実行した結果です。他のオプションについてはヘルプを参照してください。
これを見ると、試行錯誤している中で3つのデータセットを作っていたことが分かりますね(きっと、データセットのバージョン管理を知っていれば、1つだけで済んだのでしょう)。 ここでは一番上のデータセットをダウンロードします。これには「kaggle d download」コマンドを使います。上の画像にあるref列に表示されている「ユーザー名/データセット識別子」をこのコマンドに指定すると、データセットがデフォルトではカレントディレクトリにダウンロードされます。
先ほど述べたように、ノートブックとデータセットの配置には気を使う必要があります。ここでは、先ほどと同様、ダウンロードしたZIPファイルを展開して、展開されたファイルを含むmy-titanic-dataディレクトリをinputディレクトリに移動しました。
最後にKaggleのノートブックをカーネルからダウンロードして、実行してみましょう。これには「kaggle kernels」コマンドかその省略形の「kaggle k」コマンドを実行します。ここでいう「kernel」とはノートブックやユーティリティースクリプトを編集したり実行したりするKaggle環境のことです。基本的には、新規にノートブックやユーティリティースクリプトを作成すると、それにひも付いたカーネルが作成されると考えてよいでしょう。
Kaggleに対して、カーネルに関する情報を取得したり、そこからコード(ノートブックやユーティリティースクリプト)をダウンロードしたり、逆にローカル環境からコードをアップロードしたりすることが可能です。以下に「kaggle kernels」で実行できるコマンドを以下に示します(一部)。
コマンド | 説明 |
---|---|
list | カーネルの一覧を取得 |
init | カーネルのメタデータを初期化 |
push | 指定したカーネルにコードをプッシュして、カーネルを実行 |
pull | 指定したカーネルからコードをダウンロード |
output | 直近にカーネルを実行した結果を取得 |
「kaggle kernels」で実行できるコマンド(一部) |
データセットと同様に、カーネルにコードをプッシュ(して実行)するにはメタデータが必要になります。「kaggle k init」コマンドはそのためのメタデータを初期化するものですが、「kaggle k pull」コマンドにはコードのダウンロード時に同時にメタデータを取得するオプションもあります(後述)。
なお、カーネルは「ユーザー名/カーネルを識別する名前」として識別されます。「カーネルを識別する名前」は一般にKaggleのWeb環境で左上に表示される名前だと思ってください(ファイルを公開する際のURLの最後にある「user_name/code_name」となっている部分でもあります)。
では、幾つかのコマンドを実行してみましょう。これまでもそうでしたが、まずは一覧の取得から始めます。以下は「kaggle k list」コマンドを実行したところです。
「kaggle k list」コマンドで自分が作成したカーネルだけを表示するには、先と同様に「-m」「--mine」オプションを指定します。以下は、これを実行した結果です。他のオプションについてはヘルプを参照してください。
ここでは一番上にある「titanic_with_sklearn.ipynb」というタイトルのカーネルからコード(ノートブック)をダウンロードすることにしました。
ここで気付きましたが、ノートブックの「.ipynb」とかユーティリティースクリプトの「.py」のような拡張子はカーネルの名前に付けなくてよいんですね(ぐぬぬ。それでユーティリティースクリプトの名前が「kfoldds_py.py」みたいな名前になっていたんだ)。
それにしても、分かりづらい名前のカーネルが多すぎる……。最初に名前をちゃんと付けるようにしないとダメですな。
なるほど、知らなかった。「○○_py.py」になる話を聞いて、僕が試したときにはそんな名前になっていなかった気がしていたのだけど、確かに自分は拡張子を書いていなかったかも。手持ちのノートブックは全て拡張子を書いていない。これも知っておくべきKaggle Tipsだね。
ちなみにColabノートブックも拡張子は不要だけど、Googleドライブに「ファイル」として残る都合上、拡張子を書いておいた方がローカルPCに同期したときに何かと便利だから、Colabでは必ず拡張子を書いています。かわさきさんも同じだとしたら、たぶんColab文化が伝染したのだと思う。
拡張子を付けないと、気が落ち着かないんですよねぇ。
これには「kaggle k pull」コマンドに「ユーザー名/カーネルを識別する名前」を指定します。ただし、ここではメタデータを同時に取得する「-m」「--metadata」オプションも指定することにしましょう。
ダウンロードができたら、ここではノートブックと同じ名前(拡張子を除く)のディレクトリを作成して、そこにダウンロードした2つのファイルを移動しました。これで、ノートブックに記述したコードからCSVファイルにアクセスする際には「1つ上のディレクトリにあるinputディレクトリの下にあるmy-titanic-dataディレクトリ」のようなKaggle環境と同じロジックが使えるハズです。
そして、以下がダウンロードしたノートブックをVS Codeで開いたところです。
おお、いきなり警告が出ているのは、仮想環境にNumPyなどのライブラリをインストールしていないからですね(あるあるネタ)。というわけで、必要なものもインストールしました(実際にはipykernelパッケージも必要になるので、これもインストールしています)。
後はローカルのカーネル(ノートブック実行環境)として、仮想環境のPythonを指定して、[すべてを実行]ボタンをクリックするだけです。
エラーなく実行が終われば、2つのCSVファイルが得られるはずです。そして、エラーなく実行できました。
ここではKaggleからファイルをいろいろと持ってきて、実行できるかどうかが問題で、推測結果はどうでもいいっちゃあどうでもいいので、できたCSVのうちsubmission_gridsearch.csvファイルをサブミットしてみましょう。これには「kaggle c submit」コマンドを実行します。
このときには、「-f」「--file」に続けてサブミットするファイルの名前を、「-m」「--message」に続けてサブミッションの内容に関する説明を、それからコンペの識別も指定します(「kaggle config set competition」コマンドでデフォルトのコンペを設定することもできますが、これについては触れません)。
というわけで、ここでは「kaggle c submit -f submission_gridsearch.csv -m 'submission from vscode' titanic」というコマンドを実行してみましょう。
そのスコアを知るには、「kaggle c submissions」コマンドにコンペの識別子を与えます。
一番上に「submission from vscode」というメッセージがあるので、どうやらうまく提出できたようですね。よかった!
といった感じで、kaggleパッケージを使って、Kaggleからローカル環境に必要なモノをダウンロードして、ノートブックを実行できました。最後に、「kaggle k push」コマンドでカーネルにノートブックをプッシュしようと思ったのですが、Windows環境ではCP932コーデックがUTF-8なファイルをデコードできずに失敗しました(macOSではディレクトリをちゃんと指定すれば、プッシュできることを確認)。
日本語を含むノートブックをKaggleにプッシュする安直な解決策はPython処理系をUTF-8モードで起動することになりそうです(Python 3.7以降では、環境変数PYTHONUTF8を1に設定することで、PythonのデフォルトエンコーディングをUTF-8に変更可能)。が、これって解決策としてよいか悪いかは微妙な気がしますね。システムワイドにこの環境変数を設定しちゃうと、既存のPythonファイルが逆に動かなくなるなんてことが考えられそうです。
自分の場合はそんな大変なことせずに、Windowsからプッシュできていた記憶があるのだけど……。やっぱりこういったことは属人的なノウハウで、人によってやり方が違うということですかね。
今すぐに思いだせるノウハウの一つは、settings.jsonファイルでKaggleのみ「"files.eol": "\n",」を設定したりしています。Kaggle上で\r\nはエラーになるので。あと、ダウンロードしたノートブックではなく、手元で新規に作成したノートブックをアップロードして上書きしていたかも。細かい部分が思いだせないのですが、他にも簡単なやり方があるかもしれません。
覚えていれば、いろいろと調べてみたいところです(たぶん、覚えていない)。
今回はkaggleパッケージをコマンドラインツールとして使ってみましたが、次はPythonコードからkaggleパッケージを使ってみることにしましょう。
Copyright© Digital Advantage Corp. All Rights Reserved.