u++の備忘録

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で公開しました。