特别提醒:以下的工作都是建模学习,而不是严格的比赛对比。
一个机器学习小菜鸡,如何通过最新的机器学习技术,在一个大神聚集的 Kaggle 比赛中做出前 15 的成绩?
Part 1
大家好,我叫小王,第四范式的运营,机器学习的小菜鸡。
今天老板给了我一个任务,公司花了几千万研发出先知机器学习平台,7 月就对外开放了,拿出去用用吧!
怎么用呢?旁边的同事小澄是数据科学家,他每天都有很多业务做,据说国内好多知名的互联网公司,背后的个性化推荐系统都出自他的手笔。只是平时小澄比较低调,大家都不知道。
但作为一个运营,我是既没有数据,也没有场景,我该怎么办?
对了,去 Kaggle 吧!
Kaggle 是一个数据科学家的社区,里面有非常多的比赛案例,尤其是很多经典比赛,那是大神云集,其中也产出了很多对工业界有深远影响的算法和工程实现方式。
抱着花了几千万研发出来的宝贝,选个最经典的比赛吧,就 Criteo Labs 举办的 Display Advertising Challenge 好了。
这个比赛是关于点击率预估的比赛,它在很多机器学习的场景,例如计算广告、内容分发、电商推荐等都是非常有用的。而这个比赛的举办方也是诚意十足,数据都是脱敏的,总共有 4500 万行,特征包括 13 个数值特征、26 个类别特征,评估指标是 Logloss。
所以它可以说是点击率预估问题上,最知名的一次比赛了。该比赛总的参数队伍有 700 多支,KDD Cup 的一些历届冠军也来参加了。
当然,KDD Cup 的冠军们几乎拿下了前 15 名,《计算广告》的作者之一王超对排名给出了说明。(注:下图的本人是指王超)
那么多大神的比赛,作为小菜鸡的我,能做好吗?
Part 2
不管了,试试吧!
Step 1:上传数据
首先我打开了先知平台,把比赛数据(criteoKaggle 是我们内部对数据的命名)拖了进去,大小是 2.03 GB。
上传时间很快,不到 10 分钟就都上去了。
Step 2:了解数据
看一眼数据,果然是脱敏的!反正我任何套路都看不出来。
对于数据的解释,Kaggle 很是轻描淡写:
Label,1 代表点击,0 代表没有点击;
I1 到 I13 是数值特征;
C1 到 C26 是类别特征,已经做了哈希化;
当数据缺失的时候,以 empty 代替。
Step 3:数据拆分
由于不知道怎么对数据拆分,我用了 IJCAI 2017 的论文,DeepFM: A Factorization-Machine based Neural Network for CTR Prediction 中对该比赛数据的处理方式,按照 9:1 的比例,随机拆分成训练数据和测试数据。
Step 4:特征工程
我想既然 Kaggle 那么轻描淡写的解释数据,那我也轻描淡写的做特征工程吧!
I1 到 I13 是数值特征,都连续化就好了,类似这样:
f_col_10 = continuous(col_10)
C1-C26 是分类特征,离散化吧,类似这样:
f_col_38 = discrete(col_38)
然后把 Label 填上,特征工程搞定!
label = label(col_1)
Step 5:模型调参
这是个二分类问题,所以要选择分类算法。由于完全不懂数据什么意思,人工特征的方法几乎无效。
而如果要提取并使用多层次特征,就需要靠机器了,所以我从算法库中拖出了“线性分形分类器”,也叫 LFC。
然后是设置参数,经过两三次实验,我把参数设定如下:
步长 = 0.05
L1 = 0
L2 = 2.5
轮数 = 4 轮
速度优先
Step 6:模型评估
20 分钟后结果出来了,Logloss = 0.4546629606398476,AUC =0.796。
看了下排名,大概是 33 名。
Part 3
可是,花了几千万研发出来的先知平台,就做出这样的成果?
毕竟,我是机器学习小菜鸡,但先知平台可不是呀!
不行,再调调…
首先把所有的连续值,取个 log 加入特征,类似于这样
f_col_2_log = continuous(log(col_2))
由于线性分形分类器并没有做特征组合,所以要想拟合非线性的数据,还得自己做特征组合。
可是既然看不懂数据,怎么做呢?用 FeatureGo 吧!
FeatureGo 也是第四范式自主研发出来的算法,能够自动计算出最佳的特征组合。
通过 FeatureGo 算了一下,最佳的特征组合做出来了,如下:
f_combine_18_28=discrete(combine(col_18,col_28))
f_combine_20_37=discrete(combine(col_20,col_37))
f_combine_18_28_34=discrete(combine(col_18,col_28,col_34))
f_combine_20_31=discrete(combine(col_20,col_31))
f_combine_29_40=discrete(combine(col_29,col_40))
f_combine_18_20_28=discrete(combine(col_18,col_20,col_28))
由于多加了特征,所以正则项设置大一点,L2 =5,其他参数和上面的一样,又一个 20 分钟,结果好多了,Logloss = 0.45010290821784604,AUC = 0.801。
再看一下排名,到第 15 名啦!
顺手看一看论文的结果,比它的 Logloss 小一点,加上 AUC 高一点,心满意足了!
Part 4
模型算是建完了,看起来很轻松,当然实际操作起来更轻松,但是背后的技术可是非常牛的。
以至于,像我这样的机器学习小菜鸡,也可以做出这么牛的模型来。
所以我们得到了这样的公式:
我(机器学习小菜鸡) + LFC + FeatureGo + 一个周末 ≈ 世界 15 名(注:大神云集的比赛~)
还是很激动人心的!
顺便提下,刚才我用到的线性分形分类器(LFC)和 FeatureGo,是以第四范式的机器学习工程师罗远飞为主研发的。那个花了几千万研发经费的先知机器学习平台,背后有 3 名 ACM-ICPC 世界冠军,2 名 KDD Cup 世界冠军得主,这些人后面做了百度凤巢,搭建了今日头条的推荐系统,终于憋了个大招做出了先知机器学习平台。
现在好消息是,先知平台对外开放啦!
我们也是很有诚意的,刚才的实现过程已经放到了我们的平台。当然,每个人过来跑 4500 万的数据,对我们的服务器压力实在是太大太大太大了......
所以 4500 万的数据,我们随机抽取了 300 万放到平台中,其中 270 万作为训练,30 万作为测试。
当然效果肯定是会差很多,跑了一下 Logloss = 0.45988947376760886,名次是 73 名。
好吧,还是可以拿个铜牌。
如果你对我们感兴趣,请在这里申请先知平台:https://prophet.4paradigm.com
注:以上的工作都是建模学习,而不是严格的比赛对比。
参考论文:https://arxiv.org/pdf/1703.04247.pdf