Kaggle のコンペと解法を探せる Web アプリ「Kagoole」を作りました

Kaggle のコンペと解法を, データや予測の形式・評価指標などから探せる Web アプリ「Kagoole」を作りました.

f:id:Doarakko:20190808152201p:plain

Kaggle のことを知らない方のために Wikipedia の一文とわかりやすいスライドを貼って起きます.

Kaggleは企業や研究者がデータを投稿し、世界中の統計家やデータ分析家がその最適モデルを競い合う、予測モデリング及び分析手法関連プラットフォーム及びその運営会社である。(Wikipedia

以下は開発備忘録です.
Kagoole に興味のある方や Web アプリを作ろうと思っている方の参考になれば幸いです.

0. 目次

  1. Kagoole 構成
  2. 開始時点のスキル・知識
  3. 開発する目的
  4. 技術選定
  5. アプリ開発前にやったこと
  6. 苦労した・悩んだ点
  7. 反省点
  8. Kagoole の課題
  9. 感想

1. Kagoole 構成

フロントエンドとバックエンドで2つの Heroku アプリが動いています.
別々にした方がデプロイが楽そうだと思ったのですが, ドメインが別になったことで CORS 地獄にはまりました.

f:id:Doarakko:20190808155605j:plain

10分おきに Kaggle API を叩いて新規コンペの取得と開催中のコンペ情報(チーム数, 終了日)の更新を行なっています.

2. 開始時点のスキル・知識

  • Web アプリケーション開発
    • 業務経験ゼロ
    • Golang で「漢番付」という Web アプリを作成
    • 全体の雰囲気はイメージできている
  • REST API
    • 使ったことはあるが作ったことはない
  • Heroku
  • 英語
    • 読むのはそこまで苦ではない
    • Google 翻訳の助けは必要

バックエンド

フロントエンド

  • HTML, CSS
    • 基本的なことはわかる
  • JavaScript
    • HTML で onclickalert()confirm() を書いたことがあるくらい
  • React
    • ゼロ

3. 開発する目的

  • 類似コンペや, 業務と関連がありそうなコンペを探せるようにする
  • 解法のまとめ
    • 現状いろいろなところに散らばっていて探すのが面倒

個人的に

  • フロントエンドの勉強
  • フロントエンドとバックエンドが別れた(Web フレームワークの固有 Web テンプレートをつかわない)アプリがどう動いているのか理解する

4. 技術選定

方針

1. メジャーなものを選ぶ

  • GitHub の Used by・Watch・Star・Fork 数, 更新頻度

初心者の勉強ということもありとりあえずメジャーなものを選ぶことにしました.
またシンプルな CRUD アプリのため, メジャーなものを選べば困ることはないだろうという判断です.

2. ちょっと調べる

メジャーなものが複数あった場合には, 要件を満たすか・それぞれの長所と短所を軽く調べます.
長くても1時間くらいで切り上げました.

3. 好きなものを使う

  • 名前, ロゴがかっこいい
  • Twitter でつぶやいている人がいる

素人が1人で調べたところで限界がある(or 膨大な時間がかかる)ので最後は適当です.
プライベートは好きなことをした方が健康に良いです.

クラウド: Heroku

最初は GCPAWS に挑戦しようと思っていたのですが, 以下理由により逃げの Heroku にしました.

  • お金を1円もかけたくなかった
    • GCPAWS が無料でどこまでできるかわからない
  • 直近で GCP にてインスタンス消し忘れで数万円持ってかれた

Heroku は何も知らなければお金がかからないのでおすすめです.

DB: PostgreSQL

Heroku のアドオンです.

DjangoArrayFieldPostgreSQL のみの対応だったことが理由です.
ここは開発途中に決めました.

ArrayField は ['apple', 'orange', 'pineapple'] のようなデータのために使います.

本アプリでは以下で使用しました.

  • Tags
  • Data Types

言語: Python

Kaggle API を使うためです.
Kaggle API は通常コマンドラインから使用しますが, Python 製ライブラリのため Python スクリプトから使用できます.
これにより Kaggle コマンドからは取得できないデータを取ってこれます.

気になる方はこちらの記事を見てください.

REST のエンドポイントも探せばわかるのかもしれませんが, そこまでして別の言語を使う必要はないと判断しました.

Web フレームワーク: Django

解法の登録・更新・削除権限を管理するために, Flask よりも Django を使った方が実装が楽そうだと判断したためです.

現在は権限管理は行なっていません.
理由は「6. 苦労した・悩んだ点」で話します.

フロントエンドフレームワーク: React

ロゴが写輪眼みたいでかっこよかったので React にしました.

ライブラリ

開発しながらライブラリのドキュメントやデモをみたり, 実際に動かしながら決めました.

メジャーな言語とフレームワークを選んでおけば大抵周りのライブラリは誰かが作ってくれています.
感謝です.

5. アプリ開発前にやったこと

開始時点ではアプリ完成までの道筋がまったく見えていません.

「2. 開始時点のスキル・知識」から, 以下を勉強する必要がありました.

5.1 やったもの

1. Django Girls Tutorial

Django Girls という非営利の団体が作っているチュートリアルです.
多くの言語に翻訳されていて内容もわかりやすく Web アプリを開発したことがない人にもおすすめです.

ブログアプリの作成を環境構築からデプロイまでやっています.
Django の公式チュートリアル よりもこちらの方が良さげだったのでこっちにしました.

2. Django REST framework: tutorial

Django REST framework の公式チュートリアルです.
内容が濃かったのでたいていのことはカバーしているのではないでしょうか.

私は自分が作成するアプリに使わなそうなところは流しました.

3. Build a To-Do application Using Django and React

個人のブログ記事で Todo アプリを作成しています.
私はこの時点では React は何もやっておらず, React のコードは思考停止コピペです.

Django + React でのチュートリアル記事はどれも微妙だったので,
時間をかけずに Django + React での開発の全体の雰囲気を確認することを目的にしました.

私かチュートリアル自体の問題かはわかりませんが, うまく動かないところがあるので注意してください.

4. React: step-by-step guide

React の公式チュートリアルです.
途中途中で React の思想的?なことや, こういう風にコードを書いた方が方が良いみたいなことも書いてあり楽しかったです.
日本語版もあります.

5.2 どのチュートリアルを行うかを決める手順

基本的には公式チュートリアルをやります.

1. 英語でググる

日本語で書かれたチュートリアルにも素晴らしい・新しいものはたくさんありますが, 古いものやノイズを多く含みます.

私は良いもの悪いもの(正しいもの正しくないもの)が判断できない知識レベルの時にはなるべく英語の情報を見るようにしています.

2. 更新日時, 使用している言語・フレームワークのバージョンを確認

少しバージョンが古い(2.7 と 2.9 など)くらいは大抵問題ないですが, 古すぎると以下のようなことがあるので気をつけます.

  • 書き方が違う
  • 重大なバグがある
  • 新しいバージョンで便利な機能が追加されている

3. チュートリアルをさらっとみて作りたいものと関連がありそうなものを選ぶ

  • Todo を登録・更新・削除するところを解法に置き換えればなんかできそう
  • create-react-app で別アプリとしてフロントエンドアプリ作ってる
  • etc

6. 苦労した・悩んだ点

1. Kaggle API で取得したデータの加工

コンペのデータと予測形式はタグから抽出しています.

f:id:Doarakko:20190808151528p:plain

API から取得したデータをみると Kaggle 公式(or コンペ開いた団体)がタグ付けを始めたのは 2015年あたりからです.
また現在のタグ付けもしっかりされているわけではないので, そのまま使うと空が多くなります.

f:id:Doarakko:20190808151754p:plain

そこで以下のようなルールベースでの補完を行いました.

  • 評価指標が「AUC」なら予測形式は「分類」
  • コンペのタイトルや説明文に「classification」が入っていたら「分類」
  • 評価指標に「image」が含まれていたらデータの形式は「画像」
  • etc

詳しくはこちらのコードを見て見てください.

現状コンペのデータは編集不可です.
理由は Kaggle API から取得したデータと手動で登録したデータを一緒に扱った場合,
(Kaggle API から取得したデータを加工するプログラムを編集した場合などに)コンペデータを再取得して更新する際の手動登録したデータの扱いが面倒です.
何もしなければ, 手動登録したデータは全部上書きされて消えてしまいます.

ここら辺どのような形にするべきか考え中です.

2. 検索機能

検索をフロントエンドとバックエンドのどちらで実装するべきか悩みました.

こういうロジック的なことはバックエンドの方でやるべきなのではと思ったのですが,
以下理由によりフロントエンドで行いました.

  • キーワード入力してリクエスト送って返ってきたデータ表示するのは遅い
  • そこまでの検索機能は必要ないのでは
  • データ数が多くないのでフィルターでパフォーマンス上問題ない

検索というよりはフィルターによる絞り込みです.
これにより複数キーワードでの検索ができないという問題が生じています.

フロントエンド側での検索とは別に, 「Advanced Search」というような形でバックエンド側での実装を考えています.

3. 解法の登録・削除権限

方法として以下の4つが考えられました.

  • アカウントを作成した人のみ解法の登録が可能
    • 全ての解法を削除可能
    • 自分が登録した解法のみ削除可能
  • アカウントなしで解法の登録が可能
    • すべての解法を削除可能
    • 削除不可

現在はアカウントなしで解法の登録とすべての解法の削除ができるガバガバ状態です.
一定期間履歴を残しており削除時には通知を飛ばしているので, 何かあったときはすぐに管理画面から復元できます.

理由は以下です.

  • アカウント作るのが面倒

開発するのもユーザが作るのも面倒です.
私はユーザにアカウントを作成させる行為は非常に重いものだと考えているので, なるべくやりたくありません.

  • 利用対象者がエンジニア

今の状態だと誰でも解法を全削除できますが, アカウント制にしてもしなくてもエンジニアなら簡単に削除できると思います.

また Wiki のように誰でもいじれるようにしたかったので, 自分が登録した解法のみ削除可能というのもちょっと違うなと思いました.

  • アカウントなし削除不可にした場合の削除対応が面倒

フォーム作って, リクエスト来たら内容確認して, 手作業で削除が面倒です.

権限については何か問題が起きてから考えます.

7. 反省点

1. チュートリアル中に飽きる

最初にチュートリアル(「アプリ開発前にやったこと」参照)をまとめてやったのですが, 飽きてだらだらしてしまいました.
チュートリアルの区切りで, 学んだことをブログなどにアウトプットするなどして気分転換すればよかったです.

1ヶ月くらいチュートリアルやってました.

2. フロンドエンド雰囲気で動かしている

JavaScript の勉強を何もせず作ったので, React という言語を勉強したような状態です.
なんかわからないけど動いちゃっています.

JavaScript の勉強のために Chrome 拡張機能でも作ろうかなと思っています.

3. Twitter の有益情報を見て見ぬ振り

以下のような今回の開発と関連のある Tweet が流れてきましたが、キャパオーバーだったので見て見ぬ振りをしました.

  • 今の React で class を使う必要はない
  • export default は使わない方がいい
  • REST よりも gRPC
  • etc

メモは残しているのでここら辺も消化していきます.

4. タスク・スケジュール・工数管理

チュートリアル含めて1ヶ月で完成する予定でしたが2ヶ月ちょいかかりました.

タスク管理は GitHub のプロジェクトで行いました.
やらなければいけないことを書き出してやる順番で並べ替えていました.
リリース後でよい(疲れたので後回し)ものは issue に移しています.

スケジュールと工数管理は何もやってないです.
趣味開発であることも考慮して自分の中で妥協点を見つけたいです.

8. Kagoole の課題

機能的には現在20個以上 issue があり山積みです.
ただ大きな課題としては「使ってもらう」に尽きると思います.

  • 必要なアプリなのか
  • 現状何人の人が使ったのか
  • どれくらいの頻度で使うものか
  • 定期的に使われているのか
  • etc

わからないことだらけなので, まずはログをとることと宣伝が必要です.

9. 感想

予定よりも時間はかかりましたが最終的に完成したのはよかったです.

本当にフロントエンドエンジニアの方には尊敬しかないです.
いつもありがとうございます.

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 に行ってきます。

参考資料