@littlekid
2016-05-20T01:54:50.000000Z
字数 5130
阅读 3567
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 |
两个数据格式都包含了双11之前6个月的用户行为日志,label表示用户是否在双11之后的6个月内重复购买,在格式2的数据中,label有-1的,表示当前用户不是当前商家的双11新用户。可见,格式一的数据是user-friendly(官方说法)的,易于做特征工程。然而,格式一中是没有label为-1的(u,m)对的,因此相比格式二会少一些信息。
我们现在将那些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 |
然后再看看双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的话,我们只需要提供提取特征的代码,并打包提交即可。
这个平台让人蛋疼的几点:
我们第一阶段的融合框架:
其实很简单,就是特征池中选择特征模型stacking learning[10]。
我们直接把MFM的结果作为一个High-level的特征加入到特征池中。提升了0.0018,0.7009360.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。