Slide 1

Slide 1 text

atmaCup#9
 1st Place Solution
 pao


Slide 2

Slide 2 text

自己紹介
 ● pao
 ● データサイエンティスト@ABEJA
 ● Kaggle Master
 ● 息子がかわいい
 pao (@pppaaaooo)

Slide 3

Slide 3 text

atmaCup歴
 今回のコンペ


Slide 4

Slide 4 text

今回のatmaCup
 Public LB 4th
 Private LB 1st


Slide 5

Slide 5 text

今日の話
 解法そのものよりも、
 そこにいった経緯や戦略について
 お話します
 解法が地味なので


Slide 6

Slide 6 text

今回のタスク概要
 ● データ:ショッピングカートにいつ・何を入れたかの買い物ログ
 ● ある時間(time_elapsed)以降に、特定のカテゴリ15種類の商品を購入す るかどうかを予測
 ○ time_elapsedは0, 3, 5, 10minからランダムに決定
 ● Train/Testは購買日時で分割(Testが未来)
 ● 評価指標:MacroAverage ROC-AUC


Slide 7

Slide 7 text

前提
 ● 今回のデータ・タスクはatmaCup#4に似ている
 ● #4は優勝していたこともあり、それなりに知見は持ってい た


Slide 8

Slide 8 text

コンペ開始
 1/30(金) 18:00
 コンペ終了
 2/6(土) 18:00
 初日


Slide 9

Slide 9 text

● タスクの把握
 ○ atmaCup#4との差を確認
 ● EDA(寝る前にこれだけ!!)
 ○ TrainとTestのユーザー重複率の確認
 コンペ開始
 1/30(金) 18:00
 コンペ終了
 2/6(土) 18:00
 初日
 ・過去の購買履歴が大事なため、Testユーザの予測にTrainの購買履歴がどれだけ使えるかだ け把握しておきたかった
 ・これによって戦略が大きく変わる可能性がある & 次の日に戦略を練りたかった 


Slide 10

Slide 10 text

● タスクの把握
 ○ atmaCup#4との差を確認
 ● EDA(寝る前にこれだけ!!)
 ○ TrainとTestのユーザー重複率の確認
 コンペ開始
 1/30(金) 18:00
 コンペ終了
 2/6(土) 18:00
 初日
 ・過去の購買履歴が大事なため、Testユーザの予測にTrainの購買履歴がどれだけ使えるかだ け把握しておきたかった
 ・これによって戦略が大きく変わる可能性がある & 次の日に戦略を練りたかった 
 結果:約9割が重複
 →過去の購買履歴
  めちゃ使えそう


Slide 11

Slide 11 text

● 作業時間はほぼ取れなかったので戦略だけ考えた
 ● 主に以下の2つ
 ○ データの全体像と優先度
 ○ モデルの作り方
 コンペ開始
 1/30(金) 18:00
 コンペ終了
 2/6(土) 18:00
 2〜3日目(土日)


Slide 12

Slide 12 text

データの全体像
 Session ユーザ1
 ユーザ2
 ユーザ3
 ・・・・・
 時間
 Train期間
 Test期間
 Session Session Session Session Session Session Session Session Session Session Session Session Session Session Session Session time_elapsed(0, 3, 5, 10) 
 ↓
 特徴量に 使える Target 情報 time_elapsed(0,3,5,10からランダム) 
 ↓
 特徴量に 使える 存在し ない 一部のsessionが
 存在しない
 ここを予 測

Slide 13

Slide 13 text

Session データの全体像
 Session ユーザ1
 ユーザ2
 ユーザ3
 ・・・・・
 時間
 Train期間
 Test期間
 Session Session Session Session Session Session Session Session Session Session Session Session Session Session time_elapsed
 ↓
 特徴量に 使える 存在し ない ①どんなユーザーか? 
 ②どんな日・時間帯か? 
 ③どんな買い物なのか? 
 Session

Slide 14

Slide 14 text

