u++の備忘録

東西分割開催のJリーグ各チーム移動距離を可視化

新型コロナウイルス感染症の拡大防止のため第1節を終えた段階で中断していたJ1リーグは、7月4日に一斉再開しました。7月中は移動による感染リスクを避けるため近隣クラブが対戦する方式を採用しており、具体的には全18チームを東西に2分して各グループ内で対戦相手を決めています。

www.nikkei.com

次の記事で言及されている通り、序盤戦の移動距離が他チームに比べて少なく、スタートダッシュに有利な状況のチームが存在する可能性もあります。この記事では具体的な数字が出ていなかったので、本ブログで実際にデータに基づく可視化に取り組みます。

sportiva.shueisha.co.jp

結果

f:id:upura:20200711001731p:plain

縦軸の距離は、ヒュベニの公式に基づき座標から計算しました。名古屋グランパスなど複数のホームスタジアムを有している場合は、主に使われている方を採用しています。また本拠地と別の場所でキャンプを張っているなどの個別対応は考慮していません。

www.trail-note.net

当然ですが、札幌や九州のチームと戦うか否かの影響が大きくなりますね。

f:id:upura:20200711001745p:plain

おわりに

本記事では、東西分割開催のJリーグ各チーム移動距離を可視化しました。今後の課題としては、本来予定されていた2-7節のカードの移動距離と比較すると、差分が分かりやすくなりそうです。一連のコードは、下記で公開しています。

www.kaggle.com

ProbSpace「YouTube動画視聴回数予測」コンペ参加録

ProbSpaceで開催されていた「YouTube動画視聴回数予測」コンペに参加しました。Lain.さんとチームを組み、public 4位・private 6位でした。

f:id:upura:20200629002350p:plain

prob.space

コンペ概要

YouTube APIで取得できるメタデータを入力として、動画の視聴回数を予測するタスクでした。具体的には、下記のデータが利用できました。

