環境編:VS CodeからPythonでKaggle APIを呼び出してみよう僕たちのKaggle挑戦記

Pythonのプログラム中で、kaggleパッケージをインポートして、コマンドラインではなくコードからKaggle APIにアクセスしてみます。役に立つかな?

» 2022年03月04日 05時00分 公開
[かわさきしんじDeep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「僕たちのKaggle挑戦記」のインデックス

連載目次

 前回は、Kaggleが提供するkaggleパッケージをインストールして、Visual Studio Code(以下、VS Code)の統合ターミナルからコマンドラインを使ってKaggle APIにアクセスしてみました。今回はkaggleパッケージを使ってPythonのコードからKaggle APIにアクセスしてみます。


かわさき

 と書いたのはよいのですが、正直、コマンドラインを使えば十分じゃないか? という気にはなります。なお、Kaggle APIのアクセスには何らかのリミットが設けられているようです。使いすぎにはご注意ください。[かわさき]



一色

 意見が違って面白いですが、私の場合は、結局、リーダーボードなど見たりするので、基本的な作業はKaggle Webサイト上で行うのが一番快適だと感じています。

 一方で、「Submissionの自動化」だけに限定してKaggle APIが便利だと感じています。Submission時のメッセージもコードで自由にカスタマイズできるので、コマンドよりも扱いやすいです。Submissionは何度も行う作業ですが、データセットのダウンロードなどは一度切りの作業なので、Kaggle APIだけでなくコマンドを使うことにもあまりメリットを感じていないですね。

 とはいえ、人によっては全く違う意見かもしれません。あくまで僕個人の感想なので、参考程度で見ていただけるとうれしいです。冒頭からコメントを書きすぎですね。ごめんなさい。[一色]


Kaggle API

 前回も述べましたが、Kaggle APIを使うには「pip3 install kaggle」などのコマンドを実行して、kaggleパッケージをインストールしておく必要があります。このときに、Windows環境でkaggleコマンドを使うのであれば、該当するコマンドにパスを通しておく必要があります。簡単なのは仮想環境を作り有効化した上で、そこにkaggleパッケージをインストールすることです。ここでは詳細な手順は省略します(今回はWindows環境で仮想環境を作成し、そこにkaggleパッケージをインストールしています)。

 加えて、クレデンシャルを取得しておく必要もあります。これには、Kaggle公式サイトで自分のアカウントページを表示して、[API]セクションで[Create New API Token]ボタンをクリックします。

アカウントページの[API]セクション アカウントページの[API]セクション

 ボタンをクリックすると、kaggle.jsonファイルがダウンロードされるので、これを「~/.kaggle/kaggle.json」(macOSを含むUNIX系のOS)または「C:\Users\<ユーザー名>\.kaggle\kaggle.json」(Windows)として保存しておきましょう。

 この手順については前回の記事でもう少し詳しく触れているので、そちらも参考にしてください。

Pythonのコードからkaggle APIにアクセスするには

 PythonのコードからKaggle APIにアクセスするには、kaggleパッケージをインポートして、そこからKaggleAPIクラスのインスタンスメソッドを呼び出す形になります。簡単なのは次のように、kaggleパッケージが提供するapiオブジェクトをインポートすることです。

from kaggle import api

print(type(api))  # <class 'kaggle.api.kaggle_api_extended.KaggleApi'>

kaggleパッケージからapiオブジェクトをインポート

 このapiオブジェクトはkaggleパッケージの__init__.pyファイルで定義されていて、認証まで済んでいます。

 あるいは次のように明示的にKaggleApiクラスのインスタンスを生成してもよいでしょう。この場合にはauthenticateメソッドを呼び出して、アカウントの認証を行っておく必要があります。

from kaggle import KaggleApi

api = KaggleApi()
api.authenticate()
print(type(api))  # <class 'kaggle.api.kaggle_api_extended.KaggleApi'>

KaggleApiクラスのインスタンスを明示的に生成

 KaggleApiクラスのインスタンスを入手して認証が済めば、後はこのインスタンスのメソッドを呼び出すだけです。

 よく使いそうなものをざっくりとまとめておきましょう。

メソッド 説明
competitions_list コンペティション(以下、コンペ)一覧の取得
competition_list_files 指定したコンペで用意されているデータファイル一覧の取得
competition_download_file 指定したコンペの指定したデータファイルをダウンロード
competition_download_files 指定したコンペの全てのデータファイルをダウンロード
competition_submit 指定したファイルを推測結果としてKaggleにサブミット
dataset_list Kaggleに登録されたデータセットの一覧を取得
dataset_metadata データセットのメタデータをダウンロード
dataset_list_files データセットに含まれるファイルの一覧を取得
dataset_download_files 指定したデータセットの全ファイルをダウンロード
dataset_download_file 指定したデータセットの指定したファイルをダウンロード
kernels_list カーネル一覧の取得
kernels_pull カーネルからファイルをダウンロード
kernels_output Kaggle上で直近にカーネルを実行した結果を取得
kernels_push カーネルへファイルをアップロード
KaggleApiクラスが提供するメソッド(一部)

 これらは主にkaggleコマンドに対応するものとなっていますが、competitionsとcompetitionのように単数形と複数形のメソッドがあることには注意してください(複数形は対象の数が不定の場合で、単数形は引数で対象を絞るといった違いがあるようです)。また、筆者の環境(macOS/Windows)ではkernels_pushメソッドは例外が発生したので動作の確認はできていません。

 というわけで、これらのAPIをPythonコードから呼び出してみることにします。ここでは、以下に示すセルが3つだけのノートブックを用意しました(Kaggle APIにアクセスすることが重要であり、Kaggleのコードはどうでもいいですよね)。

今回作成したノートブック 今回作成したノートブック

 Titanicコンペのデフォルトのデータセットと、それを基に自分が作成したデータセットがあることには注意してください。

コンペ一覧とデータセットの取得

 では、Titanicコンペを検索して、そこで必要になるデフォルトのデータセットをダウンロードしてみましょう。

 既に述べたように、コンペの一覧を取得するにはcompetitions_listメソッドを使います。

competitions_list(group=None, category=None, sort_by=None, page=1, search=None)

competitions_listメソッド

 searchパラメーターには検索したコンペに含まれそうな綴(つづ)りを、categoryパラメーターにはgettingStarted/research/recruitment/masters/playgroundなどの語を与えます。以下に例を示します。

competitions = api.competitions_list(search='titanic')
for competition in competitions:
    print(competition.ref)

「titanic」を含むコンペ一覧を取得

 VS Codeの統合ターミナル(REPL環境)で実行した結果を以下に示します。

2つのコンペが見つかった 2つのコンペが見つかった


かわさき

 Pythonコードを見ると、Pylanceが「ref」なんて属性ないよ、といっていますがあるんです。


 competitions_listメソッドの戻り値はKaggle APIが提供するCompetitionクラスのインスタンスを要素とするリストです。「dir(competitions[0])」などを実行すれば分かりますが、このオブジェクトにはさまざまな属性があります(実際には以下のコードでアクセスしているよりも多くの属性があります)。そこで以下のようにして、「kaggle competitions list」コマンドと似た出力を得ることもできます。

result = [
    'ref               deadline   category        reward    teamCount Entered',
    '----------------- ---------- --------------- --------- --------- -------'
]
for competition in competitions:
    r = competition.ref
    d = str(competition.deadline).split(' ')[0]
    c = competition.category
    rw = competition.reward
    t = competition.teamCount
    u = competition.userHasEntered
    s = f'{r:17} {d:10} {c:15} {rw:9} {t:9} {u:7}'
    result.append(s)

print('\n'.join(result))

コンペに関する情報を一覧してみる

 実行結果を以下に示します。

コンペ一覧を見やすく出力 コンペ一覧を見やすく出力


かわさき

 ここでも怒られていますが、大丈夫。それらの属性、ありますから。



一色

 wwww(わらわらわらわら)


 コンペ情報で必要になるのは、ref属性です(上の一覧で一番左に表示されています)。コンペで用意されているデータセットをダウンロードするときには、これを指定します。というわけで、competition_list_filesメソッドでデータセットを検索してみましょう。このメソッドには、今述べたコンペを識別する名前を指定します。

competition = competitions[0].ref
file_list = api.competition_list_files(competition)
for file in file_list:
    print(file.name)

Titanicコンペで用意されているデータセットとサブミット用のCSVファイル

 実行結果を以下に示します。

Titanicコンペで用意されているデータセットとサブミット用のCSVファイルが一覧されたところ Titanicコンペで用意されているデータセットとサブミット用のCSVファイルが一覧されたところ

 おなじみの3つのファイルが得られました(戻り値はKaggleが提供するFileクラスのインスタンスを要素とするリストです)。

 データファイルをダウンロードするには、competition_download_fileメソッドかcompetition_download_filesメソッドを使用します。個別にファイルをダウンロードするなら前者を、ZIPファイルにまとめてダウンロードするなら後者を使えばよいでしょう。ダウンロードするコードは以下の通りです。

# competition_download_fileメソッド
for file in file_list:
    api.competition_download_file(competition, file.name, path='input/titanic')

# competition_download_filesメソッド
import shutil
api.competition_download_files(competition, path='input')
shutil.unpack_archive('input/titanic.zip', 'input/titanic')

コンペで用意されているデータセットをダウンロードするコード

 どちらのメソッドでもコンペ名を最初に指定します。competition_download_fileメソッドでは次にダウンロードするファイルを指定しますが、これには上で見たcompetition_list_filesメソッドの戻り値であるFileオブジェクトのname属性が使えます。pathにはダウンロード先のディレクトリを指定します。Kaggleのファイル配置と同じになるように気を付けましょう。

「input/titanic」ディレクトリにファイルがダウンロードされたところ 「input/titanic」ディレクトリにファイルがダウンロードされたところ

データセットの検索とダウンロード

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。