AtCoder のコンテスト開催を最速で知る方法

はじめに

AtCoder のコンテストは基本毎週1個、休日に開かれます。
開催されない週があったり、土曜だったり日曜だったりします。

休日の予定を立てるためには日程をいち早く知ることは最重要課題です。

そこで現状のコンテストの開催を知る手段と最速の方法をまとめました。

コンテストの開催を知る手段

AtCoder のコンテストの開催を知る手段は、だいたい以下の3つに分けられると思います。

1. Twitter で知る

Twitter を見て知るという人が結構多いんじゃないかなと思います。

AtCoder 公式アカウントでは当日ツイートのみなので、chokudai さんをフォローするのが一番速いです。

ただサービスとして、Twitter がコンテストの開催を知るメインの手段である状態は良くないと思います。
ツイートを見逃すこともありますし、人それぞれフォローしている人数も人も違います。

そもそも Twitter やってなければ終わりです。

AtCoder のアカウントがあればコンテストの開催を最速で知ることができる」状態が理想だと僕は思います。

2. メールで知る

自分の AtCoder アカウントから「コンテストメールを受け取る」にチェックを入れるとメールが届きます。

メールは基本コンテスト前日に来るので、Twitter と比べると非常に遅いです。

これでは休日の予定は立てられません。

f:id:Doarakko:20190216162140p:plain

3. ホームページを確認

ホームページ左に開催予定のコンテストが表示されています。

ここを定期的にチェックするのは現実的ではありません。

f:id:Doarakko:20190216162212p:plain

まとめ

「公平性?」はAtCoder のアカウントのみで完結するかということを意味します。
消去法で Twitter になってしまいます。

方法 コスト&確認漏れ 速さ 公平性?
Twitter o x
メール o x o
ホームページ x - o

最速?の方法

AtCoder の Google カレンダー を使用します。
あまり知られていないと思いますがここから飛べます。

f:id:Doarakko:20190216162217p:plain

必要なもの

現状「AtCoder のアカウントがあればコンテストの開催を最速で知ることができる」は無理です。

1. AtCoder のカレンダーを登録

ここを押して自分のカレンダーに追加します。

f:id:Doarakko:20190216162247p:plain

2. 通知設定

2.1 カレンダー右横のマークから設定画面へ

f:id:Doarakko:20190216162232p:plain

2.2 設定

イベント作成時やコンテスト開始xx分前に通知させることができます。

f:id:Doarakko:20190216162242p:plain

2.3 スマホで通知

Google カレンダーのアプリを入れれば、メールではなくプッシュ通知できます。

+α Slack と連携

Google カレンダーと Slack を連携して、指定したチャンネルに通知させます。

簡単な画面遷移は説明してないです。

1. Google Calendar for Team Events を使用

f:id:Doarakko:20190216162237p:plain

2. 設定

連携している Google アカウントに登録されたカレンダーの中から、AtCoder コンテストを指定します。

あとはそれぞれ、投稿するチャンネルとリマインダーなどを設定して完了です。

f:id:Doarakko:20190216162227p:plain

3. 実際の通知

会社や学校、コミュニティなどの Slack で是非やって見てください。

f:id:Doarakko:20190216162222p:plain

直近のコンテストの通知時間

個人的には TwitterGoogle カレンダーと同じ日にメールが来るのが理想だと思います。

ABC117

開催日時: 2019/2/3 21:00

No 方法 日時
1 Twitter(@chokudai) 1/30 06:27
2 Google カレンダー 1/30 23:28
3 メール 2/3 01:35

ABC118

開催日時: 2019/2/16 21:00

No 方法 日時
1 Twitter(@chokudai) 2/10 02:22
2 Google カレンダー 2/10 19:23
3 メール -

まとめ

chokudai さんが最速でした。

方法 コスト&確認漏れ 速さ 公平性?
Google カレンダー o o
Twitter o x
メール o x o
ホームページ x - o

Kaggle の Google Calendar を作りました

Kaggle の Google Calendar を作りました

はじめに

Kaggle Advent Calendar 2018」25 日目の記事です。

概要

Kaggle API をうまく使ってコンペの Google カレンダーを作ります。

