作为一个推荐系统业余爱好者,在机器学习领域的鄙视链中,我感觉一直地位不高,时常被搞NLP CV语音等高科技技术的朋友鄙视。

最近甚至被人问,推荐算法开源包多如牛毛,我们为什么还要专门的推荐算法工程师?(难道想要辞退我!?惊)

不得不说,我想吐槽这个观点很久了。事实上搞推荐的工作不等于 import IBCF 或者 import time SVD++ import tensor啊摔!

于是找回帐号打开N年不用的博客,写一篇随想,其中含有大量主观臆断以及学术错误,尽量不中英夹杂术语之外的英文,如果有不同意见,欢迎回复指正。

说实在现在推荐包太多了,单机小规模实验的R包recommenderlab;慢的不行但是能够hadoop扩展的mahout;C++的eigen也给大家指明了一条矩阵运算的活路;matlab里各种memory based、model based、learning to rank算法包更是漫天飞;拿到风投的graphlab更是打出了号称五行代码动手写推荐系统的口号,还附带各种FM模型以及一健运行deep learning的套餐供大家玩耍;想要自己感受DIY的快乐,还有libFM;嫌慢可以使用SVDfeature简化套餐,还支持多线程硬盘计算,2G笔记本就可以建模2T数据。

(五行实现一个推荐系统,你怕不怕)

那做一个推荐系统,看来确实不需要专门的推荐算法工程师了,import xx即可。

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

我们可以看到,一个完整的推荐系统项目不能靠import xx实现的至少有上述几点。能够把这5点走通玩好,才是老板养这样几个工资万儿八千天天看起来成天只会看动画无所事事的推荐算法工程师的原因。

 

1.业务转化数学问题

一般一个项目启动都是老板说,我们公司的现在电话销售(app下载、商品销售、淘宝客收入等等)挺不错的,但是推荐栏的那个IBCF算法太搓,或者人工运营太累,你们能不能搞个推荐提高下转化率?

和做学术以及竞赛不一样,我们并不知道有哪些数据,也不知道要做成什么形式,推荐位放在哪,UI怎么搞比较好,这些都是需要和业务方一起磋商定稿的。

以电话销售为例,我们需要给电话销售人员一个列表,告诉他你今天给这样几个人推销这样几个商品会比较好。然后开工了,我们需要跟业务人员在一起商量,到底用什么数据能够完整的体现一个销售人员给特定的客户推销什么商品会成功?以此为依据决定收集什么样的数据,而非一般书籍里讲述的,仅仅使用用户商品矩阵这么清爽明快的事情。

以这个特定问题为例,我们需要的是销售人员数据,用户数据,商品数据,用户商品交互数据,销售人员商品交互数据,销售人员用户交互数据。其中用户商品交互数据中的很小一块便是很多开源包可用的UI矩阵。

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

填完这些坑,往往半个月一个月过去了,还非常辛苦(我的感觉是:程序员来自地球,业务人员来自火星)。。。。

 

2.数据特性定义active function

继续拿上面那个问题说事,数据清洗好该构造特征定义active function了。

active function是我随便叫的,或者叫model equation?总之我们如果假设特征相互独立,那么就是 y=wx 这种;如果认为特征集之间会有交互,我们有两种方法,第一种是做一个 low rank 假设,比如 SVD 的 y=pq这种形式,就是对于用户商品交互特征进行建模;另外一种就是写成y=wij*xi*xj这种形式。前面一种是 factorization models 的搞法,后面一种是 用rf或者gbrt的交叉特征的搞法。

对于我们这个问题来看,销售人员特征、用户特征、商品特征这种就属于wx这种形式;而销售人员商品交互特征、用户商品交互特征、销售人员用户交互特征这种就属于y=sq+sp+pq(销售s,用户p,商品q)这种形式。

所以整体来看我们问题的定义下来,active function应该为y = wx + sq + sp + pq的形式。顺便一说,考虑到时间因素,还要再加上好几个t的项(如果采用pairwise interaction tensor的形式的话)。

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

打个比方,libFM就提供了一个建模的通用式子

分别是bias,独立特征以及交互特征,一般人常说的IBCF,SVD等都是这个式子的特殊形式而已。

顺便这里说下,现在搞推荐的,一般两种流派,一种是用MF的,一种是用LR,RF,GBRT上高维特征的,经常吵的劝都劝不动。

