Slide 1

Slide 1 text

© DeNA Co., Ltd. 1 #15 atmaCup 振り返り & 1st place solution 株式会社ディー・エヌ・エー 2023年8月10日 村上 直輝

Slide 2

Slide 2 text

© DeNA Co., Ltd. 2 村上 直輝 #23新卒 #Kaggle #アルゴリズムロジック ソリューション事業本部データ統括部AI技術開発部 ライブストリーミンググループ @634kami © DeNA Co., Ltd. 自己紹介

Slide 3

Slide 3 text

© DeNA Co., Ltd. 3 1 問題設定 ディスカッションでの基本的な解法 自分の解法 (1st place solution) 他の上位チームの解法 4 3 2 目次

Slide 4

Slide 4 text

© DeNA Co., Ltd. 4 4 01 問題設定

Slide 5

Slide 5 text

© DeNA Co., Ltd. 5 タスク概要 ● アニメ作品の情報とユーザーからの1~10段階の評価のデータを元にして、評価のわ かっていないユーザー・作品の組に対する評価を予測する

Slide 6

Slide 6 text

© DeNA Co., Ltd. 6 データ概要 ● train データ (train.csv) ○ user_id, anime_id, score が存在 ● test データ (test.csv) ○ user_id, anime_id のみが存在 ○ trainデータには存在しない未知 ユーザーが約 23 % 存在 ● アニメ作品情報 (anime.csv) ○ アニメ作品のメタ情報が記載 ○ ジャンル・作品名・放送日・年齢 制限・視聴中のユーザー数など 様々なデータが存在

Slide 7

Slide 7 text

© DeNA Co., Ltd. 7 評価について ● 評価指標 ○ 正解値と予測値の RMSE (Root Mean Squared Error) ● 提出形式

Slide 8

Slide 8 text

© DeNA Co., Ltd. 8 8 02 ディスカッションでの基本的な解法

Slide 9

Slide 9 text

© DeNA Co., Ltd. 9 ● 流れ a. train データと test データに、アニメのメタデータテーブルを結合 b. テーブルを色々と処理して特徴量を生成 c. LightGBM や Neural Network などを用いて通常のテーブルデータに対す る回帰タスクとして学習 ● ほとんどの参加者が LightGBM などをメインにしていた模様 ● 簡単なものならChatGPTでもできる ○ ディスカッション:[LB 6.4222-_1.5571] Baseline by ChatGPT 方法1:LightGBMなどのテーブルデータ用モデル

Slide 10

Slide 10 text

© DeNA Co., Ltd. 10 ● SVD(Singular Value Decomposition)の流れ a. 行列を作る:行はユーザー、列はアイテムを表し、各要素は評価を表す b. 行列を分解:潜在因子数 k を決め3つの行列に分解 c. 行列の再構成:分解した行列をもとに戻し、未知の部分を推定 ● 厳密に言えば行列の数学的特異値分解ではなく、行列の低ランク近似を計算する近似的な方法 ● ディスカッション:[LB1.2746] SVDによる協調フィルタリング 方法2:SVDなどの協調フィルタリング系の手法

Slide 11

Slide 11 text

© DeNA Co., Ltd. 11 11 03 自分の解法 ( 1st place solution )

Slide 12

Slide 12 text

© DeNA Co., Ltd. 12 振り返って大事だったと思うこと ● CV戦略 ○ seen と unseen のどちらかに overfit することがなかった ● アイデアを出す上での方針や考え方 ○ test データの視聴情報も活用する ○ グラフ上で見た時の 2-hop, 3-hop 先までの高次の接続情報を活用する  何故それをしたのかが分かるように説明することを心がけます

Slide 13

Slide 13 text

© DeNA Co., Ltd. 13 CV戦略 ● 前提:test のユーザーは2種類 ○ train にも出現する seen ユーザー (約77%) ○ train には出現しない unseen ユーザー (約23%) →いわゆるコールドスタート問題 ● 考え方 ○ 通常のレコメンドの文脈では未知(新規)ユーザーは特 別な対応を取ることが多い ○ それぞれのユーザー用に切り方を変えてモデル作成 するべきと判断 ● やり方:それぞれの専用モデルを作って予測 ○ seen 用モデル : ランダムでOK → KFold, StratifiedKFold ○ unseen 用モデル : ユーザーを group に → GroupKFold, StratifiedGroupKFold

Slide 14

Slide 14 text

© DeNA Co., Ltd. 14 CV戦略 ● 手元でのCVスコアの見積もり方 (LBとの比較用) ○ 方法1: ○ 方法2:  ※どちらでも問題ないが方法2の方が良いと思われる(詳細は次ページ) ● このCV戦略のメリット・デメリット ○ メリット ■ 専用の特徴量やモデルを作れて性能向上 ■ どちらか片方に overfit する懸念がなくなる ○ デメリット ■ 単純に考えると2倍のモデルをつくることにな るので手間がかかる → 共通の特徴量を使えばそれほど大変ではない

Slide 15

Slide 15 text

