推荐算法工程

来源:互联网 发布:淘宝网钢笔学生 编辑:程序博客网 时间:2024/06/07 13:55

原文见:http://www.cnblogs.com/flclain/p/4211685.html

总结归纳为:

事实上搞推荐的工作不等于 import IBCF 或者 import time SVD++ import tensor啊

做一个推荐系统,其问题在于几个方面:1.业务转化数学问题 2.数据特性定义active function 3.根据业务定义合理损失函数 4.损失函数求解调优 5.计算量太大的离线算法优化和线上算法优化。

1.业务转化数学问题

一般一个项目启动都是老板说,与业务人员分析,了解所需数据,数据收集来了之后对数据做统计,消除特殊活动以及广告引流等影响,搞定缺失值、默认值、异常值等问题。里面还经常会遇到一些机器学习的子问题要处理,比如垃圾用户怎么排除(基于强规则弱规则构造特征做一个小分类器之类的)。

2.数据特性定义active function

如果假设特征相互独立,那么就是 y=wx 这种;

如果认为特征集之间会有交互,我们有两种方法,

       第一种是做一个 low rank 假设,比如 SVD 的 y=pq这种形式,就是对于用户商品交互特征进行建模;是 factorization models 的搞法,

       另外一种就是写成y=wij*xi*xj这种形式。是 用RF或者GBRT的交叉特征的搞法。

另外,考虑到时间因素,还要再加上好几个t的项(如果采用pairwise interaction tensor的形式的话)。

定义好形式就可以抽取特征了,然后按照 categorical variables以及noncategorical variables的形式整理好,这时候就可以开心用包啦!、

【对于FM做推荐】

考虑到不同categorical variable的交互。对于wij,我们经常是很难观测到行为的,比如用户i给电影j的行为,已经观测到才能估计wij,但是这表示他已经看了电影了,那推电影j就没意义了,所以我们使用pi*qj来近似wij。

【对于用LR,RF,GBRT上高维特征的推荐

不考虑categorical variable的交互,或者他们能观测到wij对应的xi*xj的行为,所以直接用分类回归模型求解wij而无需使用low rank假设。比如说天猫商品推荐,用户想买一个商品,经常会有点击搜索行为,这种xi*xj就是可观测的了,所以直接上rf或者gbrt就是合理的。

【总结】

有合适的应用场景对应的合适的active function,然后影响到我们是用MF还是LR RF这种。观测不到或者观测很少用前者,反之用后者。或者两个都上,做ensamble(有计算资源,就是这么任性)。

3.根据业务定义合理损失函数

【一般的损失函数有三种】

1.回归 ——对分数的准确估计,考虑RMSE评价。不适合做Top—N推荐和转化率。 比如

2.分类 ——比如

3.排序——当下很火的learning to rank,其损失函数是MRR这种直接优化排序的,相比AUC等考虑全局排序或者甚至只是point wise的分类系列损失函数,从理论上来说更加合理。其损失函数是个非凸损失函数,我们一般把其近似为凸函数求解(实际上还是有点坑)

【然后要考虑损失函数是否带权,以及正则的问题】

带权主要是结合业务来考虑

正则一般上L2

4.损失函数求解调优

在给定对数据的观测下【定义优化问题】【求解优化问题】一直是机器学习的主旋律

我们一般要选择一个科学的适合现状的方法,还有【调好超参数】。

拿常用的推荐系统优化方法来说,SGD,ALS以及MCMC一般的算法包都会提供。以LibFM为例对比三种方法:


可以看到,新手用MCMC inference最好。在推荐的问题中,一般只需要调两个超参数就好,factor的dimension k以及对factor初始化的高斯分布的std。k一般从小的着手,5啊8啊都是不错的做第一次调参的选择,太大容易过拟合。std对结果影响很大。不过好在也比较好调,一般选择0.1 0.2 0.5 1.0这种,而且我们一般在迭代的初期就可以通过观测training error的方式就可以确定了,甚至比常用的开源包的实现方式(从train里抠一部分做holdout set做观测)还好。

如果是高手,可以挑战SGD,SGD的参数除了MCMC的那几个,还有几个非常不好调的参数,有正则项的lambda以及学习速率。正则项没办法,只能靠grid search。学习速率更坑,高了不收敛,低了跑的慢,具体什么速率好只有上帝知道。(最好是0.0127这种,不要是10的倍数,我瞎说的)。


 5.计算量太大的离线算法优化和线上算法优化

算法一般分好几个部分,一般有线下部分和线上部分,比如很多做法是线下选离线商品池子,线上CTR(点击率)预估。这样就涉及到大量的离线评测和线上算法架构。

对于数据的预处理和特征的构造,一般都是数据并行,规模不是特别大的log或者不是太多冗余的文本,python脚本nohup也是个不错的选择

模型的算法并行看情况,一般的MF类型模型可以O(kN)求解,单机写的性能高点小时级别还是可以出结果的(比如SVDfeature这种)

线上的话架构等模型定下来做LR这种,一般会对用户大体离线算个离线池子,这样线上压力小,storm都是不错的选择,反正不需要实时训练,数据增量记录好一天甚至一周一迭代就好。

-----------------------------------

真的是听君一席话,胜自己瞎看三年书,大致流程了解了。


0 0
原创粉丝点击