我觉得这个只是数据特性的两种active function定义的倾向而已。

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

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

所以一句话,没有所谓推荐算法哪家强,只有合适的应用场景对应的合适的active function,然后影响到我们是用MF还是LR RF这种。观测不到或者观测很少用前者,反之用后者。或者两个都上,做ensamble(有计算资源,就是这么任性)。

 

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

这又是一个比较有争议的话题,不过也是推荐从业人员的工作核心所在,大概要忙活一下午?

一般的损失函数有三种,1.回归 2.分类 3.排序

比如说:

说实在,我干活从来不用前面那种,只有竞赛明确指明排行榜按照RMSE排序才会用前者。因为我们经常要做的是top-N的排序,对于用户给商品打分估计准了,但是转化率提不上去没用,因为用户只考虑买还是不买,很多研究也指出RMSE跟转化率和top-N不是很搭。

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

然后我们要考虑损失函数是否带权,以及正则的问题。带权主要是比如一个商品推成功了赚5毛,一个商品推成功了赚50,天壤之别,这就要结合业务来定义了。正则一般上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也是个不错的选择,或者用hadoop写MR。模型的算法并行看情况,一般的MF类型模型可以O(kN)求解,单机写的性能高点小时级别还是可以出结果的(比如SVDfeature这种),或者公司有条件上MPI,自己写spark也可以,但是没有看到成熟的成功案例?还有用graphlab这种性能也是不错的。

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

当然要上线要经历九九八十一难,某厂一个产品离线到AB test上线到最后,存活率不足1%,还要根据线上结果咔嚓掉一半,这些也是工程师要经历的磨难。

 

所以说了这么多,就是说,报告老板,当推荐算法开源包多如牛毛,我们还要专门的推荐算法工程师的!有好多事情可做的!(于是我的饭碗保住了,又可以愉快看动画片在B站自由飞翔了)

很多地方写了后面忘记前面,大家有什么想法快来交流,相互提高,邮件交流(我近期兴趣点在于如何有效利用外源数据提高推荐效果以及learning to rank调优这块) flclain@gmail.com

 