Session データの全体像
 Session ユーザ1
 ユーザ2
 ユーザ3
 ・・・・・
 時間
 Train期間
 Test期間
 Session Session Session Session Session Session Session Session Session Session Session Session Session Session time_elapsed
 ↓
 特徴量に 使える 存在し ない ①どんなユーザーか? 
 ②どんな日・時間帯か? 
 ③どんな買い物なのか? 
 ①どんなユーザーか?
 →最重要。
 
 ②どんな日・時間帯か?
 →そこそこ重要そう。
 
 ③どんな買い物なのか?
 →今回のデータの新規ポイントの一つ 
  ここで勝敗を分ける可能性も大いにある 
 
 データの優先度:① >> ③ >> ②
 Session

Slide 15

Slide 15 text

モデルの作り方
 ぱっと思いつく方針は2つ
 ①セッション毎に4パターンのデータを作成して1つのデータセットとする
 ②time_elapsed別のモデルを作る
 大事な情報:Testはtime_elapsedが0, 3, 5, 10からランダムに決まる
 Target
 (ここで買ったか?)
 time_elapsed=0
 特徴量に
 使える
 Target
 time_elapsed=3
 特徴量に
 使える
 Target
 time_elapsed=5
 特徴量に
 使える
 Target
 time_elapsed=10 
 time_elapsedによる1つの買い物セッションの違い 


Slide 16

Slide 16 text

モデルの作り方
 ①セッション毎に4パターンのデータを作成して1つのデータセットとする
 ②time_elapsed別のモデルを作る
 ①のほうが以下の点では良い
 ・モデル数が少なく済む
 ・AUCの評価データ内を1つのモデルで予測できる
 ただ、time_elapsed毎に問題自体が全然違う気がする


Slide 17

Slide 17 text

モデルの作り方
 Target
 (ここで買ったか?)
 time_elapsed=0
 特徴量に
 使える
 Target
 time_elapsed=5
 vs
 time_elapsedによって特徴量だけでなく、Target自体の質も変わってしまう
 
 例:
 time_elapsed=0: ポテトチップスを買い物中のどこかで買うかどうか
 time_elapsed=5: ポテトチップスを買い物から5分後以降に買うかどうか 特徴量もTargetの質も変わってしまう条件を
 同じ一つのモデルとして表現するのは厳しそう
 (特に木の場合、time_elapsedで分岐させるより、別々の木として学習したほうが自然そう)
 →別々のモデルに


Slide 18

Slide 18 text

● ベースラインのLightGBMモデル作成
 ○ Category毎 x time_elapsed毎 (60models)
 ○ 特徴量
 ■ ユーザーの過去のTarget購入率 (15個)
 ■ time_elapsedまでのTargetの購入有無 (15個)
 ● time_elapsed=0を除く
 →Public: 0.7678 この方針で良さそう
 コンペ開始
 1/30(金) 18:00
 コンペ終了
 2/6(土) 18:00
 3〜4日目(日曜夜〜月曜朝)


Slide 19

Slide 19 text

● あまり時間取れず、少しずつ特徴量追加しながら試す
 ○ 「①どんなユーザーか?」「③どんな買い物なのか?」の基 本的なところを中心に追加
 ○ 学習時間が長い&あまり時間取れず1日2~3回程度
 ○ Public: 0.7678 => 0.7832
 ● 空き時間に次の作戦を考える
 コンペ開始
 1/30(金) 18:00
 コンペ終了
 2/6(土) 18:00
 4〜5日目(月〜火)


Slide 20

Slide 20 text

中盤の作戦
 ①どんなユーザーか?
 ②どんな日・時間帯か?
 ③どんな買い物なのか?
 データの優先度:① >> ③ >> ②
 ③について
 ● 「どんなカテゴリの商品を買っているか?」といった基本的な特徴量は 追加していた
 ● ただし時系列や具体的な商品が重要だった場合取り返しがつかない 可能性があるので、そこについての実験をやる方針


Slide 21

Slide 21 text

● ③の対策として以下の実装
 ○ Transformer
 ■ 当日の買い物カートの時系列に対して
 ○ Meta Feature
 ■ 当日の買い物一つずつに対しての学習・予測結果を特徴量 に使う
 ■ atmaCup#4の2nd Place Solutionを参考
 ● 並行して、これまでのモデルの実験も少しずつ実施
 コンペ開始
 1/30(金) 18:00
 コンペ終了
 2/6(土) 18:00
 6〜8日目(水〜金)


Slide 22

Slide 22 text