Kaggle のカレンダーは、過去にこちらの公式フォラームに投稿されていましたが、現在は機能していません。

以下はプログラムの説明になります。 カレンダーだけ見たい方はこちらからどうぞ。

実行環境

  • anaconda3-5.2.0

  • Kaggle API Key

    • 説明は省きます
    • kaggle コマンドが実行できるような状態にしておいてください
  • Google Calendar API

    • v3
    • 説明は省きます
  • Heroku

手順

1. Kaggle API でコンペの情報取得

こちら の記事を参考に Kaggle APIPython で実行します。

from kaggle.api.kaggle_api_extended import KaggleApi

def get_competitions_list(category='featured'):
    api = KaggleApi()
    api.authenticate()
    return api.competitions_list(category=category)

2. カレンダーに登録されているイベント名を取得

def get_event_name_list():
    now = datetime.datetime.utcnow().isoformat() + 'Z'
    events_result = service.events().list(
        calendarId=CALENDAR_ID, timeMin=now).execute()
    events = events_result.get('items', [])

    events_name = []
    for event in events:
        events_name.append(event['summary'])

    return events_name

3. 新規コンペをカレンダーに登録

def create_events(competitions_list):
    event_name_list = get_event_name_list()
    if event_name_list is None:
        return 0

    for competition_info in competitions_list:
        competition_name = getattr(competition_info, 'title')

        now = datetime.datetime.utcnow().isoformat()

        end_date = getattr(competition_info, 'deadline')
        end_date = timezone('UTC').localize(end_date)
        end_date = end_date.isoformat()

        # 新規コンペの場合
        if competition_name not in event_name_list and now < end_date:
            key_list = ['description', 'evaluationMetric', 'isKernelsSubmissionsOnly', 'tags', 'url']
            description = ''
            for key in dir(competition_info):
                if key in key_list:
                    description += '{}: {}\n'.format(key, getattr(competition_info, key))

            start_date = getattr(competition_info, 'enabledDate')
            start_date = timezone('UTC').localize(start_date)
            start_date = start_date.isoformat()

            body = {
                'summary': competition_name,
                'description': description,
                'start': {
                    'dateTime': start_date,
                    'timeZone': 'America/Los_Angeles',
                },
                'end': {
                    'dateTime': end_date,
                    'timeZone': 'America/Los_Angeles',
                },
                'reminders': {
                    'useDefault': False,
                },
                'visibility': 'public',
            }
            event = service.events().insert(calendarId=CALENDAR_ID, body=body).execute()
            print('[Create] {}'.format(competition_name))

key_listに設定したものを、イベントの説明欄に入れます。

key_list = ['description', 'evaluationMetric', 'isKernelsSubmissionsOnly', 'tags', 'url']
description = ''
for key in dir(competition_info):
    if key in key_list:
        description += '{}: {}\n'.format(key, getattr(competition_info, key))

以下がイベントの登録処理です。
タイムゾーンAmerica/Los_Angelesになっていますが、こちらはdateTimeがどのタイムゾーンかを入れます。最初戸惑いました。

あとは、個人のカレンダーの設定に合わせて Google 側でうまくやってくれます。

body = {
    'summary': competition_name,
    'description': description,
    'start': {
        'dateTime': start_date,
        'timeZone': 'America/Los_Angeles',
    },
    'end': {
        'dateTime': end_date,
        'timeZone': 'America/Los_Angeles',
    },
    'reminders': {
        'useDefault': False,
    },
    'visibility': 'public',
}
event = service.events().insert(calendarId=CALENDAR_ID, body=body).execute()

4. Heroku にあげて定期実行

省略します。

おわりに

2019 年も楽しい Kaggle ライフが送れそうです。 f:id:Doarakko:20181225075647p:plain

参考資料

「Kaggle API」を Python で実行してみた

はじめに

kaggle その2 Advent Calendar 2018」2 日目の記事です。

概要

Kaggle APIPython 上で実行します(kaggle コマンドを実行するわけではありません)。

実行環境

  • anaconda3-5.2.0

  • Kaggle API Key

    • 説明は省きます
    • kaggle コマンドが実行できるような状態にしておいてください

