Article
・Kaggleやデータ分析初学者向けのチュートリアル解説本を執筆しました。本記事とあわせてご参照くださいませ。
『Pythonで動かして学ぶ!Kaggleデータ分析入門』
・その他のKaggle参戦記事一覧はメニューのKaggle挑戦記事からご参照くださいませ。
・その他のKaggle参戦記事一覧はメニューのKaggle挑戦記事からご参照くださいませ。
はじめに
今回はKaggleのSubmit一覧を取得する方法について記載します。 Kaggleコンペの振り返りをする際などにあとから自分のSubmit一覧を取得したいことがあると思います。例えば3か月のコンペ期間中、自分がどのような取り組みをして、それによってどのようなScore推移をしたのか、Public Scoreの上昇に伴いPrivate Scoreは上昇していっていたのかをコンペ終了後に振り返ることは有用だと思います。 そこで今回は2つの方法での任意の参加コンペにおける自分のSubmit履歴を取得する方法を解説していきます。
| (1) Kaggle APIを用いた方法
Kaggleには公式APIがあります。
こちらのAPIを用いることでコンペデータのダウンロードやSubmit、そしてSubmit履歴一覧取得などを行うことができます。
ここからはPythonを用いたKaggle APIの利用手順について見ていきます。
まずはターミナルからKaggle APIをインストールします。
1 |
pip install kaggle |
アカウントページのAPIの欄から「Create New API Token」をクリックします。 すると「kaggle.json」というファイルがダウンロードされます。 このファイルをmacなら「~/.kaggle/kaggle.json」、 Windowsなら「C:\Users\
1 |
mv ~/Downloads/kaggle.json ~/.kaggle/kaggle.json |
1 |
chmod 600 ~/.kaggle/kaggle.json |
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} |
1 |
kaggle competitions submissions indoor-location-navigation |
submit結果一覧を「filename/date/description/status/publicScore/privateScore」の項目で取得できます。 ただし、Kaggle APIコマンドを用いた方法は各コンペ最新の30submitのみしか取得できないようです。 そのためコンペ開始時からの全てのsubmit一覧の結果を取得するには別の方法を用いる必要があります。
| (2) BeautifulSoupでスクレイピングする方法
※2023/12/09 kaggleの更新に伴い追記修正
次にpythonのBeautifulSoupパッケージを用いてブラウザから直接スクレイピングする方法を記載します。
BeautifulSoupはスクレイピング用のパッケージです。
まだインストールしていない場合は事前にインストールしておきます。
1 |
pip install beautifulsoup4 |
ダウンロードしたhtmlファイルと同じフォルダにてjupyter notebookファイルを作成し、 スクレイピングしていきます。 まずは必要なパッケージをimportします。
1 2 3 4 5 6 7 |
import pandas as pd import numpy as np from bs4 import BeautifulSoup import urllib.request import datetime from datetime import datetime as dt import re |
1 2 |
html = open("./sub.html", "r", encoding="utf-8") soup = BeautifulSoup(html, "html.parser") |
1 |
sub_list = soup.find_all("ul", class_="km-list km-list--two-line") |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
month_text_converter = { "Jan":"01", "Feb":"02", "Mar":"03", "Apr":"04", "May":"05", "Jun":"06", "Jul":"07", "Aug":"08", "Sep":"09", "Oct":"10", "Nov":"11", "Dec":"12", } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
sub_states=[] sub_time=[] sub_private_score=[] sub_pub_score=[] for ul in sub_list: for li in ul.find_all("li"): #print(li) tmp_state = li.find_all(class_ = "sc-lnAgIa sc-iKGpAt sc-iqavZe bqETvQ kKrujI igKnYa") tmp_time = li.find_all("span", title=re.compile("日本標準時")) tmp_score = li.find_all(class_ = "sc-hAtEyd sc-fmSAUk bVxyRB kNAjYE") tmp_time = tmp_time[0].get("title").split() convert_time = tmp_time[3] + "/" + \ month_text_converter[tmp_time[1]] + "/" + \ tmp_time[2] + " " + \ tmp_time[4] #print(tmp_state[0].text.split()[0]) #print(convert_time) #print(tmp_score[0].text, tmp_score[1].text) sub_states.append(tmp_state[0].text.split("·")[0]) sub_time.append(convert_time) if len(tmp_score)>0: sub_private_score.append(tmp_score[0].text) sub_pub_score.append(tmp_score[1].text) else: sub_private_score.append(np.nan) sub_pub_score.append(np.nan) |
1 2 3 4 5 6 7 8 9 10 |
sub_df = pd.DataFrame({ "datetime":sub_time, "states":sub_states, "public_score":sub_pub_score, "private_score":sub_private_score }) sub_df["datetime"] = pd.to_datetime(sub_df["datetime"]) sub_df["public_score"] = sub_df["public_score"].astype("float16") sub_df["private_score"] = sub_df["private_score"].astype("float16") |
| (3) 余談
取得したデータを用いてたとえば自分のSubmitのScoreがどのように変化したかを
可視化することができます。
下記はindoorコンペにおいて私の各時点での最良スコアがどのように推移したかを示しております。
※上記DataFrameから各時点での最良スコアを算出した上でプロット
縦軸のlossがpublic/privateともにsubの時間経過とともに
順調に減少しているようです。(下がり幅が十分かはさておき。)
以上、KaggleのSubmit一覧を取得する方法の紹介でした。
人気記事: