推荐系统的常用算法,选择,漫谈,推荐系统开源软件汇总

推荐系统的常用算法概述

 

  前一阵子准备毕业论文的开题,一直在看推荐系统相关的论文。对推荐系统有了一个更加清晰和理性的认识,也对推荐算法有了深入了解。借此机会总结分享一下,大家多多拍砖。

推荐系统的出现

  随着互联 的发展,人们正处于一个信息爆炸的时代。相比于过去的信息匮乏,面对现阶段海量的信息数据,对信息的筛选和过滤成为了衡量一个系统好坏的重要指标。一个具有良好用户体验的系统,会将海量信息进行筛选、过滤,将用户最关注最感兴趣的信息展现在用户面前。这大大增加了系统工作的效率,也节省了用户筛选信息的时间。

  搜索引擎的出现在一定程度上解决了信息筛选问题,但还远远不够。搜索引擎需要用户主动提供关键词来对海量信息进行筛选。当用户无法准确描述自己的需求时,搜索引擎的筛选效果将大打折扣,而用户将自己的需求和意图转化成关键词的过程本身就是一个并不轻松的过程。

  在此背景下,推荐系统出现了,推荐系统的任务就是解决上述的问题,联系用户和信息,一方面帮助用户发现对自己有价值的信息,另一方面让信息能够展现在对他感兴趣的人群中,从而实现信息提供商与用户的双赢。

  系统首先会根据用户的属性建模,比如用户的年龄,性别,兴趣等信息。根据这些特征计算用户间的相似度。比如系统通过计算发现用户A和C比较相似。就会把A喜欢的物品推荐给C。

  优势:

  a 不需要历史数据,没有冷启动问题

  b 不依赖于物品的属性,因此其他领域的问题都可无缝接入。

  不足:

  算法比较粗糙,效果很难令人满意,只适合简单的推荐

 

  2 基于内容的推荐

  与上面的方法相类似,只不过这次的中心转到了物品本身。使用物品本身的相似度而不是用户的相似度。

  

我们的机器学习工程师一直忙于构建GraphLab farm。这篇博客针对一个特殊的应用难题:怎样从 GraphLab Create recommender toolkit 的众多模型和选项中选择一个合适的推荐模型。

这完全取决于你现有的数据类型以及你评估结果的方式。

(注意:这里使用的是GraphLab Create 0.9 的API。GraphLab Create 1.0 支持通过recommender.create() 来智能选择推荐模型。你可以通过 1.0 的API文档查看recommender toolkit中模型的最新说明。此外,这个论坛列出了从版本0.9.1到版本1.0的API变动。)

如果你的数据是隐性的,也就是数据中仅有用户和物品间的交互信息(没有用户对物品的打分),那么,你可以选择使用Jaccard相似度的 ItemSimilarityModel。

          Python  

1 2 3 4 # 当数据中仅包含’user_id’和’item_id’两个属性的时候 # recommender.create 方法会自动选择 # `method=‘item_similarity’` and `similarity_type=’jaccard’` >>> itemsim_jaccard_model = graphlab.recommender.create(data)

当数据为隐反馈时,你可以通过增加一个均为1的目标列把数据伪装成显性数据。若要构建追求排序性能的模型,请见下文。

如果数据是显性的,也就是观测数据中包含用户的真实评分,那么你可以从多个模型中选择。使用cosine或Pearson相似度的ItemSimilarityModel可以包含评分信息。此外,MatrixFactorizationModel(矩阵分解模型)、FactorizationModel(分解模型) 以及 LinearRegressionModel(线性回归模型) 都支持评分预测。

          Python  

1 2 3 4 5 6 7 8 # 此时数据中包含 3 列,‘user_id’,‘item_id’ 以及 ‘rating’ >>> itemsim_cosine_model = graphlab.recommender.create(data,        target=’rating’,        method=’item_similarity’,        similarity_type=’cosine’) >>> factorization_machine_model = graphlab.recommender.create(data,        target=’rating’,        method=’factorization_model’)

