SlideShare una empresa de Scribd logo
1 de 10
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週をvalidation
9/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

Más contenido relacionado

La actualidad más candente

20180925 GCPUG Osaka #8
20180925 GCPUG Osaka #8 20180925 GCPUG Osaka #8
20180925 GCPUG Osaka #8 Yuya Ohara
 
Gradle small tips for android
Gradle small tips for androidGradle small tips for android
Gradle small tips for android史也 久米
 
【RDS】Cloud SQL をまとめてみる
【RDS】Cloud SQL をまとめてみる【RDS】Cloud SQL をまとめてみる
【RDS】Cloud SQL をまとめてみるYuya Ohara
 
2020年10月29日 プロフェッショナルAI×Roboticsエンジニアへのロードマップ
2020年10月29日 プロフェッショナルAI×Roboticsエンジニアへのロードマップ2020年10月29日 プロフェッショナルAI×Roboticsエンジニアへのロードマップ
2020年10月29日 プロフェッショナルAI×RoboticsエンジニアへのロードマップNVIDIA Japan
 
GitHubの使い方(導入編) 2013/10/1版 (PPTX)
GitHubの使い方(導入編)2013/10/1版 (PPTX)GitHubの使い方(導入編)2013/10/1版 (PPTX)
GitHubの使い方(導入編) 2013/10/1版 (PPTX)Akihiko Shirai
 
モバイルVR「Daydream」でVRの世界にふれてみる
モバイルVR「Daydream」でVRの世界にふれてみるモバイルVR「Daydream」でVRの世界にふれてみる
モバイルVR「Daydream」でVRの世界にふれてみるSatoshi Noda
 
Google VRと開発ノウハウ
Google VRと開発ノウハウGoogle VRと開発ノウハウ
Google VRと開発ノウハウSatoshi Noda
 
DaydreamではじめるVR
DaydreamではじめるVRDaydreamではじめるVR
DaydreamではじめるVRSatoshi Noda
 
Cardboard勉強会
Cardboard勉強会Cardboard勉強会
Cardboard勉強会Satoshi Noda
 
Google VR - Google I/O Extended 報告会 2016 in 関西 -
Google VR - Google I/O Extended 報告会 2016 in 関西 -Google VR - Google I/O Extended 報告会 2016 in 関西 -
Google VR - Google I/O Extended 報告会 2016 in 関西 -Satoshi Noda
 
Using automation to make your job easier
Using automation to make your job easierUsing automation to make your job easier
Using automation to make your job easierSupport Driven
 
モバイルVR「Daydream」について
モバイルVR「Daydream」についてモバイルVR「Daydream」について
モバイルVR「Daydream」についてSatoshi Noda
 

La actualidad más candente (18)

20180925 GCPUG Osaka #8
20180925 GCPUG Osaka #8 20180925 GCPUG Osaka #8
20180925 GCPUG Osaka #8
 
ヤフーでの働き方と担当業務について
ヤフーでの働き方と担当業務についてヤフーでの働き方と担当業務について
ヤフーでの働き方と担当業務について
 
Gradle small tips for android
Gradle small tips for androidGradle small tips for android
Gradle small tips for android
 
【RDS】Cloud SQL をまとめてみる
【RDS】Cloud SQL をまとめてみる【RDS】Cloud SQL をまとめてみる
【RDS】Cloud SQL をまとめてみる
 
2020年10月29日 プロフェッショナルAI×Roboticsエンジニアへのロードマップ
2020年10月29日 プロフェッショナルAI×Roboticsエンジニアへのロードマップ2020年10月29日 プロフェッショナルAI×Roboticsエンジニアへのロードマップ
2020年10月29日 プロフェッショナルAI×Roboticsエンジニアへのロードマップ
 
ヤフーにおけるHadoop Operations #tdtech
ヤフーにおけるHadoop Operations #tdtechヤフーにおけるHadoop Operations #tdtech
ヤフーにおけるHadoop Operations #tdtech
 
Bonfire API #1 APIのリトライ処理
Bonfire API #1 APIのリトライ処理Bonfire API #1 APIのリトライ処理
Bonfire API #1 APIのリトライ処理
 
GitHubの使い方(導入編) 2013/10/1版 (PPTX)
GitHubの使い方(導入編)2013/10/1版 (PPTX)GitHubの使い方(導入編)2013/10/1版 (PPTX)
GitHubの使い方(導入編) 2013/10/1版 (PPTX)
 
Algolia
AlgoliaAlgolia
Algolia
 