準備

1. kaggle ライブラリをインポート

kaggleコマンドは Python で作られているので、Github を見ながらうまいことインポートします。

from kaggle.api.kaggle_api_extended import KaggleApi

2. KaggleApi クラスのインスタンスを準備

KaggleApi クラスにいろいろな処理が書かれているので、こちらのインスタンスを準備して、api経由でいろいろな関数を実行して行きます。

# KaggleApi のインスタンスを用意
api = KaggleApi()

3. 認証を通す

このままだと認証通っていないので、エラーになります。

そこでapi.authenticate()を実行します。
ローカルにある ~/.kaggle/kaggle.jsonを読み込みに行って、なんやかんやしてくれます。

# 認証を通す
api.authenticate()

試してみる

コンペのリストを表示させてみます。

# $ kaggle competitions list
api.competitions_list_cli()
ref                                            deadline             category            reward  teamCount  userHasEntered
---------------------------------------------  -------------------  ---------------  ---------  ---------  --------------
digit-recognizer                               2030-01-01 00:00:00  Getting Started  Knowledge       2724           False
titanic                                        2030-01-01 00:00:00  Getting Started  Knowledge      10359            True
house-prices-advanced-regression-techniques    2030-01-01 00:00:00  Getting Started  Knowledge       4300           False
imagenet-object-localization-challenge         2029-12-31 07:00:00  Research         Knowledge         30           False
competitive-data-science-predict-future-sales  2019-12-31 23:59:00  Playground           Kudos       1823            True
histopathologic-cancer-detection               2019-03-31 23:59:00  Playground       Knowledge         80           False
quora-insincere-questions-classification       2019-02-05 23:59:00  Featured           $25,000       1315            True
pubg-finish-placement-prediction               2019-01-30 23:59:00  Playground            Swag        705           False
human-protein-atlas-image-classification       2019-01-10 23:59:00  Featured           $37,000       1174           False
traveling-santa-2018-prime-paths               2019-01-10 23:59:00  Featured           $25,000        547            True
two-sigma-financial-news                       2019-01-08 23:59:00  Featured          $100,000       1828            True
PLAsTiCC-2018                                  2018-12-17 23:59:00  Featured           $25,000        737            True
quickdraw-doodle-recognition                   2018-12-04 23:59:00  Featured           $25,000       1214           False
ga-customer-revenue-prediction                 2018-11-30 23:59:00  Featured           $45,000        813            True
dont-call-me-turkey                            2018-11-26 23:59:00  Playground            Swag        223           False
airbus-ship-detection                          2018-11-14 23:59:00  Featured           $60,000        884           False
inclusive-images-challenge                     2018-11-12 23:59:00  Research           $25,000        468           False
rsna-pneumonia-detection-challenge             2018-10-31 23:59:00  Featured           $30,000       1499           False
tgs-salt-identification-challenge              2018-10-19 23:59:00  Featured          $100,000       3234           False
new-york-city-taxi-fare-prediction             2018-09-25 23:59:00  Playground       Knowledge       1488           False

ソースをざっと確認しましたが、kaggleコマンドで実行できる関数は*_cli()という名前になっています。

これを使っても何の意味もないので、kaggleコマンドで直接実行できないものをいくつか使ってみました。

各コンペの情報を取得

competitions_listはコンペの情報を取ってこれます。

competitions_list = api.competitions_list(category='featured')
for competition in competitions_list:
    print(competition)
vsb-power-line-fault-detection
humpback-whale-identification
elo-merchant-category-recommendation
ga-customer-revenue-prediction
quora-insincere-questions-classification
human-protein-atlas-image-classification
traveling-santa-2018-prime-paths
two-sigma-financial-news
PLAsTiCC-2018
quickdraw-doodle-recognition
airbus-ship-detection
rsna-pneumonia-detection-challenge
tgs-salt-identification-challenge
google-ai-open-images-object-detection-track
google-ai-open-images-visual-relationship-track
home-credit-default-risk
santander-value-prediction-challenge
trackml-particle-identification
youtube8m-2018
avito-demand-prediction

