u++の備忘録

生存戦略を語るPodcast「keep-alive.fm」に出演しました #keepalivefm

広義のソフトウェアエンジニアが生存戦略を語るPodcast「keep-alive.fm」に出演しました。

anchor.fm

話題

以下が今回のお品書きです。以前から親交のあった@guiltydammyさんと@crcrparさんと一緒に、楽しくお喋りしました。

興味のある部分だけでも、ぜひ聴いてみてください。感想は #keepalivefm でよろしくお願いします。

  • 00:00:00 keep alive fmのドメインを取りました!
  • 00:01:00 本編開始
  • 00:02:00 自己紹介
  • 00:04:20 INMA “30 Under 30 Awards”
    • 国際ニュースメディア協会で今年新設された世界の若手30人に贈られる賞
    • アジア太平洋地域の最優秀賞
    • 大学時代の学生新聞経験と、Kaggleなどデータサイエンスの強み
  • 00:07:00 大学新聞
    • 記者や編集長の立場で、電子版の立ち上げに関わる
    • ページ閲覧数やSNSでの反響を分析
    • 紙以上の世界の広がりを感じて、webの凄さを知る
    • 広告やイベント事業にも関わる
  • 00:14:10 データサイエンス
    • 学生新聞の経験を通じて、データを分析して知見を取り出す楽しさを知った
    • 企業に入った後に趣味としてKaggleを始める
    • Optunaの活用事例
  • 00:28:00 チームか個人か
    • 知識共有が好き
    • 会社への帰属意識
    • 個人としての責任・価値
    • コンフォートゾーン・転職・挑戦
    • データサイエンスが向いている領域
  • 00:50:45 どれくらい先のこと考えている?
    • @upura0 の場合
    • @crcrpar の場合
    • @guiltydammy の場合
    • 答えは分からないながらも考えていくことが大切
    • 人生はA/Bテストできない
    • いろいろ手数を打っていて、気づいたら希少性になった

おわりに

このPodcastの第1回に登場するお三方は、次の記事を拝見して当時から一方的に知っていました。このたびご縁があって出演することになり、感慨深い気持ちです。過去3回も良い話が多いので、ぜひ聴いてみてください。

employment.en-japan.com

Kaggle「OpenVaccine: COVID-19 mRNA Vaccine Degradation Prediction」コンペ参加録

Kaggle「OpenVaccine: COVID-19 mRNA Vaccine Degradation Prediction」コンペ*1に参加し、銀メダルの77位でした。

f:id:upura:20201007100915p:plain

解法はdiscussion*2に簡単にまとめましたが、公開Notebookからの派生でモデルを作り、CVの良い8つのモデルの平均を取りました。

1位相当の提出もありましたが、理論なき定数倍によるもので、最終選択はできませんでした。

f:id:upura:20201007100920p:plain

同時に終了になったKaggle「OSIC Pulmonary Fibrosis Progression」コンペ*3も地味に参加していたのですが、こちらは銅メダル圏内から転落してメダルなしでした。画像コンペの練習にはなったかなと思います。

今回の最終結果の発表時は「Covid Vaccine Private LB公開を見守る会」なるイベント*4に参加していました。公開前後にワチャワチャ話すのは思いのほか楽しく、参加者が多いコンペのときにまた参加(もしくは企画)したいです。


テストデータの不備が判明した結果、順位表*5が8日に更新されました。順位は58位で変わらず銀メダルでした。

f:id:upura:20201008093105p:plain

SIGNATE「ひろしまQuest2020#stayhome【アイデア部門】」提出資料

以前に参加していたSIGNATE「ひろしまQuest2020#stayhome【アイデア部門】」*1について、自分の提出資料を公開しました。残念ながら入賞はできませんでしたが、興味関心のある野球のデータを分析できて非常に楽しいコンペでした。入賞者以外の成果物共有を許諾してくださったデータスタジアム・SIGNATEのご担当者さまに、改めてお礼申し上げます。

発表資料

※Speaker Deckの仕様で、途中でサイズが変わるPDFに対応していないようです。Speaker Deckのページからダウンロードしてご覧ください。

山手線を徒歩で一周した(3年ぶり2回目)

コロナ禍でしばらく外出自体を控えていましたが、年始以来の久々の徒歩企画です。

upura.hatenablog.com

