Kaggle: Coupon Purchase Predictionに参加しました
初投稿です.よろしくお願いします.
KaggleのCoupon Purchase Predictionに参加したので,備忘録を兼ねて,その振り返りをしたいと思います.
自分は今回がKaggle初参加だったのですが,日本企業が主催している(Kaggle初)ということで,内容が把握しやすく,日本人が参加しやすいコンテストだったのかなと思います.
問題把握
今回のコンテストは,22,873人のユーザーの51週間分の購入履歴と閲覧履歴が与えられ,52週目に誰がどのクーポンを購入するかを予測し,購入する確率が高いものから10個選んで,以下のようなcsv形式で提出するというものでした.
USER_ID_hash,PURCHASED_COUPONS ユーザーID, クーポン1 クーポン2 クーポン3 ユーザーID, クーポン4 クーポン1 クーポン3 クーポン5 ユーザーID, クーポン3 クーポン2 クーポン6 etc...
Forum, Scriptsを読む
Kaggleの特徴としてForum上で問題について議論されていたり,ときには使用したスクリプトが,Scripts上で公開されていたりします. 実際,今回のコンテストでもPublic Leaderboard上で,Score: 0.007600(=400/1000位相当)のスクリプトが公開されていました.
自分は,このスクリプトを理解することからはじめて,これを改良するという形で進めていきました.
実装
Scriptsを参考にレコメンデーションベースのモデルを作成しました.
参考にしたスクリプトでは,コンテンツベースのレコメンデーションに基づき,
- ユーザーの購入履歴 + 閲覧履歴に基づいたユーザープロフィール(=ユーザー数 x 特徴量数の行列)
- test用クーポンの特徴量(=クーポン数 x 特徴量数の行列)
の重み付きコサイン類似度(ユーザー数 x クーポン数の行列)を計算し,類似度の高い上位10クーポンを選んでいました.
このスクリプトを参考に以下の点を改良しました.
改良点
主な改善点は,以下の3つです.
- test用クーポンにユーザー属性(性別と年齢)の付加
- TF-IDF値の計算
- Cross Validation
1. test用クーポンにユーザー属性(性別と年齢)の付加
上記のスクリプトのtest用クーポンの特徴量には,ユーザーの属性(性別と年齢層)が含まれていなかったため,まず,どんな性別や年齢層ののユーザーがtest用クーポンを購入するかをアイテムベースのレコメンデーションに基づき予測しました.
具体的には,train用クーポンとtest用クーポンの重み付きコサイン類似度を求め,test用クーポンと類似度の高いtrain用クーポン上位100を購入したユーザーの属性(性別と年齢層)の平均をtest用クーポンの特徴量に追加しました.
2. TF-IDF値の計算
各特徴量のカテゴリ['SEX_ID', 'AGE_GROUP', 'GENRE_NAME', 'large_area_name', 'small_area_name']ごとにTF-IDF値を求め正規化してからコンテンツベースのレコメンデーションを行いました.
3. Cross Validation
コサイン類似度の重みは以下のサイトを参考にCross Validationを用いて決定しました.
今回のコンペティションではMAP@10という評価関数を使ってスコアを算出していたので,Forumを参考にgithubに載っている計算式をそのままコピペして使用しました.(pipを使ってml_metricsをinstallすると正しく計算されなかったので,コピペしました.)
上位の人がやっていたこと
- 負例の考慮(購入時,同時期に掲載されていたにもかかわらず購入に至らなかったクーポン)
- xgboost?(kaggleで流行っている手法らしい)
最終結果
最終結果は62/1089位でした.
Kaggleには今回が初参加…というより,機械学習自体一ヶ月前にデータサイエンティスト養成読本を買って始めたので,まあよく出来たほうではないでしょうか.
得られたもの
- pythonでのデータ処理(numpy, pandas)に関する知識
- レコメンデーションシステムについての初歩的な理解
- コサイン類似度(Cosine Similarity)
- Cross Validation
- TF-IDF
まとめ
- Kaggle上で公開されているForumやScriptsを読むだけでもかなり勉強になる
- Forum, Scriptsを読むには,それなりに英語力が必要
- ただし,それ以上に機械学習についての知識が必要
かなり雑なまとめになりましたが,これからも勉強を続けていきたいと思います.