u++の備忘録

Kaggle APIとLINE APIを用いたKernelの新規投稿を通知する仕組みの構築

はじめに

Kaggle*1において、上位の成績を収めるためには日々投稿されるDiscussionやKernel、変化するLeaderboardの動向を注視することが大切です。

現状、Discussionについては公式で新しい投稿をメール通知する仕組みがあります*2が、KernelやLeaderboardについては存在していません。8月上旬には、日本人のKaggle参加者が集まるコミュニティ「kaggler-ja」*3での会話を発端として、Leaderboardの通知に関する要望も提案されています*4

もちろん公式で実装されるのが一番良いですが、今回は暫定的な対応としてKaggle公式が提供する「Kaggle API*5を利用して、Kernelの新規投稿をLINE通知する仕組みを構築しました。

同様の枠組みを用いることで、Leaderboardの情報などKaggle APIで扱える範囲の通知機能を実装することが可能です。私自身が一番欲しかったのがKernelの通知機能だったので、優先的に実装しました。実装はGitHubで公開しています。

github.com

システムの概要

構築したシステムの概要を下図に示します。

f:id:upura:20180825162810p:plain

大まかな処理の流れは以下の通りです。

  1. 「launchd」を用いて30秒に一度シェルスクリプトを定期実行
  2. シェルスクリプトの処理
    1. Kaggle APIを実行して、Kernelの最新の情報を取得
    2. Pythonを呼び出し、前回実行時からKernelの情報に差分があるか確認
    3. 差分がある場合には、「LINE API*6で通知を送る

以下では、個々の処理について説明していきます。

launchdによる定期実行

launchdを用いることで、Mac OS Xスクリプトを定期実行する仕組みを実現できます。詳細は、私が実装時に参考にした記事*7をご参照ください。

端的に説明すると ~/Library/LaunchAgents/ に以下のようなファイルを配置して、定期実行の条件を設定できるようになっています。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
    <string>kernel-notify</string>
  <key>ProgramArguments</key>
    <array>
      <string>/usr/local/bin/zsh</string>
      <string>/Users/{user_name}/{project_name}/kernel-notify.sh</string>
    </array>
  <key>StartInterval</key>
    <integer>30</integer>
  <key>RunAtLoad</key>
    <true/>
  <key>StandardOutPath</key>
    <string>/Users/{user_name}/{project_name}</string>
  <key>StandardErrorPath</key>
    <string>/Users/{user_name}/{project_name}</string>
</dict>
</plist>

Kaggle APIの実行

Kaggle API自体の導入については、GitHubのREADMEや下記の記事などをご確認ください。

www.currypurin.com

今回はKernelの情報を取得したかったので、以下のコマンドを実行しました。ここでオプションとしてコンペティションの指定をしています。

kaggle kernels list --competition home-credit-default-risk --sort-by 'dateCreated'

前回実行時からKernelの情報に差分があるか確認

この処理以降、Pythonに委託することにしました。単純に情報を前回実行時と比較し、変更があるか否かを確認しました。

LINE APIでの通知

LINE APIの導入については、下記を参考にしました。

s4t.hatenablog.com

以下の関数を用いて、LINEに通知を送ることができます。文言も自由に編集できるので、今回は新規投稿されたKernelのURLを通知することにしました。

def line(Me):
    line_notify_token = 'YOUR TOKEN'
    line_notify_api = 'https://notify-api.line.me/api/notify'
    message = '\n' + Me
    payload = {'message': message}
    headers = {'Authorization': 'Bearer ' + line_notify_token}
    line_notify = requests.post(line_notify_api, data=payload, headers=headers)

デモンストレーション

実際に本日15時44分ごろに新規投稿されたKernel*8について、LINE通知が確認できました。

投稿されたKernel
f:id:upura:20180825171132p:plain
LINE通知
f:id:upura:20180825171002p:plain

おわりに

今回はKaggle APIとLINE APIを用いて、Kernelの新規投稿を通知する仕組みを構築しました。この仕組みを応用することで、Kaggle APIで扱える範囲のさまざまな条件下の通知機能を実装できます。

こういった仕組みも活用して、より一層Kaggleを楽しんでいきたいと思います。

脚注