Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved.
株式会社リンクバルイベントレコメンドエンジン作成コンペ第3位ソリューション
2018年7月5日株式会社KDDI総合研究所
ruik
Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved.
SIGNATE: ruik / 木村塁 / twitter:@ruik
KDDI総合研究所所属
社内のデータ分析コンペチームに所属しているものの、SIGNATE / Kaggleは嗜む程度
自己紹介
2
Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved. 3
始める前に考えた作戦 特徴量をどう作るかの勝負になりそう
モデルは使い慣れているLightGBM決め打ちである程度いってみて、余裕があれば他も試す
時系列でtrain/testが分かれていて、test期間が1週間なので、train最後の1週間をvalidation用に使って評価するようにする
過去に自分が参加したコンペの復習から始めよう
Kaggle Instacartコンペの復習 各ユーザーがどの商品を再度買うかというコンペだったので、今回過去にアクションしていないイベントへのアクションも予測するという点では違うが、特徴量の作り方の大まかな方針は勉強になった
• イベント単位の特徴量、ユーザー x イベントの特徴量を作らなきゃ、ということを思い出す
評価関数に対する最適化が必要だね、ということも思い出す
• 今回だとnDCG@20最適化をすることになる
本コンテストでの手法・アプローチ
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
Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved. 5
特徴量の作り方 イベント単体
• イベントの開催日時とtest期間開始日時との差• イベントへの直近のアクション数• ある県の全イベントへの全アクションに対し、そのイベントへのアクションの割合• どういう年齢制限のイベントがアクションされやすいか• どういう価格のイベントがアクションされやすいか
ユーザー x イベント• この組み合わせでの直近のアクション• 似たようなイベント(年齢制限、価格、都道府県、interestが一致)に直近でアクションしているか• 過去にアクションしたイベントの年齢上限/下限の平均との差(同性、異性)• 過去にアクションしたイベントの価格の平均との差(同性、異性)• どの県のイベントにアクションしやすいか• どのinterestにアクションしやすいか• どの曜日のイベントにアクションしやすいか
ユーザー(抽象化) x イベント• ある県のユーザーはどの県のイベントを選びやすいか• ある県のユーザーは直近でどのイベントにアクションしているか• ある年齢&性別のユーザーはどういう価格帯のイベントにアクションしやすいか• ある年齢&性別のユーザーはどういうinterestのイベントにアクションしやすいか
過去の部分を7日、14日‥等にしてバリエーションを増やしたものの、最終的には47特徴量
本コンテストでの手法・アプローチ
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
・・・
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は仕事しながらやっている
金曜はコンペの合間に仕事をしている
土曜の午前に保育園の遠足イベントをこなし、その後ひたすらコンペ
月曜もコンペの合間に仕事をしている
※学習期間を伸ばして時間がかかっているので、実稼働は
あまりない
Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved. 8
参考:変数重要度
Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved. 9
短期間で集中して取り組めたのが良かった 特徴量追加すればするほど上がり続けた
モチベーションが下がらずやり続けられた
会社の同僚がコンペに参加していたことがモチベーション維持につながった
やり残したことはまだありそう usersにデータがないuserについてはどのようにすればよかったのか?
• 直前にtestと状況を合わせるために、train/validation側でも週の初めの段階で登録されていないユーザーのデータは無くしたが、publicとprivateの値が乖離するだけで、privateスコアは下がっているように見えた
パラメーターチューニングほとんどやれていない
異なる複数モデルの出力結果とアンサンブルしたらもっとよかったのではないか
• 最後ギリギリでやろうとして間に合わなかった
• いつも同じ状況になるから、事前にアンサンブルが簡単にできるようにしておくべきだった
AWSのリソースを使わせてくれた&業務時間中に取り組ませてくれる会社に感謝
土日に子供の面倒を見てくれた妻に感謝
本コンテストの感想
Copyright(C) 2018 KDDI Research, Inc. All Rights Reserved. 10