© DeNA Co., Ltd. 15 CV戦略:方法2の計算について(参考)

Slide 16

Slide 16 text

© DeNA Co., Ltd. 16 アイデアを出す上での方針や考え方 ● 考え方1:「ある作品を見た」という Implicit Feedback な情報そのものを活用する ○ 「見た」という情報自体がそのユーザーを特徴付ける ■ そもそも興味がなければ見ようとすらしないはず ○ test データの情報もフルに使いたい ■ score は分からないがその作品を見たということは分かる ■ 通常の推薦タスクではこの情報すら無いことが多いので有効活用したい ● (参考)Explicit Feedback と Implicit Feedback ○ Explicit Feedback ■ ユーザーからの明示的な評価やレビュー ■ 例:アニメ作品への10段階の評価 (score) ○ Implicit Feedback ■ ユーザーの行動や操作から得られる間接的なフィードバック ■ 例:アニメ作品を視聴したかどうか (user_id, anime_id の対応関係)

Slide 17

Slide 17 text

© DeNA Co., Ltd. 17 アイデアを出す上での方針や考え方 ● 考え方2:グラフ上で見た時の 2-hop, 3-hop 先までの高次の接続情報を活用する ○ 1-hop 先の頂点は大事だが、少し離れたところにも大事な情報が隠れている可能性 使う情報が少ない場合 使う情報が多い場合

Slide 18

Slide 18 text

© DeNA Co., Ltd. 18 特徴量エンジニアリング:概要 ● 特に効いたと思われる特徴量の概要 ○ 視聴ユーザー数・視聴停止ユーザー数などの集約特徴量 ○ ジャンルなどの情報を multi hot encoding → svd → userごとに集約 ○ Implicit Feedback 用の手法から得られる factor (user, item の埋め込み) LightGBM の feature importance(上位のみ) ※ diff と書いてあるのは div のミスです

Slide 19

Slide 19 text

© DeNA Co., Ltd. 19 特徴量エンジニアリング:集約系 ● やったこと ○ 結合した anime データ等を user ごとに集約 ○ user ごとに集約した特徴をさらに anime ごとに集約 ■ 2hop先までの情報を特徴量にできるように ■ user ごとに集約するだけで良い精度が出ていたのでそんなには変わらないかも ● その他:「集約前の値/ユーザーごとの集約結果(平均値)」 ○ イメージは以下の通り ■ user ごとに集約した特徴:そのユーザーの傾向や好みを表す ■ 集約前の値を集約結果(平均値)で割る:傾向や好みからどれだけ離れているかを表す ○ LightGBMは特徴量同士の非線形な関係を学習するのが苦手なので、差ではなく割り算に ○ 初手で試していて、使わない状態で実験していないので具体的な効果は未検証

Slide 20

Slide 20 text

© DeNA Co., Ltd. 20 特徴量エンジニアリング:Implicit Feedback の行列分解 ● やったこと ○ train と test を結合して、視聴したかどうかを表す user, anime の組を作る ○ 視聴したかどうかを 0, 1 の値として表す行列としてみなして行列分解 ○ user, anime ごとに k 次元のベクトルができるので特徴量にする ● なぜこれをやろうと思ったか:test データの視聴情報もフルに活用できそうだから ● Implicit というライブラリのモデルを利用 ○ BayesianPersonalizedRanking, AlternatingLeastSquares, LogisticMatrixFactorization

Slide 21

Slide 21 text

© DeNA Co., Ltd. 21 モデル:LightGCN (seen CV: 1.145) ● LightGCNは推薦タスク用のGNN ○ 2部グラフ特化の Implicit Feedback 用のモデル ○ 元論文では Bayesian Personalized Ranking (BPR) loss を利用 ○ 特徴量は必要なくグラフ構造から各頂点の埋め込 み表現を学習 ● multi-hop 先の接続情報を使い予測可能 ● 工夫した点 ○ 回帰タスクに合わせるために損失を RMSE に変更 ○ 各頂点の埋め込みの次元は 4096 と大きめにすると 性能向上 ○ implicit feedback として学習し特徴量にもした 引用元:He, Xiangnan, et al. "Lightgcn: Simplifying and powering graph convolution network for recommendation." Proceedings of the 43rd International ACM SIGIR conference on research and development in Information Retrieval. 2020. Figure.2

Slide 22

Slide 22 text

© DeNA Co., Ltd. 22 (参考)User-item Collaborative Filtering での GNN ● user と item の相互作用の情報がある→二部グラフとして扱える ● 古典的な協調フィルタリングの手法よりも高次の接続情報を得るためにGNNを利用 引用元:Wu, Shiwen, et al. "Graph neural networks in recommender systems: a survey." ACM Computing Surveys 55.5 (2022): 1-37. Fig.2.

Slide 23

Slide 23 text