どんな情報が入っているか見てみます。

for key in dir(competitions_list[0]):
    print('{}: {}'.format(key, getattr(competitions_list[0], key)))
# 一部省略
awardsPoints: True
category: Featured
deadline: 2019-03-21 23:59:00
description: Can you detect faults in above-ground electrical lines?
enabledDate: 2018-12-20 23:08:48
evaluationMetric: Matthews correlation coefficient
id: 10684
isKernelsSubmissionsOnly: False
kernelCount: 0
maxDailySubmissions: 2
maxTeamSize: 8
mergerDeadline: 2019-03-14 23:59:00
newEntrantDeadline: 2019-03-14 23:59:00
organizationName: Enet Centre, VSB - T.U. of Ostrava
organizationRef: Enet-Centre-VSB
ref: vsb-power-line-fault-detection
reward: $25,000
submissionsDisabled: False
tags: [tabular data, signal processing, binary classification]
teamCount: 60
title: VSB Power Line Fault Detection
url: https://www.kaggle.com/c/vsb-power-line-fault-detection
userHasEntered: False
userRank: None

$ kaggle competitions list では取ってこれない情報がけっこうあるのがわかります。

Kernel の情報を取得

kernels_list = api.kernels_list(competition='elo-merchant-category-recommendation')
for key in dir(kernels_list[0]):
    print('{}: {}'.format(key, getattr(kernels_list[0], key)))
# 一部省略
author: FabienDaniel
categoryIds: []
competitionDataSources: []
datasetDataSources: []
enableGpu: None
enableInternet: None
id: 0
isPrivate: None
kernelDataSources: []
kernelType: None
language: None
lastRunTime: 2018-12-13 17:08:06
ref: fabiendaniel/elo-world
slug: None
title: Elo world
totalVotes: 261

メリット

1. kaggleコマンドでは見れない情報を取得できる

上でいくつか試したように、kaggleコマンドでは見れない情報がたくさんあります。

簡単なツールを作りにはちょうどいいです。

2. 利用規約に違反しない

Kaggle は公式がスクレイピングを禁止しています。

“Crawls,” “scrapes,” or “spiders” any page, data, or portion of or relating to the Services or Content (through use of manual or automated means);

A violation of any of the foregoing is grounds for termination of your right to use or access the Services. We reserve the right to remove any Content or User Submissions from the Services at any time, for any reason (including if someone alleges you contributed that Content in violation of these Terms), and without notice.

Terms of Use(2018/11/25)

禁止というよりは「やったらいつでも◯すから、気をつけてね」の方が正しいかもしれません。

スクレイピングで取ってこれる情報量には敵いませんが、ちょっとしたツールを作るにはちょうどいいです。

注意点

Kaggle APIAPI Limit が公開されていない上に不安定です。

加えて、Python プログラム上での使用は推奨された使い方ではありません。

使いすぎて垢バンされないように気をつけてください。

以下 GitHubAPI Limit 関連の issue が上がっています。 github.com

おわりに

だれかが便利なものを作ってくれると期待しています。

参考資料

話題沸騰中の「Xonsh」というものを触ってみました

はじめに

この記事は「Xonsh Advent Calendar 2018」の11日目の記事です。

「Xonsh」というものが話題沸騰中とのことなので、時代の波に乗り遅れないように触ってみました。

「Xonsh」 とは

Xonsh とは Python 製のシェルです。

Xonsh の日本人開発者の方が記事をいっぱい書いてくれています。

vaaaaaanquish.hatenablog.com

Xonsh のことを調べていると、大抵この方の記事に行き着きます。
勘弁して欲しいです。

実行環境

試してみる

インストール

$ pip install xonsh

pip で入るのが驚きです。
シェルと聞くと、インストールとか環境周りとか面倒くさそうなイメージがあるのですが、pipを見ると安心しますね 。

起動

起動する際には、以下コマンドを打つ必要があります。 不思議な感じです。

$ xonsh

びっくり

何も読まずにとりあえずうってみました。

$ import pandas as pd
$ df = pd.read_csv('../input/sales_train.csv')
$ df.head()
         date  date_block_num  shop_id  item_id  item_price  item_cnt_day
