IJCAI-15 商家促销后的重复买家预测比赛纪实

IJCAI-15 商家促销后的重复买家预测比赛纪实

标签: ML比赛 IJCAI


比赛介绍

两年一届的人工智能顶会IJCAI与阿里合办的机器学习比赛。由Alibaba inc.提供比赛数据。和去年以及今年的天池大数据竞赛赛题相似但又不同。

我们知道,国内外的电商有各种各样促(pian)销(qian)活动,像国外的黑五(Black Friday),国内的双十一等等。大量商家通过打折促销吸引顾客。而我们,aka. 剁手党,也在这一天伺机而动。其中,有许多顾客是被商家的促销所吸引的新顾客,那么他们会不会在促销之后继续在这家店买东西呢?本次比赛题目就是预测这些会重复购买的顾客。

比赛分为两个阶段(阿里比赛的一贯套路),第一阶段数据量相对较小,参赛者可以本地建模,提交最终的结果即可,最终TOP50的选手or队伍可以进入第二阶段。第二阶段则需要把代码提交到阿里的云平台上运行(当然是官方提供的接口)。

比赛的评测标准是ROC曲线下面积(AUC[1])。典型的二分类分类器评估标准。

我们队伍LinkinPark在Stage1 rank9,Stage2 rank4. 第二阶段最后几天被挤出前三。。(囧)。

数据分析与预处理

数据格式 文件名 字段
data format 2 train_format2.csv user id,age range,gender
merchant_id,label,activity log test
test_format2.csv user_id,age_range,gender
merchant_id,label,activity log test
data format 1 user_log_format1.csv user_id,item_id,cat_id,seller_id
brand_id,time_stamp,action_type
user_info_format1.csv user_id,age_range,gender
train_format1.csv user_id,merchant_id,label
test_format1.csv user_id,merchant_id,label

先来看看第一阶段提供下载的数据。官方提供了两种数据格式(见下表)

数据格式 文件名 字段
data format 2 train_format2.csv user id,age range,gender
merchant_id,label,activity log test
test_format2.csv user_id,age_range,gender
merchant_id,label,activity log test
data format 1 user_log_format1.csv user_id,item_id,cat_id,seller_id
brand_id,time_stamp,action_type
user_info_format1.csv user_id,age_range,gender
train_format1.csv user_id,merchant_id,label
test_format1.csv user_id,merchant_id,label

两个数据格式都包含了双11之前6个月的用户行为日志,label表示用户是否在双11之后的6个月内重复购买,在格式2的数据中,label有-1的,表示当前用户不是当前商家的双11新用户。可见,格式一的数据是user-friendly(官方说法)的,易于做特征工程。然而,格式一中是没有label为-1的(u,m)对的,因此相比格式二会少一些信息。

Data format #Pairs #User #Merchant #Item #Cat #Brand
data format 1 4215979 126474 4995 800322 1542 7936
data format 3 14052684 424170 4995 1090071 1658 8444

我们现在将那些label为-1的数据记为Data format3,来看看format1和3的数据统计信息(下表)。

Data format #Pairs #User #Merchant #Item #Cat #Brand
data format 1 4215979 126474 4995 800322 1542 7936
data format 3 14052684 424170 4995 1090071 1658 8444
---- #Click #Cart #Favour #Buy Total
All-Period 48550712 67728 3277708 3005723 54901871
11-11 9188150 12621 1220285 156450 10577506
Daily Average Before 11-11 224928 299 11181 15485 240594

然后再看看双11和非双11用户各种行为统计。

---- #Click #Cart #Favour #Buy Total
All-Period 48550712 67728 3277708 3005723 54901871
11-11 9188150 12621 1220285 156450 10577506
Daily Average Before 11-11 224928 299 11181 15485 240594

双11的行为数数十数百倍于平时。。。

特征工程