項目名 説明
video_id 動画ごとに割り振られる一意なid
title 動画のタイトル
publishedAt 動画の投稿時間
channelId 動画を投稿したチャンネルのid
channelTitle チャンネルのタイトル
categoryId 動画カテゴリのid
collection_date データレコードの収集日
tags 動画に割り当てられたタグ`
likes 高評価の数
dislikes 低評価の数
comment_count コメント数
thumbnail_link 動画のサムネへのリンク
comments_disabled コメントが許可されない動画であるか? Trueの場合にはcomment_countは0となる
ratings_disabled 高評価と低評価が許可されない動画であるか? Trueの場合にはlikesとdislikesは0となる
description 動画の説明文

video_id, thumbnail_linkからはそれぞれ動画・サムネイル画像が取得でき、title, descriptionはテキストです。いわゆるマルチモーダルなデータが利用できるコンペでした。

取り組み

YouTubeという題材の身近さとマルチモーダルの技術的な面白さに興味をそそられ、終了10日前とギリギリでしたが参加を決めました。

その後にLain.さんとチームマージし、最終的にpublic 4位・private 6位となりました。ベストモデルは、私1モデルとLain.さん3モデルの合計4モデルの平均でした。

私の担当部分のソースコード一式はGitHubで公開しました。以下、概要を述べます。

github.com

特徴量

テーブル + テキストのtfidf*1&count*2 で特徴量を作りました。

テキストからはBERT*3、画像からはEfficientNet*4で特徴抽出しましたが、性能に寄与しませんでした。

モデル

画像を用いたEfficientNetのfine tuningも試しましたがCVが悪かったので、ニューラルネットワークは諦め勾配ブースティング系のモデル(LightGBM*5, CatBoost*6)を使いました。Pseudo Labeling でCV & public lbスコアが伸びました。

CV戦略

生の特徴量のみを用いたLightGBMモデルのfeature importanceで上位に来ていたratings_disabledを対象にしたStratifiedKFold(n_splits=5, shuffle=True, random_state=7)に変更して、CV & public lbスコアが伸びました。

おわりに

まずはチームを組んでくださったLain.さんにお礼申し上げます。

個人的な反省点は、マルチモーダルを扱うニューラルネットワークで全然lossが落ちなかったことです。結局は特徴抽出してLightGBMに突っ込む定番の解法になってしまいました。とはいえEfficientNetなどを実践で試せた経験を生かして、次回以降のコンペの糧としていきます。

せっかくのYouTubeコンペなので、この記事についての動画をYouTubeで公開しました。

Stay Homeで『相棒』全部観た(おまけ:nagisa & nlplotで可視化)

今年4月にKDDIテレビ朝日が設立したTELASA株式会社が運営する動画配信サービス「TELASA」にて、2000年のpre seasonから2019年の最新作まで『相棒』全シーズンの動画が配信されています。

www.videopass.jp

『相棒』はたびたび夕方に再放送され、「AbemaTV」「Amazon Prime Video」などで一部シーズンは配信されました/されていますが、全てのシーズンが一挙に配信されるのは私の知る限り初めてです。昔から生粋の『相棒』ファンだったこと、かつ新型コロナウイルス感染症の影響で在宅が推奨されていることから、この機に見返すことに決めました。

せっかくなので、最後に『相棒』データを自然言語処理した結果を可視化しておきます。

データ収集

誰でも閲覧可能な各動画の概要欄を収集して、次のようなcsv形式で保存しておきます。

第1話 アレスの進撃/右京(水谷豊)が突然、消息を絶って1週間。亘(反町隆史)は、何者かによって海に流された右京のスマートフォンが秋田に流れついたことから、潮流を計算し、北海道付近に浮かぶ“天礼島”にあたりをつける。すると亘は、島に渡って早々、男が若い女性を連れ去ろうとしている現場に遭遇。何とか拉致を防ぐが、男は姿を消してしまう。

www.videopass.jp

f:id:upura:20200626005233p:plain

各シーズンの動画数は次の通りでした。

df.groupby('seasons').count()['vols'].plot.bar()

f:id:upura:20200626005349p:plain

日本語の自然言語処理

日本語の文章をサクッと分かち書きして可視化するために、今回は次の2つのライブラリを利用しました。

  1. 形態素解析ライブラリ「nagisa」 https://github.com/taishi-i/nagisa
  2. 可視化ライブラリ「nlplot」 https://github.com/takapy0210/nlplot

前者は以前にブログで紹介したこともあるライブラリです。文字単位の双方向LSTMを採用しておりURLなどに頑健な点、人名などの分かち書きしたくない単語指定が手軽な点から採用を決めました。

upura.hatenablog.com

後者は自然言語処理の基本的な可視化を手軽にできるようにしたライブラリです。基本的な描画はplotlyを用いており、Notebook上でインタラクティブにグラフを操作できます。

www.takapy.work

現状のpipで入るバージョンにはWord Cloudの可視化に不具合があります。PRを出して修正済なので、当面はgithubのmasterからインストールすると良いでしょう。

github.com

可視化

それでは可視化した結果を以下に示していきます。一覧の処理は、KaggleのNotebookを公開しました。

www.kaggle.com

uni-gram

f:id:upura:20200626010244p:plain

bi-gram

f:id:upura:20200626010326p:plain

Tree Map

f:id:upura:20200626010439p:plain

Word Cloud

f:id:upura:20200626010458p:plain

Co-occurrence network

f:id:upura:20200626010719p:plain

sunburst chart

f:id:upura:20200626010756p:plain

「atmaCup#5 振り返り会」で「MLflow Tracking を用いた実験管理」について発表しました

昨日開催された「atmaCup#5 振り返り会」*1で「MLflow Tracking を用いた実験管理」について発表しました。本記事にリンク集を掲載します。

発表資料

コンペで使用していたGitHubリポジトリ

https://github.com/upura/atma-comp05

自作ライブラリ「Ayniy」のGitHubリポジトリ

github.com

自作ライブラリ「Ayniy」のドキュメント

upura.github.io

発表再現動画

コンペ参加録

upura.hatenablog.com

人工知能学会2020@熊本のご飯まとめ

2020年度 人工知能学会全国大会 (第34回)に参加してきました。 昨年度と同様、現地で満喫したご飯をまとめます。

upura.hatenablog.com

おわりに

本年度はオンライン開催だったので、熊本料理を満喫する野望は叶いませんでした。(コロナが落ち着いたら必ず・・・)

オンラインでの学会参加は初めてでしたが、運営・座長・発表者らの皆さまのご尽力のおかげで、快適な参加体験でした。学会参加の魅力の一つである参加者同士の交流がほとんどできなかったのは、仕方ないですが残念なところです。 2021年度の人工知能学会全国大会は仙台で開催されると発表されました。来年度は、できれば現地で参戦したいなと思っています。

「atmaCup オンサイトデータコンペ#5」参加録 #atmaCup

「atmaCup オンサイトデータコンペ#5」*1に参加し、public 16位・private 27位*2でした。観測データを基にした2値分類タスクで、指標はPR-AUC*3でした。

途中から K_mat さん*4 とチームマージし、テーブルデータに対するニューラルネットワーク周りなど、大いに勉強になるコンペでした。

最後に選んだ2サブの概要を以下にまとめておきます。

Submission 1: Trust LB (public: 0.9137, private: 0.8595)

f:id:upura:20200606192258p:plain

Submission 2: Trust CV (public: 0.8687, private: 0.7691)

f:id:upura:20200606194716p:plain

Nishika「財務・非財務情報を活用した株主価値予測」コンペ2位でした

Nishikaで開催されていた「財務・非財務情報を活用した株主価値予測」コンペ*1で、2位になりました。

f:id:upura:20200528191049p:plain

オープンデータのコンペなので、pipelineを整備しながら、のんびりと取り組みました。最終的にはLightGBMとCatBoostで3種類の予測値(public 19位, 19位, 36位相当)を作り、Netflix blending*2で、public 2位、private 3位になりました。その後の最終成果物の確認で1位だった方が辞退したため、2位で順位確定しました。

ソースコードGitHub*3で公開しています。