posted @ 2015-01-08 18:40 懒惰啊我 阅读(33231) 评论(16) 推荐(26) 编辑
摘要: 废话:最近朋友在学习推荐系统相关,说是实现完整的推荐系统,于是我们三不之一会有一些讨论和推导,想想索性整理出来。在文中主要以工程中做推荐系统的流程着手,穿插一些经验之谈,并对于推荐系统的算法的学术界最新的研究进展和流派作一些介绍。当然由于我做推荐系统之时还年幼,可能有很多偏颇甚至错误的见解,就当抛砖引玉,还请各位大大指点。Readinglists虽然很多人觉得作为AI的分支之一,推荐跟自然语言处理等问题的难度不可同日而语。但所谓磨刀不误砍柴工,我觉得,至少在开工前先应该阅读这样基本书,起码要看看目录,以对于推荐系统有个初步的了解。中文书籍:1.《推荐系统实践》项亮http://book.dou 阅读全文
posted @ 2013-03-03 12:53 懒惰啊我 阅读(43550) 评论(19) 推荐(10) 编辑
摘要: 废话:周日讲了下神经网络,本来想的是以理论和实践相结合,前面讲讲神经网络,后面简单讲下在weka中怎么使用BP神经网络,可惜最后时间不够,而且姥姥的兴趣点跑到凸优化那里去了,所以没有讲成实践的部分,有点郁闷的。为了不浪费了,就把这部分讲稿拿出来和大家分享一下,也希望对大家实践神经网络有所帮助。因为是讲稿,讲的要比写的多,所以很多地方口语化和省略比较严重,大家凑合着看吧。 实践部分讲稿正文: Weka是什么? Weka是由新西兰怀卡托大学用Java开发的数据挖掘常用软件,Weka是怀卡托智能分析系统的缩写。Weka限制在GNU通用公众证书的条件下发布,它几乎可以运行在所有操作系统平台上,包括Li 阅读全文
posted @ 2012-12-26 09:41 懒惰啊我 阅读(23681) 评论(4) 推荐(4) 编辑
摘要: 有博客园上的朋友问“领域目前的从业情况”@疯狂的小风各位大大如果有恰好是在公司任职做数据挖掘的,也请不吝分享下自己的工作,大家也可以交流下数据挖掘在业内的从业情况。我先抛砖引玉下,在以前公司主要是做一些recommend system的搭建,主要包括各种分类用户数据的抓取与过滤,调整算法参数和结果的一些指标评测以及其可视化;还有就是关于spam user的detect。前几天接到EMC2的电话,发现他们也是做数据挖掘的,毕竟是号称大数据的公司,不过具体干嘛没问,说是以后再联系。百度的数据挖掘应用则多如牛毛,做数据挖掘的进去了不愁找不到坑坐。淘宝的数据挖掘部门也是众所周知的数据魔方,里面大概分了 阅读全文
posted @ 2012-12-23 01:47 懒惰啊我 阅读(3842) 评论(10) 推荐(0) 编辑
摘要: 做数据挖掘也有些年头了,写这篇文一方面是写篇文,给有个朋友作为数据挖掘方面的参考,另一方面也是有抛砖引玉之意,希望能够和一些大牛交流,相互促进,让大家见笑了。 阅读全文
posted @ 2012-12-22 18:27 懒惰啊我 阅读(18491) 评论(31) 推荐(15) 编辑
摘要: 博主自身水平有限 原博客写的非常好 我也收益匪浅而且订阅了 只是发表一些观点作抛砖引玉 欢迎不同意见的大家一起交流刚看了《如果你是人人网的流量分析产品经理,如何解释 7 月 1 日到 7 月 7 日人人网的总流量以每日 5% 的幅度下滑?》这篇博客http://piaolin.sinaapp.com/?p=28原博主觉得“在一瞬间给出直觉的答案:因为人人网主要的用户是学生,而7月初可能是考试或者放暑假回家的日子。这样的产品经理难能可贵。”其实我觉得能在一瞬间给出直觉的答案并不是那么的可贵 因为有的时候很多问题的原因可能是混杂的而且是多方面的 充满了外部因素的在《思考 快与慢》这本书就给出了直觉 阅读全文
posted @ 2012-12-12 16:55 懒惰啊我 阅读(861) 评论(1) 推荐(1) 编辑
摘要: ps:由于篇幅问题,这篇博客主要介绍数据挖掘标准化流程中的project understanding问题,剩下的5个方面,特别是modeling等涉及具体算法的部分会在后续的博客中以结合orange和knime等开源软件或者是一些python小程序的形式写下去本文的一部分是翻译,有的部分是自己做数据挖掘项目时候的一些小的心得,也不见得正确,仅作抛砖引玉之用。如果需要相关的书籍电子版的也可以联系我flclain@gmail.com关于数据挖掘的标准化流程有大体有如下几种:SEMMA(sample,explore,modify,model,assessusedbySASInstituteInc)C 阅读全文
posted @ 2012-11-23 21:41 懒惰啊我 阅读(4256) 评论(0) 推荐(1) 编辑
摘要: 提到数据挖掘时,我们往往着重于建模时的算法而忽视其他步骤,而在realworld的数据挖掘项目中,其他步骤则是决定项目成败的关键。《guidetointelligentdataanalysis》这本书是knime官网推荐的书籍(http://tech.knime.org/guide-to-intelligent-data-analysis),按照CRISP-DM的流程讲述了数据挖掘流程的过程。我们先从什么是数据挖掘入手。要理解什么是数据挖掘,首先需要区分的是便是data和knowledge。我们对比data和knowledge的特征:DataKnowledge涉及到的是单个的实例(单个的事物, 阅读全文
posted @ 2012-11-23 17:44 懒惰啊我 阅读(4194) 评论(6) 推荐(0) 编辑
摘要: 简介: 最近大家十分关注美国大选,其中说的很火热的一点便是利用数据挖掘对于大选进行政治动员。刚好最近nature上有一篇名为A 61-million-person experiment in social influence and political mobilization文章就是讲的一个在上届美国大选时利用facebook上的实验数据对于政治动员和社交影响的分析。于是也学习了下。 本文主要分为两个部分,第一部分为对于这篇paper的在学习中的简要翻译和记录。第二部分为自己的一点简要心得。翻译和记录:A61-million-personexperimentinsocialinfluen.. 阅读全文
posted @ 2012-11-13 13:49 懒惰啊我 阅读(1816) 评论(1) 推荐(2) 编辑
点击右上角即可分享
微信分享提示