对于一般的分类算法,特征空间的选择是非常重要的,即使你的算法再牛逼,没有好的搜索空间的支持,也然并卵。因此特征工程在DM/ML比赛是大厦的基石,它决定了你的楼能盖多高。

特征体系

统一介绍一下两个阶段用到的特征,第二阶段的特征几乎涵盖了第一阶段的。

  1. Baseline特征
    官方提供的一套为LR设计的特征体系。首先,获得每个商家的最相似的5个商家,计算方法是统计商家之间的共同用户。这些商家的id离散化作为特征(4995维稀疏特征)。然后,取当前用户对当前商家的行为特征。
  2. 信息描述类特征
    这是我们特征的主力军,时间都花在这上面了。这部分特征几乎都是具有物理意义的特征,总体可以分为三种:user,merchant,(u,m)对特征。由具体的物理意义再分为三类:
    • 计数类:行为计数、行为天计数、行为对象计数等;
    • 比值类:平均每天行为、回购率、每月行为占比等;
    • 生命周期类:用户首次/最后行为日、生存周期。
  3. 离散特征
    为什么要设计这套特征?为了使ID类完全个性化,用在LR上效果特别好(线性模型,L1正则,可实现效果好)。
    离散的方法,是将类别|ID可取的值展开成多维稀疏向量,只有对应的部分标1,其余为0.我们离散的特征为:
    • 用户的年龄和性别;
    • 当前用户在当前商家购买的商品ID、商品类别ID、品牌ID;
    • 当前用户在当前商家重复购买的品牌ID。

特征处理

LR是一个傲娇的模型,喂的特征量纲不统一他是不会吃的- -。因此我们需要统一量纲。我们使用了log转化,即对会产生问题的特征进行了log(x)的转换。为什么不用z-score/minmax归一化方法?纯粹是因为第二阶段提供的特征提取框架很难实现。

工具和平台

第一阶段

scikit-learn[2]+xgboost[3],我是python党;)
xgboost是个好工具!感谢陈天奇大神带来这么牛x的GBM实现。

第二阶段

第二阶段官方提供了一个平台“方便”参赛者提取特征和跑模型。基础平台:阿里ODPS,特征提取:Graph(管理员说的,我估计是graphlab那个框架),lr,gbrt实现:Xlib。
如果我们只用Xlib的LR和GBRT的话,我们只需要提供提取特征的代码,并打包提交即可。
这个平台让人蛋疼的几点:

  • 首先是特征提取。集群使用十台worker虚拟机,每个worker上有10个vertex,用户的日志(format2)被分别分在这些vertex上,特征提取程序分别在这些vertex上运行,达到并行的效果。这里,可以编程使每个用户的log都分配在同一个vertex上,但是每个商家就不一定了,因此如果我们在这个框架下提取商家的特征,会导致这些特征不是全局的问题- -。我们只能使用stage1的数据提取特征在作为辅助文件上传。。。
  • 其次是模型融合。官方的框架无法实现线上LR和GBDT哪怕是简单stacking learning的融合。这使得我们只能以单个模型比赛(虽然大家都一样。。)。

模型

  • LR:Logistic Regression[4],简单实用,线性模型,训练快速。可用L1/L2正则化,SGD。在面对stage2 100W+维特征时候表现很好。
  • RF:Random Forest[^rf],各种随机,多棵树融合。stage1作为辅助模型融合。
  • GBRT:Gradient Boost Regression Tree[5],梯度提升框架,不用特征归一,泛化强,效果赞。再次膜拜其实现Xgboost[3]
  • MFM:Multi-Instance Factorization Machines,这个模型是我们队一个大牛设计的,结合了Factorization Machines[6]和Multi-Intance[7]框架。
    MFM不需要做特征工程!我们需要做的就是将每个用户的log打包,对于一个(u,m)对,一个log加上一个flag(这个log是否与m相关联)对应一个instance,一个用户的所有instance为一个bag。所以最终用户是否是商家的重复买家取决于用户所有的log是否发生在当前商家。
    FM被用来预测一个instance对一个重复买家的positive贡献,由等式1定义,其中$M(x)$由等式2定义。
    $$
    Pr(y(x)=1;w,{v}) = \frac{1}{1+e^{-M(x)}}
    $$
    $$
    M(x)=w_0+\sum_{i-1}Dw_ix_i+\sum_{i=1}{D}\sum_{j=i+1}^{D}<v_i,v_j>x_ix_j
    $$
    我们要求得目标函数是:
    $$
    argmax_{w,{v}}\prod Pr(y(B^+)=1)\prod Pr(y(B^-)=-1)
    $$
    使用SGD学习$w,{v}$,再用L-BFGS调节L2正则化后的所有权重。