モバイルVR「Daydream」でVRの世界にふれてみる
モバイルVR「Daydream」でVRの世界にふれてみるモバイルVR「Daydream」でVRの世界にふれてみる
モバイルVR「Daydream」でVRの世界にふれてみる
 
Google VRと開発ノウハウ
Google VRと開発ノウハウGoogle VRと開発ノウハウ
Google VRと開発ノウハウ
 
Trat sprint10
Trat sprint10Trat sprint10
Trat sprint10
 
DaydreamではじめるVR
DaydreamではじめるVRDaydreamではじめるVR
DaydreamではじめるVR
 
Cardboard勉強会
Cardboard勉強会Cardboard勉強会
Cardboard勉強会
 
Google VR - Google I/O Extended 報告会 2016 in 関西 -
Google VR - Google I/O Extended 報告会 2016 in 関西 -Google VR - Google I/O Extended 報告会 2016 in 関西 -
Google VR - Google I/O Extended 報告会 2016 in 関西 -
 
Trat_sprint2
Trat_sprint2Trat_sprint2
Trat_sprint2
 
Using automation to make your job easier
Using automation to make your job easierUsing automation to make your job easier
Using automation to make your job easier
 
モバイルVR「Daydream」について
モバイルVR「Daydream」についてモバイルVR「Daydream」について
モバイルVR「Daydream」について
 

Similar a Presentation 2

Google の AIツール 『Auto ML』で機械学習してみた
Google の AIツール  『Auto ML』で機械学習してみたGoogle の AIツール  『Auto ML』で機械学習してみた
Google の AIツール 『Auto ML』で機械学習してみたYuya Ohara
 
JupyterLabを中心とした快適な分析生活
JupyterLabを中心とした快適な分析生活JupyterLabを中心とした快適な分析生活
JupyterLabを中心とした快適な分析生活Classi.corp
 
【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~
【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~ 【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~
【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~ Yuya Ohara
 
【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみた
【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみた【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみた
【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみたYuya Ohara
 
Sumo Logic活用事例とその運用
Sumo Logic活用事例とその運用Sumo Logic活用事例とその運用
Sumo Logic活用事例とその運用gree_tech
 
TPS/リーンを使って強化するアジャイル/スクラム
TPS/リーンを使って強化するアジャイル/スクラムTPS/リーンを使って強化するアジャイル/スクラム
TPS/リーンを使って強化するアジャイル/スクラムKazutaka Sankai
 
googleアナリティクス研究課題①
googleアナリティクス研究課題①googleアナリティクス研究課題①
googleアナリティクス研究課題①Kent Nabeshima
 
Google I/O 2018 裏報告 ~ぜんぜんためにならない~【ABC2018Sprint ライトニングトーク】
Google I/O 2018 裏報告 ~ぜんぜんためにならない~【ABC2018Sprint ライトニングトーク】Google I/O 2018 裏報告 ~ぜんぜんためにならない~【ABC2018Sprint ライトニングトーク】
Google I/O 2018 裏報告 ~ぜんぜんためにならない~【ABC2018Sprint ライトニングトーク】嶋 是一 (Yoshikazu SHIMA)
 
Startup science 2018 4 ビジネスモデルの型とPlanAの作成
Startup science 2018 4 ビジネスモデルの型とPlanAの作成Startup science 2018 4 ビジネスモデルの型とPlanAの作成
Startup science 2018 4 ビジネスモデルの型とPlanAの作成Masa Tadokoro
 
Automotive agile 自動車業界を取り巻くアジャイル・スクラムの潮流
Automotive agile  自動車業界を取り巻くアジャイル・スクラムの潮流Automotive agile  自動車業界を取り巻くアジャイル・スクラムの潮流
Automotive agile 自動車業界を取り巻くアジャイル・スクラムの潮流Kazutaka Sankai
 
RTミドルウェアサマーキャンプ2018「SysML実習」
RTミドルウェアサマーキャンプ2018「SysML実習」RTミドルウェアサマーキャンプ2018「SysML実習」
RTミドルウェアサマーキャンプ2018「SysML実習」openrtm
 