© DeNA Co., Ltd. 23 モデル:Heterogeneous Graph Learning (seen CV: 1.137) ● Heterogeneous Graph (異種グラフ) ○ 頂点や辺に種類があるグラフのこと ○ user と anime の2種類の頂点が存在する異種グラフ ● 強み ○ multi-hop 先の特徴を含めて学習が可能 ○ LightGCN で使えない user, item の特徴量を使える ■ user, anime ごとに groupby した平均を利用 ● 工夫した点(pytorch geometric を用いて実装) ○ SAGEConvを利用(他の Conv は性能を出せず) ○ LayerNorm を挟む ○ 最初の入力を保持しておいてレイヤーごとの出力に加算 画像引用元 :https://pytorch-geometric.readthedocs.io/en/la test/tutorial/heterogeneous.html

Slide 24

Slide 24 text

© DeNA Co., Ltd. 24 その他の利用したモデル ● LightGBM(seen CV: 1.095・unseen CV: 1.36089) ○ 単体では最も性能が高かった ○ 最後は 10fold に切って、学習率を小さめにしてじっくり学習させた ○ target encoding で若干リーク気味だったかも ● NN(seen CV: 1.143・unseen CV: 1.384) ● SVDなどの Explicit Feedback 用の手法 (seen CV: 1.165・unseen CV: 1.441) ○ surprise というライブラリを利用 ● set transformer (unseen CV: 1.429) ○ 集合に対する transformer ○ user に対して視聴 anime を集合として入力 ○ 性能はイマイチだったがアンサンブルに利用 ※ CV スコアは最良のもので、アンサンブルにはそれ以外の物も利用

Slide 25

Slide 25 text

© DeNA Co., Ltd. 25 アンサンブル・スタッキング ● 以下の順で試して最後が良かったので最終提出に利用 ○ グリッドサーチでblendの重み付け ○ scipy.optimize.minimizeでblendの重み付け ○ sklearnのLinearRegressionによるスタッキング ■ 負の重みを許すとスコアアップ (surprise 系のモデルの重みが負になっていた) ● 利用モデル ○ seen 用:LightGCN x 2 、hetero GCN x 4、LightGBM x 7 、NN x 1、surprise x 8 ○ unseen 用:LightGBM x 7、NN x 2 、set transfomer x 1 、surprise x 10

Slide 26

Slide 26 text

© DeNA Co., Ltd. 26 26 04 他のチームの解法

Slide 27

Slide 27 text

© DeNA Co., Ltd. 27 2nd Place Solution (ynktk さん) ● 概要:LightGBM, XGBoost, Catboost の結果を Ridge で stacking ● CV 戦略 ○ ランダムに 10 fold に分割 ● 特徴的な特徴量 ○ anime2Vec (word2vec ベース) ■ anime_id や original_work_name を単語として userごとに document とし word2vec を適用 ■ 事前にaired_start_dateでsort ■ userが作品を見た正確な日付は分からないためwindowは大きめに取る ○ anime2Vec(TalkingData 1st solutionベース) ■ user_idごとに視聴した作品を集めてdocumentとし、Vectorizerと次元削減の組み合わせを適用する ■ CountVectorizer x LatentDirichletAllocation, CountVectorizer x TruncatedSVD, CountVectorizer x NMF, TfidfVectorizer x LatentDirichletAllocation,

Slide 28

Slide 28 text

© DeNA Co., Ltd. 28 3rd Place Solution (maruyamaさん・zakopuroさん) ● 概要:複数のLightGBMのアンサンブル(結果の平均) ● CV 戦略 ○ テストデータ同様、検証データの23%が未知ユーザーになるように分割 ● 特徴的な特徴量 ○ NMF特徴量:以下の評価行列をNMFで分解して作った user, anime ベクトル ■ 行:ユーザー ■ 列:anime_id, ジャンル, 制作会社, ライセンス所有者, スタジオ, … ■ 値:評価件数 ○ 各ユーザーの評価件数 ■ 総評価件数、ジャンル別の評価件数、同じIPの評価件数

Slide 29

Slide 29 text

© DeNA Co., Ltd. 29 5th Place Solution (statsu さん) ● 概要:XGBoost ● CV 戦略 ○ seen と unseen でそれぞれ専用モデルを作成 ● 特徴的なところ ○ ProNEの利用:グラフから頂点のベクトルを特徴量として得る ■ 使うグラフ ● user と anime をnodeとしたgraph ● user と genre(or producer or studio) をnodeとしたgraph ■ ベクトルそのものに加え、ベクトル同士の類似度、クラスタ中心からの距離なども利用 ○ target encoding が効いていた模様

Slide 30

Slide 30 text

© DeNA Co., Ltd. 30 12th place solution (bowwowforeachさん) ● 概要:LightGBM ● CV 戦略 ○ seen と unseen でそれぞれ専用モデルを作成 ● 特徴的なところ ○ 2つの one-hot encoding だけで private 25 位相当になる ■ user_idごとにどのanime_idを見たかを0,1で(2000列) ■ anime_idごとにどのuser_idに見られているかを0,1で(1998列) ○ 他にも複数の特徴量を追加して1度学習し、Importanceが高い2000個だけ残して後は削除

Slide 31

Slide 31 text

© DeNA Co., Ltd. 31