株式会社リンクバル イベントレコメンドエンジン作 …...Kaggle...

10
Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved. 株式会社リンクバル イベントレコメンドエンジン作成コンペ 第3位ソリューション 201875株式会社KDDI総合研究所 ruik

Transcript of 株式会社リンクバル イベントレコメンドエンジン作 …...Kaggle...

Page 1: 株式会社リンクバル イベントレコメンドエンジン作 …...Kaggle Instacartコンペの復習 各ユーザーがどの商品を再度買うかというコンペだったので、今回過去にアクションしていな

Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved.

株式会社リンクバルイベントレコメンドエンジン作成コンペ第3位ソリューション

2018年7月5日株式会社KDDI総合研究所

ruik

Page 2: 株式会社リンクバル イベントレコメンドエンジン作 …...Kaggle Instacartコンペの復習 各ユーザーがどの商品を再度買うかというコンペだったので、今回過去にアクションしていな

Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved.

SIGNATE: ruik / 木村塁 / twitter:@ruik

KDDI総合研究所所属

社内のデータ分析コンペチームに所属しているものの、SIGNATE / Kaggleは嗜む程度

自己紹介

2

Page 3: 株式会社リンクバル イベントレコメンドエンジン作 …...Kaggle Instacartコンペの復習 各ユーザーがどの商品を再度買うかというコンペだったので、今回過去にアクションしていな

Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved. 3

始める前に考えた作戦 特徴量をどう作るかの勝負になりそう

モデルは使い慣れているLightGBM決め打ちである程度いってみて、余裕があれば他も試す

時系列でtrain/testが分かれていて、test期間が1週間なので、train最後の1週間をvalidation用に使って評価するようにする

過去に自分が参加したコンペの復習から始めよう

Kaggle Instacartコンペの復習 各ユーザーがどの商品を再度買うかというコンペだったので、今回過去にアクションしていないイベントへのアクションも予測するという点では違うが、特徴量の作り方の大まかな方針は勉強になった

• イベント単位の特徴量、ユーザー x イベントの特徴量を作らなきゃ、ということを思い出す

評価関数に対する最適化が必要だね、ということも思い出す

• 今回だとnDCG@20最適化をすることになる

本コンテストでの手法・アプローチ

Page 4: 株式会社リンクバル イベントレコメンドエンジン作 …...Kaggle Instacartコンペの復習 各ユーザーがどの商品を再度買うかというコンペだったので、今回過去にアクションしていな

Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved. 4

nDCG@20=ランキング最適化について “LightGBM ランキング最適化”でググると、lambdarankというobjectiveがある事がわかる

metric=ndcgにして、ndcg_at=20にすると、nDCG@20を最適化できそう

ということで、これを採用

ただし、lambdarankをobjectiveにするときのデータの渡し方などがわかるサンプルが少なく、若干苦戦

実際の使い方はこんな感じでした

• lgb_train = lgb.Dataset(X_train, label = y_train, weight = w_train)

本コンテストでの手法・アプローチ

pandasのdataframeをquery(今回だとuser_id)でソートしておく

評価関数にあった2rj-1を計算して入れておく※rj:購入3、BM2、View1、アクションなしも1

アクションがあったら1

なかったら0

Page 5: 株式会社リンクバル イベントレコメンドエンジン作 …...Kaggle Instacartコンペの復習 各ユーザーがどの商品を再度買うかというコンペだったので、今回過去にアクションしていな

Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved. 5

特徴量の作り方 イベント単体

• イベントの開催日時とtest期間開始日時との差• イベントへの直近のアクション数• ある県の全イベントへの全アクションに対し、そのイベントへのアクションの割合• どういう年齢制限のイベントがアクションされやすいか• どういう価格のイベントがアクションされやすいか

ユーザー x イベント• この組み合わせでの直近のアクション• 似たようなイベント(年齢制限、価格、都道府県、interestが一致)に直近でアクションしているか• 過去にアクションしたイベントの年齢上限/下限の平均との差(同性、異性)• 過去にアクションしたイベントの価格の平均との差(同性、異性)• どの県のイベントにアクションしやすいか• どのinterestにアクションしやすいか• どの曜日のイベントにアクションしやすいか

ユーザー(抽象化) x イベント• ある県のユーザーはどの県のイベントを選びやすいか• ある県のユーザーは直近でどのイベントにアクションしているか• ある年齢&性別のユーザーはどういう価格帯のイベントにアクションしやすいか• ある年齢&性別のユーザーはどういうinterestのイベントにアクションしやすいか

過去の部分を7日、14日‥等にしてバリエーションを増やしたものの、最終的には47特徴量

本コンテストでの手法・アプローチ