0  02.01.2013               0       59    22154      999.00           1.0
1  03.01.2013               0       25     2552      899.00           1.0
2  05.01.2013               0       25     2552      899.00          -1.0
3  06.01.2013               0       25     2554     1709.05           1.0
4  15.01.2013               0       25     2555     1099.00           1.0

本当に Python でびっくりです。

良かったところ

インストールが簡単

Python を使っている人であれば、秒で入れられます。

「Xonsh のインストールでつまずく人、マジで0人説」

環境への影響

Python のパッケージなので(間違ってたらごめんなさい)、他のところをいじる必要がないのは大きいです。

なにかしでかしたら、pip uninstall xonshで致命傷は受けないという保険があります。

Python で書ける安心感

普通のシェルだと、自分でなにか作りたいと思ってもハードルが高いです。

Xonsh は Python でなんでも書けます。

Pyhton は最強です。
つまり、「Xonsh」は最強ということです。

悪かったところ

起動が面倒

起動する際には、毎回 Xonsh コマンドを打たなければいいけません。

回避策あったら教えてください。

pyenv, gcloud が使えない

普段 gcloudコマンドを使うために、pyenv で Python2 と Python3 を切り替えているのですが、ここら辺は使えないようです。

「Xonsh」自体が Python3 上で動いているので、Python 2 には切り替えられないという感じでしょうか。

他のシェルと違い Pyhton 上で動くとなると、ここらへんのバージョンの問題はでできますね

Xonsh の問題というよりは、gcloud が Pyhton 3 に対応すればいいだけの話です。

さいごに

ちょっとしたコマンドを作っていたのですが、間に合わなかったので別記事に書こうと思います。

みなさんも時代の波に乗り遅れないように pip install xonsh しましょう。

参考資料

Pythonistaに贈るXonshのススメ

仕事をしながら Coursera の Kaggle コースを受けてみる ②

はじめに

この記事は、kaggle Advent Calendar 2018 2日目の記事です。

この記事を読んでもスコアは上がりません。
空いていたので無理やりねじ込みました。

Coursera の Kaggle コース Week 2 の感想記事になります。
コース1週目の記事はこちらからどうぞ。

コースを受講しようか考えている方の参考になれば幸いです。

Week 2

2週目は以下の内容になります。

  • EDA
  • Validation
  • Data Leak

Validation に結構期待していたのですが、だいたい知っているようなことでした。

実際のコンペでの EDA を説明してる動画が一番勉強になりました。

Quiz

Data Leak の Quiz が鬼門(奇問?)です。
計算問題がありますがビデオを見返せば問題ありません。

変な問題が1つ混じっているので、気をつくてください。

Programming Assignment

テストデータのみを使ってスコアを 90% 以上取ることが合格基準です。

やり方自体は書いてあるので、Scipy を使ってその通りに実装します。
Sparse matrices の使い方になれている人であれば、そこまで難しくないのかもれしません。

個人的にはコース全て含めてこの課題が一番きつかったです。
Data Leak さっぱりわからん。

Peer-graded Assignment

見つけたリークについて説明する文章(もちろん英語)を 3 ~ 5 文で書いて提出して、他の受講者にレビューしてもらいます。

合計 3 人、それぞれ 0 ~ 4 pt で採点されます。
クリア基準は、3人合計で 3 ptなので簡単です。

レビューしてくれる(する)人はシステム上で自動で割り振られます。

この課題はレビューする人がいなくなるとクリアできないので、期限内にやっておいた方がいいです。

レビューする数には制限がない(=何個でもレビューできる)ので、最悪フォーラムで助けを求めればなんとかなるかもしれません。

感想

1週目に比べて英語がきつくなってきたので、会社の昼休みに予習して、家に帰って再度聞くというやり方で進めました。

リークは自分で見つけられる気がしないので、コンペにでた時は Kernel と Duscussion を漁ることにします。

Kaggle meet up 行きたかった...

参考資料

仕事をしながら Coursera の Kaggle コースを受けてみる ①

はじめに

