1. Kaggleの自分のScore推移を把握したい
今回はKaggleのSubmit一覧を取得する方法について記載します。
Kaggleコンペの振り返りをする際などにあとから自分のSubmit一覧を取得したいことがあると思います。
例えば3か月のコンペ期間中、自分がどのような取り組みをして、
それによってどのようなScore推移をしたのか、
Public Scoreの上昇に伴いPrivate Scoreは上昇していっていたのかをコンペ終了後に振り返ることは有用だと思います。
そこで今回は2つの方法での任意の参加コンペにおける自分のSubmit履歴を取得する方法を解説していきます。
2. Kaggle APIを用いた方法
Kaggleには公式APIがあります。
こちらのAPIを用いることでコンペデータのダウンロードやSubmit、そしてSubmit履歴一覧取得などを行うことができます。
ここからはPythonを用いたKaggle APIの利用手順について見ていきます。
まずはターミナルからKaggle APIをインストールします。
1 |
pip install kaggle |
次にKaggle公式サイトにアクセスし、
自分のKaggle accountページ(https://www.kaggle.com/(ユーザ名)/account)を開きます。
アカウントページのAPIの欄から「Create New API Token」をクリックします。
すると「kaggle.json」というファイルがダウンロードされます。
このファイルをmacなら「~/.kaggle/kaggle.json」、
Windowsなら「C:\Users\
Macでターミナルを開いている場合、下記でファイルを移動できます。
1 |
mv ~/Downloads/kaggle.json ~/.kaggle/kaggle.json |
次にファイルのアクセス権限を変更しておきます。
1 |
chmod 600 ~/.kaggle/kaggle.json |
これでKaggle APIを使う準備は完了です。
試しに現在開催中のコンペ一覧を表示してみます。
1 |
kaggle competitions list |
上記のような一覧が表示されたら無事APIが正常にインストールできています。
もしエラーが表示される場合は、kaggle.jsonのファイルのフォルダが正しいか、
アクセス権限を変更したかを確認してみてください。
Kaggle APIは下記4つのコマンドがあります。
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} |
よく使われるのはデータのダウンロードやsubmitかと思いますが、
今回の記事では自分のsubmission一覧を取得したいため、
「kaggle competitions」コマンドの「submissions」を利用します。
たとえば私が過去参加したindoorコンペのsubmit一覧を取得してみます。
コンペの正式名称はコンペページのURLなどから取得するか、
先程のコンペ一覧コマンドから取得しておきます。
1 |
kaggle competitions submissions indoor-location-navigation |
submit結果一覧を「filename/date/description/status/publicScore/privateScore」の項目で取得できます。
ただし、Kaggle APIコマンドを用いた方法は各コンペ最新の30submitのみしか取得できないようです。
そのためコンペ開始時からの全てのsubmit一覧の結果を取得するには別の方法を用いる必要があります。
3. BeautifulSoupでスクレイピングする方法
次にpythonのBeautifulSoupパッケージを用いてブラウザから直接スクレイピングする方法を記載します。
BeautifulSoupはスクレイピング用のパッケージです。
まだインストールしていない場合は事前にインストールしておきます。
1 |
pip install beautifulsoup4 |
まずsubmit一覧を取得したいコンペのページデータを取得します。
Kaggleはログインすることで自分のsubmit一覧が表示できるようになるため、
seleniumでログインページにアクセスする方法を用いてもよいのですが、
今回はローカルにhtmlデータを保存してスクレイピングする方法を紹介します。
まずはsubmit一覧を取得したいページにブラウザからアクセスします。
デフォルトでは全てのsubmitが表示されていないため、
一番下の最初のsubmitが表示されるまでスクロールした後、
htmlファイルを保存します。
※なお、Chromeなどで「別名で保存」で保存すると、
htmlファイルのほか、各種画像ファイルなどもダウンロードされますが、
htmlファイル以外は不要ですので削除します。
ダウンロードしたhtmlファイルと同じフォルダにてjupyter notebookファイルを作成し、
スクレイピングしていきます。
まずは必要なパッケージをimportします。
1 2 3 4 |
import pandas as pd from bs4 import BeautifulSoup import urllib.request from datetime import datetime as dt |
次にhtmlファイルをbeautifulsoupに読み込みます。
※下記はダウンロードしたファイルを「sub.html」という名前で保存した場合
1 2 |
html = open("./sub.html", "r", encoding="utf-8") soup = BeautifulSoup(html, "html.parser") |
これで準備が完了したため、htmlファイルの中から取得したい項目を
スクレイピングしていきます。
今回はsubmitしたときの時間、スコアを取得します。
※code コンペなどの場合はステータス(subが成功したかerrorかなど)項目もありますので
そちらも取得するとあとから振り返りやすいです。
1 2 3 4 5 |
sub_time = soup.find_all(class_ = "competition-submissions__info-time") #codeコンペでsubページにstatusがある場合は取得(今回はコメントアウト) #sub_states = soup.find_all(class_ = "competition-submissions__status") sub_scores = soup.find_all(class_ = "competition-submissions__score") sub_scores = sub_scores[3:] #最初の2行はheader |
スコアはpublic scoreとprivate scoreに分けておきます。
1 2 |
sub_public = sub_scores[::2] #偶数番目 sub_private = sub_scores[1::2] #奇数番目 |
最後に取得したデータを分析や可視化がしやすいように、
DataFrameに変換します。※これは任意です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
sub_time_list = [] #sub_states_list = [] sub_public_list = [] sub_private_list = [] for i in range(len(sub_time)): sub_time_list.append(sub_time[i].find_all("span")[0].attrs["title"].replace("(日本標準時)","")) #sub_states_list.append(sub_states[i].text) sub_public_list.append(sub_public[i].text) sub_private_list.append(sub_private[i].text) sub_df = pd.DataFrame({ "datetime":sub_time_list, #"sub_states":sub_states_list, "sub_public":sub_public_list, "sub_private":sub_private_list }) sub_df["datetime"] = pd.to_datetime(sub_df["datetime"]) |
上記を実行すると例えば下記のようなDataFrameが生成されます。
取得したデータを用いてたとえば自分のSubmitのScoreがどのように変化したかを
可視化することができます。
下記はindoorコンペにおいて私の各時点での最良スコアがどのように推移したかを示しております。
※上記DataFrameから各時点での最良スコアを算出した上でプロット
縦軸のlossがpublic/privateともにsubの時間経過とともに
順調に減少しているようです。(下がり幅が十分かはさておき。)
以上、KaggleのSubmit一覧を取得する方法の紹介でした。