C++,python,热爱算法和机器学习
全部博文(1214)
分类:
2012-04-20 11:46:04
本博客所有原创文章采用,转载请保留链接
前段时间做了个slope one算法在上的测试,关于slope one算法可以参考我之前写的文章:,Netflix Prize是DVD在线租赁商于 2006年10月2日发起一项竞赛:任何组织或个人只要能够提交比它现有电影推荐系统Cinematch效果好10%的新方法,就可以获得100万美元的 奖金。竞赛最多持续到2011年10月2日。同时,NetflixPrize还提供每年5万美元的年度进步奖。为什么是五万美元的年度进步奖呢?因为 100万美元大奖存银行,每年的利息是5万美元,看来老外是挺有意思的。
Netflix Pirze采用RMSE作为评测的标准,RMSE中文的意思是均方根误差,计算的公式:
其中Ot是原始数据,Ft是预测数据,n是样本数。
目前最好的成绩是有创造的0.8598(2009.01.05数据),比官方数据提高9.63%,这样可以推算出官方的数据应该是0.9492左右,BellKor in BigChaos也是2008年度进步奖的获得者,他们更新数据的频率很高,如不出意外,最后的大奖应该是他们的。
目前的方向大多是SVD奇异值分解,可以参见BellKor in BigChaos他们的文章,这里有一个开源的项目, 也是一个SVD处理Netflix Prize的模型,大部分代码是Python的(国外很多用Python做数据挖掘和自然语言处理的案例),成绩到了0.9046,折算比官方数据要高 4.70%,如果你想拿SVD热热手,可以看看这个开源项目,过些日子我会写一些SVD应用在推荐系统方面的文章,着急的可以阅读吴军的文章数学之美 系列十八 - 矩阵运算和文本处理中的分类问题。
由于对slope one算法比较熟悉,决定看看slope one算法在netflix pirze上的表现如何,netflix prize训练数据太大,大概有1亿多条的打分记录,在 运行效率方面不是很好,OpenSlopeOne处理几百万上千万的打分数据还是非常不错的,更多的话需要更多的机器水平扩展,如果有好的Mysql DBA可以尝试优化一下mysql server的参数,估计效果会很好,当然也需要有好的机器配合,我这里是用Python写的一个程序,多进程+多线程+手工Map-Reduce,需要 源代码的话可以找我拿。
跑出来的结果不是很好,我的得分是0.9829,比官方数据差0.0337,大概差3.55%,分析原因可能是用户打分的数据普遍偏高,人们大多给自己喜欢的电影打分,对于不喜欢的数据打分就少很多了,下面是打分数据的分布情况:
mysql> select rating,count(*) as times from nf_log group by rating; +--------+----------+ | rating | times | +--------+----------+ | 1 | 4617904 | | 2 | 10131945 | | 3 | 28810978 | | 4 | 33750581 | | 5 | 23167830 | +--------+----------+
一目了然,用户对不喜欢的电影打分甚少,而且用户的平均打分达到了3.6043,所以最后算出来的打分值普遍偏高,RMSE的表现当然差了,Slope one算法里面有个BI-POLAR SLOPE ONE来应对这种问题,有兴趣的可以尝试一下。
尽管得分情况不是很好,我用probe的数据测试看,slope one算法对用户喜欢的电影预测还是很好的,不擅长的是对用户不喜欢的电影的预测,对用户打分为1的预测普遍在3以上,拖累了它的表现。
我们一般要做的是对用户喜欢的东西进行推荐,slope one还是一个很不错的选择。