Page 6: 株式会社リンクバル イベントレコメンドエンジン作 …...Kaggle Instacartコンペの復習 各ユーザーがどの商品を再度買うかというコンペだったので、今回過去にアクションしていな

Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved. 6

特徴量セットの増やし方 9/24週をtest

9/17週をvalidation9/10週以前を1週間単位でtrain_1, train_2, …として、train用データを増やせる

特徴量を生成する時間、メモリ使用量、学習時間がどれもバカにならないので、基本的にはtrain_1 + train_2の2週分を利用

testを予測するときには、validationで決めたパラメーター(主にイテレーション数)を用いて、validation + train_1の2週分で再度学習し直した

締切間際に、train期間を増やし始め、最終的には20週分をtrain期間にした

• 1週から10週までは線形に増えていくことを確認したが、最終的には時間の関係で決め打ち

本コンテストでの手法・アプローチ

9/24 9/319/10 9/17

testvalidationtrain_1train_2

9/3

・・・

Page 7: 株式会社リンクバル イベントレコメンドエンジン作 …...Kaggle Instacartコンペの復習 各ユーザーがどの商品を再度買うかというコンペだったので、今回過去にアクションしていな

Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved. 7

datetime public private

2018/5/16 21:56 0.11252 0.10188

2018/5/16 22:45 0.11143 0.09793

2018/5/16 23:12 0.11582 0.1029・特徴量加工ほぼなしで、users, eventsをマージしたのみ

2018/5/17 14:06 0.11638 0.11498

2018/5/17 16:06 0.13317 0.12439・年齢制限特徴量追加

2018/5/17 21:33 0.14502 0.14519

2018/5/17 22:59 0.14243 0.14355

2018/5/18 10:33 0.16058 0.16142・イベント開催曜日・時間特徴量追加

2018/5/18 15:36 0.17829 0.16808・objective:binaryでauc最適化→lambdarank導入

2018/5/19 13:55 0.1792 0.17301

2018/5/19 18:32 0.19773 0.19552・interest選好度追加

2018/5/20 0:50 0.21609 0.21651・曜日特徴量追加

2018/5/20 9:27 0.23748 0.23718・同イベントへの過去X日のアクション特徴量を追加

2018/5/20 11:21 0.23768 0.2347

2018/5/20 13:51 0.25271 0.2403・類似イベントへの過去X日のアクション特徴量を追加

2018/5/20 19:49 0.256 0.24841

・学習期間を2週→5週に・学習時、一部のusersデータを無くす(testに合わせる)・途中、バグが入ったり、バグを直したりして一進一退

2018/5/21 0:02 0.2556 0.23968

2018/5/21 10:35 0.25231 0.23678

2018/5/21 12:21 0.25833 0.24504

2018/5/21 19:18 0.26265 0.25072・学習期間を20週に

Submit履歴での振り返り

水曜夜に始める

木曜のPMは仕事しながらやっている

金曜はコンペの合間に仕事をしている

土曜の午前に保育園の遠足イベントをこなし、その後ひたすらコンペ

月曜もコンペの合間に仕事をしている

※学習期間を伸ばして時間がかかっているので、実稼働は

あまりない

Page 8: 株式会社リンクバル イベントレコメンドエンジン作 …...Kaggle Instacartコンペの復習 各ユーザーがどの商品を再度買うかというコンペだったので、今回過去にアクションしていな

Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved. 8

参考:変数重要度

Page 9: 株式会社リンクバル イベントレコメンドエンジン作 …...Kaggle Instacartコンペの復習 各ユーザーがどの商品を再度買うかというコンペだったので、今回過去にアクションしていな

Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved. 9

短期間で集中して取り組めたのが良かった 特徴量追加すればするほど上がり続けた

モチベーションが下がらずやり続けられた

会社の同僚がコンペに参加していたことがモチベーション維持につながった

やり残したことはまだありそう usersにデータがないuserについてはどのようにすればよかったのか?

• 直前にtestと状況を合わせるために、train/validation側でも週の初めの段階で登録されていないユーザーのデータは無くしたが、publicとprivateの値が乖離するだけで、privateスコアは下がっているように見えた

パラメーターチューニングほとんどやれていない

異なる複数モデルの出力結果とアンサンブルしたらもっとよかったのではないか

• 最後ギリギリでやろうとして間に合わなかった

• いつも同じ状況になるから、事前にアンサンブルが簡単にできるようにしておくべきだった

AWSのリソースを使わせてくれた&業務時間中に取り組ませてくれる会社に感謝

土日に子供の面倒を見てくれた妻に感謝

本コンテストの感想

Page 10: 株式会社リンクバル イベントレコメンドエンジン作 …...Kaggle Instacartコンペの復習 各ユーザーがどの商品を再度買うかというコンペだったので、今回過去にアクションしていな

Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved. 10