[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料
[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料
[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料Ridge-i
 
小規模チームで Type script と向き合う話
小規模チームで Type script と向き合う話小規模チームで Type script と向き合う話
小規模チームで Type script と向き合う話Tatsuya Yamamoto
 
” AWS ” だけじゃない! ” GCP ” の オートスケール機能
” AWS ” だけじゃない! ” GCP ” の オートスケール機能” AWS ” だけじゃない! ” GCP ” の オートスケール機能
” AWS ” だけじゃない! ” GCP ” の オートスケール機能Yuya Ohara
 
20170719 GCPUG OSAKA #3
20170719 GCPUG OSAKA #320170719 GCPUG OSAKA #3
20170719 GCPUG OSAKA #3Yuya Ohara
 
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)Kazuya Sugimoto
 
Icml2018読み会_overview&GANs
Icml2018読み会_overview&GANsIcml2018読み会_overview&GANs
Icml2018読み会_overview&GANsKentaro Tachibana
 

Similar a Presentation 2 (20)

Google の AIツール 『Auto ML』で機械学習してみた
Google の AIツール  『Auto ML』で機械学習してみたGoogle の AIツール  『Auto ML』で機械学習してみた
Google の AIツール 『Auto ML』で機械学習してみた
 
JupyterLabを中心とした快適な分析生活
JupyterLabを中心とした快適な分析生活JupyterLabを中心とした快適な分析生活
JupyterLabを中心とした快適な分析生活
 
【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~
【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~ 【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~
【奈良】GCPUG NARA × Osaka #1 ~ GCPがなぜ注目されているか?~
 
GMOSSPの開発現場!
GMOSSPの開発現場!GMOSSPの開発現場!
GMOSSPの開発現場!
 
【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみた
【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみた【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみた
【GCP】DDoS対策 Cloud Armor(クラウドアーマー)を試してみた
 
Sumo Logic活用事例とその運用
Sumo Logic活用事例とその運用Sumo Logic活用事例とその運用
Sumo Logic活用事例とその運用
 
TPS/リーンを使って強化するアジャイル/スクラム
TPS/リーンを使って強化するアジャイル/スクラムTPS/リーンを使って強化するアジャイル/スクラム
TPS/リーンを使って強化するアジャイル/スクラム
 
googleアナリティクス研究課題①
googleアナリティクス研究課題①googleアナリティクス研究課題①
googleアナリティクス研究課題①
 
Exploratory seminar20191115
Exploratory seminar20191115Exploratory seminar20191115
Exploratory seminar20191115
 
Google I/O 2018 裏報告 ~ぜんぜんためにならない~【ABC2018Sprint ライトニングトーク】
Google I/O 2018 裏報告 ~ぜんぜんためにならない~【ABC2018Sprint ライトニングトーク】Google I/O 2018 裏報告 ~ぜんぜんためにならない~【ABC2018Sprint ライトニングトーク】
Google I/O 2018 裏報告 ~ぜんぜんためにならない~【ABC2018Sprint ライトニングトーク】
 
Startup science 2018 4 ビジネスモデルの型とPlanAの作成
Startup science 2018 4 ビジネスモデルの型とPlanAの作成Startup science 2018 4 ビジネスモデルの型とPlanAの作成
Startup science 2018 4 ビジネスモデルの型とPlanAの作成
 
Automotive agile 自動車業界を取り巻くアジャイル・スクラムの潮流
Automotive agile  自動車業界を取り巻くアジャイル・スクラムの潮流Automotive agile  自動車業界を取り巻くアジャイル・スクラムの潮流
Automotive agile 自動車業界を取り巻くアジャイル・スクラムの潮流
 
BLEビーコン活用例
BLEビーコン活用例BLEビーコン活用例
BLEビーコン活用例
 
RTミドルウェアサマーキャンプ2018「SysML実習」
RTミドルウェアサマーキャンプ2018「SysML実習」RTミドルウェアサマーキャンプ2018「SysML実習」
RTミドルウェアサマーキャンプ2018「SysML実習」
 
[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料
[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料
[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料
 
小規模チームで Type script と向き合う話
小規模チームで Type script と向き合う話小規模チームで Type script と向き合う話
小規模チームで Type script と向き合う話
 
” AWS ” だけじゃない! ” GCP ” の オートスケール機能
” AWS ” だけじゃない! ” GCP ” の オートスケール機能” AWS ” だけじゃない! ” GCP ” の オートスケール機能
” AWS ” だけじゃない! ” GCP ” の オートスケール機能
 
20170719 GCPUG OSAKA #3
20170719 GCPUG OSAKA #320170719 GCPUG OSAKA #3
20170719 GCPUG OSAKA #3
 
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)
 
Icml2018読み会_overview&GANs
Icml2018読み会_overview&GANsIcml2018読み会_overview&GANs
Icml2018読み会_overview&GANs
 

Presentation 2

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