推荐系统-利用用户行为数据判断用户间或商品间相似性、分类和个性化推荐

前言:

总算开始了个人博客-菜鸟成长室(http://blog.csdn.net/wangdaiyin)输出的第一步,转载请注明文章来源!


推荐系统概念:

简单来说,个性化推荐系统是一种解决信息过载问题的技术,它是根据用户的兴趣爱好,推荐符合用户个性化的对象,可以帮助用户找到想要的商品/新闻/音乐等、能降低信息过载问题、提高站点的点击率/转化率、加深对用户的了解并进一步提供定制化服务。它已广泛应用于许多领域,如电商,音乐、搜索、阅读、话题、广告等。


推荐算法大概可以分为基于流行度的算法(简单暴力,现应用较少)、协同过滤算法、基于内容的算法、基于模型的算法、混合算法等

目前最热门的个性化推荐技术是协同过滤推荐(Collaborative Filtering, CF),包括基于用户的协同过滤和基于物品的协同过滤推荐,它主要基于邻居用户/相似物品的信息得到目标用户的推荐,简单理解也就是假设喜欢类似物品的用户可能有相同或者相似的口味和偏好。其次,当缺少评分等数据时,基于内容的推荐算法常被用到,比如根据用户所浏览新闻的内容和行为(新闻停留时间、评论等)来推送相关新闻。再者,我们可以基于模型算法(如逻辑回归、隐语义模型等)通过分析系统中用户行为和购买记录等数据来进行拟合,学习出相关模型进行预测和推荐。基于模型的算法理论基础清晰,实现快速,适用于实时性比较高的业务如新闻、广告等,若想达到更好的效果,常需要人工干预反复地进行属性的组合和筛选。

现实应用中,很少有直接用某种单一算法来做推荐系统,往往通过混合算法融合多种算法进行推荐。比如我们可以通过给不同算法的结果加权重来综合结果,或者是在不同的计算环节/板块中运用不同的算法来混合,达到更贴合自己业务的目的。


推荐算法是否良好的评价指标:推荐准确度(准确率或召回率等)、覆盖率(各商品被推荐比例,会考虑信息熵、基尼指数等)、多样性、产生效益(点击率、转化率等)等。


数据来源:

用户数据分布大多满足长尾分布,比如用户活跃度与物品流行度的关联,简单地说,在互联网领域中,指的就是最热的那一小部分资源将得到绝大部分的关注,而剩下的很大一部分资源却鲜少有人问津。这不仅造成了资源利用上的浪费,也让很多口味偏小众的用户无法找到自己感兴趣的内容。数据主要来源于:

1.静态数据:如用户性别、年龄、地域、兴趣标签等注册信息以及位置、授权的社交好友信息等,结合简单分析物品的商品类别、推广/热门商品等信息建立相关表);举例:针对新加入用户进行商品推荐。

2.用户行为/交互数据:主要分为显性反馈行为(如5星评分、喜欢OR不喜欢、评论/标签等)和隐性反馈行为(历史商品购买行为、页面/商品浏览行为、购物车信息、客服咨询相关信息等,这些数据常需要经过处理和转化才可能有实际的用途)。


涉及关键问题:

0.冷启动问题:包括用户冷启动、物品冷启动、系统冷启动等,常见的解决方案有1)对于新用户先进行热门(/随机)推荐,对于新物品可考虑基于内容的推荐;2)利用静态数据可进行粗粒度的个性化等。

1.数据整理、分解与降维(SVD /  PCA):比如通过(多属性)评分矩阵计算出用户对各个属性的偏好矩阵,找出相似用户;主要要解决数据稀疏性,通过因子分解,可以找到用户和物品之间的一些潜在关联,从而填补之前矩阵中的缺失值。

2.用户间/物品(item)间相似性度量: 常用Cosine相似度、欧式距离、马氏距离、相关系数等,针对不同场景来使用最合适的相似度计算方法或者进行改进,比如考虑到不同用户的评分尺寸问题,可以通过减去用户对商品的平均评分来修正相似性计算,再比如考虑到不同关键词重要性的不同,可引入权重或惩罚热门标签/item。