模型融合

我们第一阶段的融合框架:


Ensemble框架
Model GBRT GBRT GBRT RF Final Model
Feature Set Size 383(all) 276 254 383(all) mix
AUC 0.702711 0.702645 0.702585 0.701084 0.70319

其实很简单,就是特征池中选择特征$\rightarrow$模型$\rightarrow$stacking learning[8]
我们直接把MFM的结果作为一个High-level的特征加入到特征池中。提升了0.0018,0.700936$\rightarrow$0.702711.
各模型结果:

Model GBRT GBRT GBRT RF Final Model
Feature Set Size 383(all) 276 254 383(all) mix
AUC 0.702711 0.702645 0.702585 0.701084 0.70319

结果

第一阶段我们队伍获得了第9。
第二阶段我们队伍获得了第4。

总结

历程

写一下我参加这次比赛的历程,由于今年阿里的移动推荐比赛,第一阶段就被淘汰了(T.T)才转战这个比赛的。看完赛题就着手做了起来,每天想一些新的特征,再xgb调调参数,分数一直稳步再涨,一度到了LB6。然后有几天分数就卡主上不去了,当时想着是不是应该招人组个队,分享一下思路。于是去比赛论坛上发了个贴子,当天晚上和之后的那个队长聊到了2点多钟。。。他是有老师支持的(真好),虽然当时他们名次没有我高,我还是同意让他当了队长(毕竟人家带着一帮人。。),第二天我们队又来了个大牛,就是做MFM那个,他是自己造的轮子,分数有0.689.于是我们队就在最后五天组成了。然后我们就在最后五天进行了特征融合,他们那边把特征输出给我,我来组合,跑模型,跑完的结果在给他做ensemble。

经验&教训

  • 组队真的有必要。个人精力非常有限,组队不仅可以提供新的思路,还能使任务并行。
  • 这种比赛拼的到底是什么。我觉得1.特征工程,对数据的理解,不停地尝试都是特征工程需要做的。2.融合,之后参加了几次kaggle比赛知道了融合强大,简单的stacking learning就能获得不少的提升。
  • 一个教训是我们在组队之初犯了许多错误,没有一个比较规范的融合模式,导致比较混乱。

Reference


  1. Andrew P. Bradley. The use of the area under the roc curve in the evaluation of machine learning algorithms. Pattern Recognition, pages 1145–1159, 1997.

  2. http://scikit-learn.org/stable/

  3. https://github.com/dmlc/xgboost

  4. Olivier Chapelle, Eren Manavoglu, and R´omer Rosales. Simple and scalable response prediction for display advertising. ACM Transactions on Intelligent Systems and Technology, 5(4):61:1–61:34, 2014.

  5. Jerome H. Friedman. Greedy function approximation: A gradient boosting machine. Annals of Statistics, 29:1189–1232, 1999.

  6. Steffen Rendle. Factorization machines. In IEEE International Conference on Data Mining series (ICDM), pages 995–1000, 2010.

  7. Oded Maron and Tom´as Lozano-P´erez. A framework for multiple-instance learning. In Advances in Neural Information Processing Systems 10, pages 570–576, 1997.

  8. https://en.wikipedia.org/wiki/Ensemble_learning

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容