● Transformer、MetaFeature共にいい結果が出ず
 ● 大事な終盤であまり進捗なし....
 コンペ開始
 1/30(金) 18:00
 コンペ終了
 2/6(土) 18:00
 6〜8日目(水〜金)


Slide 23

Slide 23 text

● Transformer、MetaFeature共にいい結果が出ず
 ● 大事な終盤であまり進捗なし....
 コンペ開始
 1/30(金) 18:00
 コンペ終了
 2/6(土) 18:00
 ただし!
 これらが上手く行かなかったことで
 「②どんな買い物なのか?」があまり重要でない 可能性が高くなった
 →最終日は他の部分に注力する方針
 6〜8日目(水〜金)


Slide 24

Slide 24 text

● 妻の協力のもと、1日フルで時間を使えるように
 ● 以下を複数サーバで並列に実施
 ○ 特徴量追加
 ○ ハイパーパラメータ調整
 ○ TestOnlyユーザ用モデルの作成
 ○ アンサンブル・後処理
 コンペ開始
 1/30(金) 18:00
 コンペ終了
 2/6(土) 18:00
 金曜日夜〜コンペ終了


Slide 25

Slide 25 text

● 最終日主に伸びたところ
 ○ ハイパーパラメータ調整
 ■ 浅めの木(max_depth小さめ)を使っていたが、深めにしたら大 きくアップ
 ○ 「①どんなユーザか?」についての特徴量追加
 コンペ開始
 1/30(金) 18:00
 コンペ終了
 2/6(土) 18:00
 金曜日夜〜コンペ終了


Slide 26

Slide 26 text

一人のユーザーの購入履歴
 1回の 買い物 ログ セッション内 の時間
 買い物日時
 Train期間
 Test期間
 〜
 ✂ ✂ (データ上 存在しな い) ✂ time_elapsed=3
 time_elapsed=5
 time_elapsed=10
 Session1
 Session2
 Session3
 Session4
 Session5
 Session6


Slide 27

Slide 27 text

一人のユーザーの購入履歴
 1回の 買い物 ログ セッション内 の時間
 買い物日時
 Train期間
 Test期間
 〜
 ✂ ✂ ✂ time_elapsed=3
 time_elapsed=5
 time_elapsed=10
 time_elapsed
 このデータの特徴量を作 りたい
 Target
 5


Slide 28

Slide 28 text

一人のユーザーの購入履歴
 1回の 買い物 ログ セッション内 の時間
 買い物日時
 Train期間
 Test期間
 〜
 ✂ ✂ ✂ time_elapsed=3
 time_elapsed=5
 time_elapsed=10
 このデータの特徴量を作 りたい
 Target
 5
 過去のTargetカテゴリ購入率① 買い物開始して5分以降のTarget(time_elapsed=5) →購入有無が実際のTargetと同じ条件

Slide 29

Slide 29 text

一人のユーザーの購入履歴
 1回の 買い物 ログ セッション内 の時間
 買い物日時
 Train期間
 Test期間
 〜
 ✂ ✂ ✂ time_elapsed=3
 time_elapsed=5
 time_elapsed=10
 このデータの特徴量を作 りたい
 5
 過去のTargetカテゴリ購入率① 買い物開始して5min以降のTarget(time_elapsed=5) Test期間は、Train期間全体で計算

Slide 30

Slide 30 text

一人のユーザーの購入履歴
 1回の 買い物 ログ セッション内 の時間
 買い物日時
 Train期間
 Test期間
 〜
 ✂ ✂ ✂ time_elapsed=3
 time_elapsed=5
 time_elapsed=10
 このデータの特徴量を作 りたい
 Target
 5
 過去のTargetカテゴリ購入率② 買い物全体のTarget(time_elapsed=5) →実際のTargetと条件は違うが、より多くのデータが使える&ユーザの特性は分かる

Slide 31

Slide 31 text

一人のユーザーの購入履歴
 1回の 買い物 ログ セッション内 の時間
 買い物日時
 Train期間
 Test期間
 〜
 ✂ ✂ ✂ time_elapsed=3
 time_elapsed=5
 time_elapsed=10
 このデータの特徴量を作 りたい
 5
 過去のTargetカテゴリ購入率② 買い物全体のTarget(time_elapsed=5) →Test期間は、Train期間全体で計算