3.用户或item聚类:根据实际场景选择聚类算法,常用k-means、蚁群等

4.个性推荐:根据相似性、聚类结果等进行针对性推荐;

5.结果处理与调整:比如当推荐的内容里包含敏感词汇/涉及用户隐私的内容时,就需要系统将其筛除;若数次推荐后用户对某个item依然毫无兴趣,就需要将这个item降低权重,调整排序;另外,有时系统还要考虑话题多样性的问题,同样要在不同话题中筛选内容。

附:数据挖掘内容概览 http://blog.csdn.net/matter605924657/article/details/53053609


知识点分析1:基于用户间相似度进行个性化推荐————基于用户/物品的CF

基于用户的CF原理如下:

  1. 分析各个用户对item的评价(评分/标签系统、或通过浏览记录、购买记录等分析);
  2. 依据用户对item的评价计算得出所有用户两两之间的相似度;
  3. 选出与当前用户最相似的N个用户;
  4. 将这N个用户评价最高并且当前用户又没有浏览过的item推荐给当前用户。

基于物品的CF原理跟基于用户的CF类似,只是主体在于物品:

  1. 分析各个用户对item的评价(评分/标签系统、或通过浏览记录、购买记录等分析);
  2. 依据浏览记录分析得出所有item之间的相似度;
  3. 对于当前用户评价高的item,找出与之相似度最高的N个item;
  4. 将这N个item推荐给用户。

其他不同之处在于基于物品的CF适应用户个性化需求强烈的领域,新用户只要对一个物品产生行为,就可以给他推荐和该物品相关的其他物品,有些接近基于内容的推荐,可以利用用户的历史行为给用户做推荐解释,令用户比较信服。

过程简约地说就是,第1步,给定/得出一个对应m个用户和n个项目的用户-item评分矩阵;若不考虑数据稀疏性、采取分解降维等操作,则直接第2步,得到m*m的用户间相似性矩阵或得到n*n的item间相似性矩阵;再进行第3、第4步。详细实例过程可参考所附参考资料。


简单例子:给定如下用户-电影评分矩阵


计算电影2-6和电影1的相似度(例如Jaccard相似度),找到最相似的Top 2电影3和6;然后如下所示计算出用户5对电源1的评分;



CF推荐系统可能存在的问题:

  • 用户-item评分矩阵往往稀疏性很高,需数据分解
  • 无法解决冷启动问题,如新用户或者新物品加入系统时,推荐将无从依据;
  • 比较依赖于准确的用户评分;
  • 热门物品会有更大几率被推荐给用户;


知识点分析2:基于用户评分对商品进行分类


(补充的问题:如果给出一个新酒店,如何对其分类?)

代码实现:

import pandas as pd
import numpy as np
#prepare data set, suppose there are 5 types of hotels
generatorNum=5
hotelNum=100
customerNum=100000

generators = np.random.randint(5, size=(customerNum, generatorNum))
hotelComp=np.random.random(size=(generatorNum, hotelNum)) - 0.5
hotelRating = pd.DataFrame(generators.dot(hotelComp),index=['c%.6d'%i for i in range(100000)]
                          ,columns = ['hotel_%.3d'%j for j in range(100)]).astype(int)

def normalize(s):
    if s.std()>1e-6:
        return (s-s.mean())*s.std()**(-1)
    else:
        return (s-s.mean())

#take a look at hotel rating
hotelRating
hotelRating_norm = hotelRating.apply(normalize)
hotelRating_norm_corr = hotelRating_norm.cov()
hotelRating_norm_corr

u,s,v = np.linalg.svd(hotelRating_norm_corr)
import matplotlib.pyplot as plt
plt.plot(s,'o')
plt.title("singular value spectrum")
plt.show()

u_short = u[:,:5]
v_short = v[:5,:]
s_short = s[:5]

hotelRating_norm_corr_rebuild = pd.DataFrame(u_short.dot(np.diag(s_short).dot(v_short))
                                            ,index=hotelRating_norm_corr.index
                                            ,columns=hotelRating_norm_corr.keys())