最近 Kaggle が Leak ばかりできつかったので、少しコンペから離れることにしました。全く別のことをしようと思ったのですが、せっかくなので前から気になっていた Coursera の Kaggle コースを受けてみます。

www.coursera.org

残業がないのが弊社の唯一のいいところで、家に帰ってからだいたい 3 時間ほど学習の時間が取れます。

こんな感じの状態でスタートします。
受講しようか迷っている方の参考になれば幸いです。

コース概要

こちらシラバスがあります。

各週ごとに課題(Quiz / Programming Assignment)に期限が設けられていますが、コース終了日までに全て完了すれば問題ないです。

ただ、他受講者にレビューしてもらう(レビューする)課題があるので、そちらは期限内にやらないとレビューしてくれる人がいなくなる可能性が高くなるので、気をつけてください。
Discussion Forums(Kaggle の Discussion のようなもの)が用意されているので、最悪そこで助けを求めればなんとかなるかもしれません。

Coursera にはスマホアプリがあります。教材をダウンロードしておけば、オフラインでも気にせず Video が見れて超便利。

以下は 1 週目の概要と感想です。

Week 1

1週目は導入で、以下のコンテンツがありました。

Video

  • 言語:英語
  • 字幕:英語
  • 速度:[0.75, 1.00, 1.25, 1.50, 1.75, 2.00]

Kaggle GrandMaster が実際に話してます。
今回は Alexander GuschinMikhail Trofimov が教えてくれました。
速くて聞き取れない場合は 0.75倍速にするといいです。僕は字幕を読みます。

字幕は英語しかありませんが、ページの下にテキスト化されているので、Google 翻訳に投げるのは簡単です。

Video の途中で Quiz(ちょっとした確認のようなもの)が出されることがあります。スキップできて間違えても問題ないです。

Reading

  • 言語:英語

内容は、直前に見た Video のまとめ的なもの / 参考資料 / Quiz の解説などがあります。ページ右下の Complete ボタンを押せば完了になるので、読まなくても特に問題はないですが、文章はそこまで多くありません。

Notebook

Video の補助的なものです。直前の Video で話した内容を掘り下げてます。

今回は、GBDTモデルで最初のツリーを取り除いた時にスコアが変化するか検証しています。 こちら(公式)に公開されています。

Practice Quiz / Quiz

  • 合格基準:80 ~ 100%
  • 問題数:6 ~ 10
  • 形式:選択問題
  • 制限時間:なし
  • 期限:なし / あり
  • 回答制限:なし / 1日3回まで

問題数 / 選択肢の数が小さいので全探索でいけます。
Quiz によって合格基準と問題数が異なります。

Programming Assignment

  • 合格基準:100%
  • 形式:Jupyter notebook
  • 言語:英語
  • 制限時間:なし
  • 期限:あり
  • 回答制限:なし

名前の通りプログラムを提出します。
ページ内のリンクを開くと Jupyter notebook が起動して、そこで自由にプログラムを実行できます。問題は穴埋めになっていて、解答を指定された変数にいれて、Submit 用の関数を実行すると採点されます。

1週目で行なったのは Pandas の基本的な使い方の問題でした。groubyjoin がわかっていればさほど難しくありません。問題は GitHub に公開(公式)されています、興味のある方はこちらからどうぞ。

僕は問題を正しく理解できなくて、こういう意味かなと思ったものを片っ端から Submit しました。一発合格した人は 17% ほどだそうです。Form で助けを求めている方もいました。

感想

スタート前は英語が一番不安でしたが、多少知っている分野の英語だと聞き取りやすいです。コースの難易度がわからないという方は、こちら にプログラミング課題が公開されているので参考にしてください。

Week 1 でどれくらいの時間を使ったか忘れましたが、想定されている時間 * 1.5 くらいだと思います。これから難しくなってくると思うので、想定されている時間 * 2.0 くらいかかる予定で行きます。

コース終了後も教材が見れるのか気になります。
知っている方いたら教えてください。

あと、スマホアプリだと各課題の期限が Web の 1 週間後の日にちで表示されています。 おそらく Coursera の 1 週間無料期間で今回のコースをスタートしたことが影響しているのだと思います。

それでは Week 2 に行ってきます。

参考資料