如果你的目标是提高排序性能,你可以在设置 ranking_regularization 的情况下使用 ItemSimilarityModel(物品相似度模型)、MatrixFactorizationModel(矩阵分解模型) 、 FactorizationModel(分解模型)。排序正则化选项设置后会随机地选取一些未观测数据并把它们的目标评分设成一个偏负面的值。ranking_regularization 值在0到1之间。该值越大,负样本的权重也就越大。如果你想使用 分解模型来处理隐反馈数据,你应该首先给 SFrame 增加一列全为1的值把它变成显性数据,再将 unobserved_rating_value 设为 0 来运行排序正则化。这里明确地设定 unobserved_raint_value 是有必要的,因为模型默认把未知评分设为已知评分的 5% 分位数;当所有已知评分均为 1 时,它们的 5% 分位数也是 1,不能把它作为未知评分的目标值。

          Python  

1 2 3 4 5 6 7 8 9 10 11 12 # 数据中包含一列真实的评分 >>> ranking_regularization_model = graphlab.recommender.create(data,        target=’rating’,        method=’matrix_factorization’,        ranking_regularization=1.0)   # 数据中包含一列“伪造”的评分,全部为 1 >>> rr_model_for_implicit_data = graphlab.recommender.create(data,        target=’rating’,        method=’matrix_factorization,        ranking_regularization=1,        unobserved_rating_value=0)

如果你想对评分数据进行评分预测,那么选择MatrixFactorizationModel, FactorizationModel, or LinearRegressionModel的任意一个。从统计学的角度看,这三个模型都是明确地对评分建模的回归模型。换句话说,观测评分被建模为一些项的加权组合,其中权重(包括一些项,也被成为因子)通过训练数据得到。这几个模型都可以很方便地引入用户或物品特征。

          Python  

1 2 3 4 5 6 7 8 9 # 当数据包含一列目标值时,默认的方法是 matrix_factorization >>> matrix_factorization_model = graphlab.recommender.create(data,        target=’rating’) >>> linear_model = graphlab.recommender.create(data,        target=’rating’,        method=’linear_model’) >>> factorization_machine_model = graphlab.recommender.create(data,        target=’rating’,        method=’factorization_model’)

LinearRegressionModel 假设评分是用户特征、物品特征、用户偏置、物品流行度偏置的线性组合。MatrixFactorizationModel 和 FactorizationModel 还可以引入两个向量的内积项,其中一个向量表示用户对一组隐性特征的喜好程度,另一个向量表示物品对这组隐性特征的包含程度。这些通常被称为隐性因子并且可以从观测数据中自动学习得到。FactorizationModel (分解模型)较 MatrixFactorizationModel(矩阵分解模型) 更进一步, 考虑到了这些隐性因子与边际特征的交互影响。一般来说,FactorizationModel(分解模型) 最有效,但也最难训练(由于它的威力和灵活性)。LinearRegressionModel(线性回归模型) 最简单,训练速度也最快,但没有考虑用户物品间的交互作用。

我们建议你从 MatrixFactorizationModel(矩阵分解模型) 开始,如果这个模型运行时间过长,可以降级使用 LinearRegressionModel(线性回归模型)。或者,如果你认为需要使用二阶交互项来加强模型,可以升级使用 FactorizationModel(分解模型)。注意,这些模型都带有几个正则化参数如:n_factors 和 regularization,这些参数会影响测试时的预测精度。这对于 FactorizationModel(分解模型) 尤为有用。建议你使用超参数搜索函数 graphlab.toolkits.model_params_search() 来调整这些参数。

          Python  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 这里强调了回归模型中一些有用的参数选项 >>> custom_mf_model = graphlab.recommender.create(data,

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年6月22日
下一篇 2016年6月22日

相关推荐