今回はマスクを装着し、山手線を徒歩で一周しました。3年前の学生時代以来、人生2度目の挑戦です。前回とは逆方向で周ってみました。

upura.hatenablog.com

前回よりも2時間短縮し、8時間でゴールしました。「リングフィットアドベンチャー*1のおかげか、足の疲労も前回ほどではなかったと思います。高輪ゲートウェイ駅の新設など、いろいろ変わっている部分もあり面白かったです。

非負値行列因子分解を用いたKaggleコンペ推薦

非負値行列因子分解を用いて、Kaggleコンペを推薦する仕組みを考えました。

f:id:upura:20200905115018p:plain

手法

いくらでも高度なやり方はあり得ますが、手っ取り早い方法として行列分解を試しました。行列分解は基本的な推薦手法の一つです*1。今回用いる手法を試している記事*2もネットに多く公開されています。

具体的には、次のような手続きを考えました。

  1. 過去のユーザのコンペ参加記録から「ユーザ×コンペ」の行列を作成(値は参加した場合にのみ1を与える)
  2. 行列を非負値行列因子分解して、2つの行列を得る
  3. 2つの行列を掛け合わせた結果を初期の行列と比較し、推薦結果を出力する

f:id:upura:20200905115628p:plain
図は Non-negative matrix factorization, Wikipedia*3 より引用。

初期の行列(上)と、2つの行列を掛け合わせた結果(下)を以下に示します。行列を一度分解した上で掛け合わせることで、元々は0だった箇所にも0より大きい値が入っていると分かります。今回はこの値を「参加確率」と見なすことで、推薦に利用するといった枠組みになります。

f:id:upura:20200905121723p:plain

実験

データセット

過去のユーザのコンペ参加記録は、Kaggle公式が公開している「Meta Kaggle」*4から作成しました。いくつかのテーブルを結合・加工し、「ユーザ×コンペ」の行列を作成します。

実装

実装のコードは、次のNotebookで確認できます。非負値行列因子分解はsklearnの実装*5を利用しました。

www.kaggle.com

非負値行列因子分解の該当部分は下記で、とても簡単な記述で済んでいます。

model = NMF(n_components=2, init='random', random_state=0)
W = model.fit_transform(X)
H = model.components_
R = np.dot(W, H)

デモアプリ

実装内容のデモアプリは、pythonスクリプトから手軽にWebアプリを実装できる「Streamlit」*6を用いました。ソースコードGitHubで公開済*7です。

今後の展望

コールドスタート

当然のことながら、行列分解の手法では(本来最も推薦を欲しているはずの)コンペ参加が少ない人への推薦が難しくなります。このコールドスタート問題に如何に対処するかは重要な課題です。

デプロイ

本システムをデプロイするに当たって、「ユーザ×コンペ」の行列が非常に大きいことが問題になりました。joblibで圧縮したファイルでも数GBの大きさになります。単純に大きいインスタンスを利用するという手もありますが、実運用に当たっては様々に考慮すべき要素が出そうです。(データベースをどこで持つか、更新をどうするか、どこまでをサービス側で持つか、などなど)

おわりに

本記事では、非負値行列因子分解を用いたKaggleコンペ推薦の方法について述べました。自分の手を動かして推薦システム構築に取り組むと、デプロイも含めて様々な課題に直面して学びが深いと感じています。Kaggleコンペ推薦はドメイン知識もあって取っつきやすいタスクなので、今後もゆるりと取り組んでいきたいところです。

「Basketball Behavior Challenge BBC2020」で4チーム中1位に

9月1日まで開催されていた「Basketball Behavior Challenge BBC2020」*1というコンペで1位になりました*2。選手とボールの座標推移からスクリーンプレイの有無を判定するタスクで、分析していて楽しいコンペでした。

f:id:upura:20200903155012p:plain

解法の概要とスコアの推移は下図の通りです。詳細は、コンペ中に利用していたGitHubリポジトリ*3をご覧ください。

f:id:upura:20200902032536p:plain f:id:upura:20200902032539p:plain

本コンペの存在は、運営に関わっている「Sports Analyst Meetup #7」*4にて、LT発表してくださった本コンペのデータ提供者である藤井先生に教えていただきました。優勝者は名古屋大学にてシンポジウム発表できるはずで、衣錦還郷を狙いましたがCOVID-19で中止になり残念です。とはいえ、スポーツのデータを触ることができ、楽しいコンペでした。