#get the top components
top_components = hotelRating_norm.dot(u_short).dot(np.diag(np.power(s_short,-0.5)))

#classfication of each hotel
hotel_ind = 30
rating = hotelRating_norm.loc[:,'hotel_%.3d'%hotel_ind]
print "classification of the %dth hotel"%hotel_ind
top_components.T.dot(rating)/customerNum

解析:基于SVD分解(有些资料中提及基于矩阵分解就是隐语义模型),可参考下述实现


假设评分矩阵A为


使用matlab调用svd函数:


U和V的每一行表示每一个(/类)物品或用户;S是对角矩阵,表示每个season和每个用户的相关性,每个元素大概等同于特征值(代表该矩阵向着该特征值对应的特征向量的方向的变化权重)的作用,这里取S对角线上前k个元素,k=2;则可简化为如下矩阵相乘:


得到的新矩阵A2与A会很接近。接着,将U,V每一行分别用二维向量表示,如下图:

svd-recsys

根据相似性度量或者聚类方法可以判别出各物品(或用户)的相似物品(或用户)。

假若现在给出一个新的用户,要求对他做出个性化推荐,思路如下:

1)首先利用新用户的评分向量找出该用户的相似用户

svd-recsys

而后得到一个Bob的二维向量,也即知道Bob的坐标。然后找出和Bob最相似的用户或者进行分类/聚类,然后进行推荐。


知识点分析3:新闻推送——基于内容的算法

基于用户喜欢的物品属性/内容进行推荐,需要分析内容,无需考虑用户与用户之间的关联,通常使用在文本相关产品上进行推荐,比如新闻,但电影等上也可以使用。

基本原则如下:

  1. 对于每个要推荐的内容,需要建立一份资料:比如每个词在文件中的权重,常用的方法有TF-IDF(单个文档出现次数越多越重要,但若所有文档出现次数都多,重要性将下降)
  2. 根据已有数据需要对用户也建立一份资料:比如说定义一个权重向量
  3. 计算相似匹配度

简单例子:


1.对于推荐内容,得出以下矩阵:每一列表明每一本书,每一行表明每个词在各书中出现的情况


然后转成TF-IDF特征矩阵


2.用户喜欢的那一本书内容,即第一本书的向量即权重向量

3.基于标题内容相似度推荐,推荐TOP N相似的书

其他说明:如果用户喜欢的数据有更多,可以形成更多的item项,可以给各item项根据实际情况加权重,或者进一步抽象提取成同一主题聚类的其他item。


好处:

基于内容的推荐算法能够很好地解决冷启动问题,并且也不会囿于热度的限制,可能达到比CF算法更好的推荐效果,如github上的推荐系统。但它可能带来过度专业化的问题,一直推荐给用户内容密切关联的item,而失去了推荐内容的多样性。


知识点分析4:商品购买预测——基于模型的算法/混合算法

简单例子:逻辑回归

我们通过分析系统中用户的行为和购买记录等数据,得到如下表:


表中的行是一种物品,x1~xn是影响用户行为的各种特征属性,如用户年龄段、性别、地域、物品的价格、类别等等,y则是用户对于该物品的喜好程度,可以是购买记录、浏览、收藏等等。通过大量这类的数据,我们可以回归拟合出一个函数,计算出x1~xn对应的系数,这即是各特征属性对应的权重,权重值越大则表明该属性对于用户选择商品越重要。

更多地,我们可以调整特征属性的组合,拟合出最准确的回归函数,比如年龄与购买护肤品这个行为并不呈强关联,性别与购买护肤品也不强关联,但当我们把年龄与性别综合在一起考虑时,它们便和购买行为产生了强关联。



经典案例分析:(待以后文章补充)

准备从天池大数据的比赛案例中挑选一例


参考资料:

1.推荐系统-利用用户行为数据&SVD: http://blog.csdn.net/ivysister/article/details/51363881

2.5类推荐算法:http://blog.csdn.net/imail2016/article/details/51785308

3.天池大数据比赛案例-推荐系统:



你可能感兴趣的:(推荐系统,机器学习)