Slide 32

Slide 32 text

「①どんなユーザか?」についての特徴量
 ● 過去のTargetカテゴリ購入率①②は序盤で作成済み
 ○ 加えてTarget以外のカテゴリについても特徴量化済み
 ● at 最終日: 「他にも使えないか?」
 ○ データ見ながらもう少し考える


Slide 33

Slide 33 text

一人のユーザーの購入履歴
 1回の 買い物 ログ セッション内 の時間
 買い物日時
 Train期間
 Test期間
 〜
 ✂ ✂ ✂ time_elapsed=3
 time_elapsed=5
 time_elapsed=10
 このデータの特徴量を作 りたい
 5
 ここの情報は 特徴量として利用済み

Slide 34

Slide 34 text

一人のユーザーの購入履歴
 1回の 買い物 ログ セッション内 の時間
 買い物日時
 Train期間
 Test期間
 〜
 ✂ ✂ ✂ time_elapsed=3
 time_elapsed=5
 time_elapsed=10
 このデータの特徴量を作 りたい
 5
 ここの情報は 特徴量として利用済み ここ(Test期間のtime_elapsed以内)の 購買情報が使えていない!! →Train期間にあまり買い物がない ユーザにも有効

Slide 35

Slide 35 text

一人のユーザーの購入履歴
 1回の 買い物 ログ セッション内 の時間
 買い物日時
 Train期間
 Test期間
 〜
 ✂ ✂ ✂ time_elapsed=3
 time_elapsed=5
 time_elapsed=10
 このデータの特徴量を作 りたい
 5
 ここの情報は 特徴量として利用済み Targetに該当するデータでもないため未 来の情報だけどLeakの影響も少なそう

Slide 36

Slide 36 text

一人のユーザーの購入履歴
 1回の 買い物 ログ セッション内 の時間
 買い物日時
 Train期間
 Test期間
 〜
 ✂ ✂ ✂ time_elapsed=3
 time_elapsed=5
 time_elapsed=10
 このデータの特徴量を作 りたい
 Target
 5
 過去のTargetカテゴリ購入率③ time_elapsed以内の全期間のTargetカテゴリ購入率 →Test期間も含めて特徴量化可能。  Trainにあまりデータのないユーザについても傾向をつかめる →最終日に追加。
 この特徴+ハイパラチューニングで
 Public5〜6位相当までUp!!


Slide 37

Slide 37 text

その他最後の追い上げでやったこと
 ● 条件変えたモデルとのWeightAverage
 ○ GroupKFold => MultiLabel-StratifiedKFold
 ○ ハイパーパラメータ変更、使う特徴量少し変更
 ● Testのみユーザ用のモデル作成
 ○ 多くの重要な特徴量がTest期間にしか存在しないユーザには使えな い
 ○ そういったユーザ向けのモデルを作成して、予測値を置き換え


Slide 38

Slide 38 text

その他最後の追い上げでやったこと
 ● 条件変えたモデルとのWeightAverage
 ○ GroupKFold => MultiLabel-StratifiedKFold
 ○ ハイパーパラメータ変更、使う特徴量少し変更
 ● Testのみユーザ用のモデル作成
 ○ 多くの重要な特徴量がTest期間にしか存在しないユーザには使えな い
 ○ そういったユーザ向けのモデルを作成して、予測値を置き換え
 →Publicは4位で終了 → ShakeUpで1位


Slide 39

Slide 39 text

振り返り
 ● 良かったこと
 ○ 実験のロス(MetaFeature, Transformer)はあったものの、仮説ベース で戦略を立てることで、限られた時間の中で効率的に良いモデルを作 れた
 ● 改善すべきとこ
 ○ time_elapsed毎モデルは時間がかかりすぎた。中盤の実験は簡易 Validation用モデルを作るなどして高速化すべきだった


Slide 40

Slide 40 text

その他
 ● 上位の解法が全然違うことから、期間が長いとまだスコアが伸 びうるコンペだった(そして勝てなかったかも)
 ○ 2位:MLP + LSTM / LightGBM
 ○ 3位:Transformer


Slide 41

Slide 41 text

ありがとうございました!
 また別のコンペで戦いましょう!!