天猫推荐算法大赛总结

时间:2024-03-05 08:23:52

原文:http://closure.blog.ustc.edu.cn/?p=117

阿里这次天猫推荐算法大赛题目的核心是给定用户对品牌的四个月的操作记录,预测下个月哪些用户对哪些品牌产生购买行为,这可以抽象为一个01分类问题,更确切的可以抽象为一个点击率预估(CTR)。与其说这是一次比赛,我觉得更多的是一次认识,一次对大数据价值的深刻认识,在分享自己的体会之前,我真心的感谢阿里,给我们提供这样一种机会,让我们在学校里可以接触真实的数据业务需求,让所学的理论可以有一次真实的实践机会。

关于这次比赛,我想简单分享下几个比较重要的点:

第一点:特征提取,也称特征工程

在真实的业务场景中,特征和模型一样重要,花费同样的人力物力,做特征工程有可能比作模型和算法优化来的有效。天猫的大数据竞赛可以简单抽象为一个点击率预估问题,给定用户对品牌的操作行为,判断下个月买的可能性为多少。这里特征工程做的核心工作即构建用户对品牌的特征体系:因为原始数据集是关于用户对品牌在某个时间的某个行为操作,它是一个四维的张量,所以在提取feature的时候要充分考虑到这四个维度张量的信息。我们最终的目标是把这四维张量压缩为一个二维的feature矩阵,并在这个feature上做模型的训练和预测。如何把这四维张量的信息经过加工提取形成一个二维的feature矩阵,这应该是做好比赛的第一步,而且是重要的一步。现在大部分选手用的都是基于业务、经验或者尝试来进行手工提取,所以这个比赛谁的业务理解深刻,经验足可能会有更好的结果。

下面我说下我们组的特征提取的过程:

我们把特征集分为三个部分:第一是用户对品牌的直接特征体系,包括点击购买收藏和购物车,第一次点击购买,最后一次点击购买等;第二是用户的特征体系,包括用户总购买,总点击,点击转化比等;第三是品牌的特征体系,包括品牌购买用户,购买次数,点击转化比等等。为了把时间这一张量加入到特征体系中,我们按照时间分片,每个片里面提取相应的特征体系。基于一种观察,用户对品牌的购买行为和他最近的行为较为相关,所以时间片的划分应该满足最近的时间分片较细,较远的时间片划分粗粒度一些;这样就把时间这一张量的信息粗糙构建到feature中。

当然这只是一个很粗糙的一个特征体系的构建,还有很多的优化空间。

下面我说下几个优化的点,这几点对我们的成绩都有不小的提升:

第一点:关于品牌或者用户的特征挖掘,简单的统计虽然对整个结果的准确性有一定提升,但是绝对不是最大的提升,一个很简单的例子:A和B两个品牌都被买了1000次,但是A品牌中很多人买了再买,然后再买,但是B品牌大部分买了一次都不再买了,这是个很大的区别,也就是说在对品牌进行特征建模的时候,把用户的因素更加深刻的结合到品牌中挖掘更加本质的特征,有点类似于寻找最优解一样,总有个方向最快通向最优解,但是如何找到这个最有方向,需要我们深层去思考,这可能就是业务吧。

还有一点,A用户对B1和B2两个品牌都产生过一次操作,并且这两个品牌的特征体系基本相同,那如何判断对哪个品牌买的可能性更大呢?这个基于简单统计的可能就难以去做,但是我们深层的考虑下,通过协同过滤,我们发现A用户曾经买的品牌中很多和B1产生一种联系,但是和B2品牌没啥联系,这样明显的A用户买B1的可能性就更大一些。

所以在做特征工程的时候,除了简单的数学统计外,我们还是要深入思考整个业务场景,挖掘更加本质的特性,才会有更大的提升。

做好了特征工程,下面一个重要的一点就是模型选择和优化:

一般来说,好的特征体系,不同的模型都会有不错的效果,但是我们还是要根据不同模型的特点做特定的优化。我们在比赛中主要用到了逻辑回归、随机森林、梯度增强回归树。首先说下我们在逻辑回归上遇到的一个大坑,对于逻辑回归要求特征具有线性可比较,一个简单的例子,一个用户对一个品牌点击了10次和100次,是不是点击100次的那个品牌一定比点击10的那个品牌要买的可能性大10倍,我想肯定不是,可能买的可能性就大那么一点点而已,所以我们要对特征进行一些变换,让其具有线性可比较性,我们采取的措施是进行log变换,效果比原始数据要好很多。随机森林,虽然它可以适应与连续和离散的特征,且不需要特征具有线性化特征,但是连续特征给模型的训练带来很大的开销,且容易出现过拟合,如果对特征进行离散化,也许会有更好的效果,常见的就是等距和等频分箱,进行离散化处理,感觉效果也不错。当然还有其他优化,比如逻辑回归中正则化调整,随机森林和GBRT的参数调优等,都会对结果有一定提升。

然后还要说一点,关于模型融合,这一点对于比赛来说,可能是决赛的最后一步:

关于模型融合,可能是比赛最后阶段最重要的环节,这一环节我们没有做的很好,但是还是分享下组里的一些思路:其实gbrt和随机森林本身就是两个融合模型,一个是基于boosting的集成学习,一个是基于bagging的集成学习。下面说下模型的融合方案,可以分成两大方面:第一是模型内部的融合;第二是模型和模型之间的融合。关于模型内部融合,可以从以下方面考虑,第一是多次采样,进行结果融合;第二是不同特征子空间进行训练,结果进行融合;第三是简单模型级联融合,以线性回归为例,构建级联的线性model,每个新的线性model是以前一个线性model的误差为目标,做到误差的级联消除。关于模型之间的融合,可以利用最小二乘计算最优的模型权重系数,然后进行融合。总体来说,模型融合我们可能需要再去深入研究下。

最后说一些我们没来得及做,但是值得尝试的方向:

首先关于特征提取,我们可以对特征进行组合,形成一定富特征,也许可以提升分类器的精度,至于如何组合,目前我还没有自动化组合学习的思路,但是人工组合是一个可行的方法。

关于上述我们介绍的从四维张量到二维特征矩阵的提取,是不是有更加自动的方法去做自动特征提取,这一方面,我调研了两个方案:一个是张量分解,把高维转化为几个低维的乘积;另外一个是深度学习,无监督自学习特征,当然这两点可能做的难度要大很多。

关于gbrt,天池默认的是最小二乘的回归模型,其实这种基于gradient boosting的增强学习模型可以通过简单的转化,转化为分类模型,比如mlr(多分类逻辑回归)实际上就是一种gradient boosting的分类模型,这样可能比把分类问题强行转化为回归问题更靠谱一些。

我们队是“冲刺了!”,二阶段第51名,虽然名次有点遗憾,但是学到了太多东西,感谢阿里!附我们队合影,感谢可爱的队友。