常用推荐算法分类
实时和离线; 是否个性化推荐;基于统计的推荐;
个性化推荐的原则:如可以基于相似度去划分、基于已有的知识去推荐、基于模型的推荐(去学习这个推荐的模型);
按数据源划分:用户、物品、用户行为数据即它们俩之间的关系;
- 基于人口统计学的推荐(基于用户)与用户画像
- 基于内容的推荐(基于物品)与特征工程
- 基于协同过滤的推荐(用户行为数据)
1. 基于人口统计学的推荐
根据用户特质找到他的邻居;用户基本的信息;
- 基于人口统计学的推荐机制(Demographic-based Recommendation)是一种最易于实现的推荐方法,它只是简单的根据系统用户的基本信息发现用户的相关程度,然后将相似用户喜爱的其他物品推荐给当前用户
- 对于没有明确含义的用户信息(比如登录时间、地域等上下文信息),可以通过聚类等手段,给用户打上分类标签
- 对于特定标签的用户,又可以根据预设的规则(知识)或者模型,推荐出对应的物品
- 用户信息标签化的过程一般又称为用户画像(User Profiling)
用户画像
- 用户画像(User Profile)就是企业通过收集与分析消费者社会属性、生活习惯、消费行为等主要信息的数据之后,完美地抽象出一个用户的商业全貌作是企业应用大数据技术的基本方式; 用户信息不好收集,所以有时候可能不准确;可收集他的行为数据;
- 用户画像为企业提供了足够的信息基础,能够帮助企业快速找到精准用户群体以及用户需求等更为广泛的反馈信息
- 作为大数据的根基,它完美地抽象出一个用户的信息全貌,为进一步精准、快速地分析用户行为习惯、消费习惯等重要信息,提供了足够的数据基础
2. 基于内容的推荐
直接匹配、训练模型--特征值
- Content-based Recommendations (CB) 根据推荐物品或内容的元数据,发现物品的相关性,再基于用户过去的喜好记录,为用户推荐相似的物品。
- 通过抽取物品内在或者外在的特征值,实现相似度计算。 ===>> 比如一个电影,有导演、演员、用户标签UGC、用户评论、时长、风格等等,都可以算是特征。
- 将用户(user)个人信息的特征(基于喜好记录或是预设兴趣标签),和物品(item)的特征相匹配,就能得到用户对物品感兴趣的程度;
在一些电影、音乐、图书的社交网站有很成功的应用,有些网站还请专业的人员对物品进行基因编码/打标签(PGC)
相似度计算 -- 推荐系统中用的距离 --
相似度的评判,可以用距离表示,而一般更常用的是“余弦相似度”
欧式距离:差向量的模长;
余弦相似度
对于物品的特征提取 —— 打标签(tag)
- 专家标签(PGC)
- 用户自定义标签(UGC)
- 降维分析数据,提取隐语义标签(LFM)
对于文本信息的特征提取 —— 关键词
- 分词、语义处理和情感分析(NLP)
- 潜在语义分析(LSA)
基于内容推荐系统的高层次结构
特征工程 -- 模型之前所要做的 -- 最后得到的特征输出给模型(机器学习算法)
一开始拿到的数据 ===> 目标--想要得到的;
特征:作为判断条件的一组输入变量,是做出判断的依据
目标:判断和预测的目标,模型的输出变量,是特征所产生的结果
- 特征 (feature):数据中抽取出来的对结果预测有用的信息。
- 特征的个数就是数据的观测维度
- 特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程
- 特征工程一般包括特征清洗(采样、清洗异常样本),特征处理(标准化、归一化等)和特征选择(先提前考量下把不必要的砍掉,两个方面的考量:①数据是否发散---方差、相关系数)
- 特征按照不同的数据类型分类,有不同的特征处理方法
数值型--连续的
类别型 -- 离散的
时间型 -- 如用户登陆时间等
统计型
数值型特征处理:
用连续数值表示当前维度特征,通常会对数值型特征进行数学上的处理,主要的做法是 归一化 和 离散化
① 幅度调整/ 归一化 -- 让取值不会受到幅度的影响
特征与特征之间应该是平等的,区别应该体现在特征内部;
例如房屋价格和住房面积的幅度是不同的,房屋价格可能在3000000 ~ 15000000(万)之间,而住房面积在40~300(平方米)之间,那么明明是平等的两个特征,输入到相同的模型中后由于本身的幅值不同导致产生的效果不同,这是不合理的
归一化
② 离散化 : 连续值 ----> 变成分类问题
将原始连续值切断,转化为离散值:
- 让座问题:假设我们要训练一个模型判断在公交车上应不应该给一个人让座,按照常理,应该是给年龄很大和年龄很小的人让座
- 对于以上让座问题中的年龄特征,对于一些模型,假设模型为 y = θx,输入的 x(年龄)对于最后的贡献是正/负相关的,即 x 越大越应该让座,但很明显让座问题中,年龄和是否让座不是严格的正相关或者负相关,这样只能兼顾年龄大的人,无法兼顾年龄大的人和年龄小的人
对于让座问题,我们可以使用阈值将年龄进行分段,将一个 age 特征分为多个特征,将连续值离散化:
在电商中,每个人对于价格的喜好程度不同,但它不一定是严格的正相关或负相关,某些人可能就喜欢某一价格段内的商品。
离散化的两种方式:
- 等步长 —— 简单但不一定有效
- 等频(更精准,但易变动) —— min ---> 25% --> 75% ---> max
两种方法对比
- 等频的离散化方法很精准,但需要每次都对数据分布进行一遍从新计算,因为昨天用户在淘宝上买东西的价格分布和今天不一定相同,因此昨天做等频的切分点可能并不适用,而线上最需要避免的就是不固定,需要现场计算,所以昨天训练出的模型今天不一定能使用
- 等频不固定,但很精准,等步长是固定的,非常简单,因此两者在工业上都有应用
类别型特征处理 -- 特征展开处理
类别型数据本身没有大小关系,需要将它们编码为数字,但它们之间不能有预先设定的大小关系,因此既要做到公平,又要区分开它们,那么直接开辟多个空间
One-Hot 编码/哑变量
One-Hot 编码/哑变量所做的就是将类别型数据 平行地展开,也就是说,经过 One-Hot 编码/哑变量后,这个特征的空间会膨胀
特征空间就会膨胀;
时间型特征处理
时间型特征既可以做连续值,又可以看做离散值。
- 连续值
持续时间(网页浏览时长)
间隔时间(上一次购买/点击离现在的时间间隔)
- 离散值
一天中哪个时间段
一周中的星期几
一年中哪个月/星期
工作日/周末
统计型特征处理
- 加减平均:商品价格高于平均价格多少,用户在某个品类下消费超过多少。
- 分位线:商品属于售出商品价格的分位线处。
- 次序性:商品处于热门商品第几位。
- 比例类:电商中商品的好/中/差评比例。
推荐系统常见反馈数据 -- 收集模型的反馈数据做优化
2. 基于 UGC 的推荐 -- 行为数据,物品的内容信息即基于内容推荐
- 用户用标签来描述对物品的看法,所以用户生成标签(UGC)是联系用户和物品的纽带,也是反应用户兴趣的重要数据源
- 一个用户标签行为的数据集一般由一个三元组(用户,物品,标签)的集合表示,其中一条记录(u,i,b)表示用户 u 给物品 i 打上了标签 b
- 一个最简单的算法:
- 统计每个用户最常用的标签
- 对于每个标签,统计被打过这个标签次数最多的物品
- 对于一个用户,首先找到他常用的标签,然后找到具有这些标签的最热门的物品,推荐给他
- 所以用户 u 对物品 i 的兴趣公式为:
其中,nu,b 是用户 u 打过标签 b 的次数,nb,i 是物品 i 被打过标签 b 的次数 --物品跟标签的关联度;
基于 UGC 简单推荐的问题
- 简单算法中直接将用户打出标签的次数和物品得到的标签次数相乘,可以简单地表现出用户对物品某个特征的兴趣
- 这种方法倾向于给热门标签(谁都会给的标签,如“大片”、“搞笑”等)、热门物品(打标签人数最多)比较大的权重,如果一个热门物品同时对应着热门标签,那它就会“霸榜”,推荐的个性化、新颖度就会降低
- 类似的问题,出现在新闻内容的关键字提取中。比如以下新闻中,哪个关键字应该获得更高的权重?
TF-IDF算法
- 词频-逆文档频率(Term Frequency–Inverse Document Frequency, TF-IDF)是一种用于资讯检索与文本挖掘的常用加权技术
- TF-IDF 是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降 :
𝑇𝐹𝐼𝐷𝐹=𝑇𝐹×𝐼𝐷𝐹 词频 * 逆文档频率
- TF-IDF 的主要思想是:如果某个词或短语在一篇文章中出现的频率 TF 高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类
- TF-IDF 加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级
词频(Term Frequency,TF)
指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数的归一化,以防止偏向更长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)
其中 TFi,j 表示词语 i 在文档 j 中出现的频率,ni,j 表示 i 在 j 中出现的次数,n*,j 表示文档 j 的总词数
逆向文件频率(Inverse Document Frequency,IDF)
是一个词语普遍重要性的度量,某一特定词语的 IDF,可以由总文档数目除以包含该词语之文档的数目,再将得到的商取对数得到:
其中 IDFi 表示词语 i 在文档集中的逆文档频率,N 表示文档集中的文档总数,Ni 表示文档集中包含了词语 i 的文档数
TF-IDF 对基于 UGC 推荐的改进 -- 引入对热门的惩罚
为了避免热门标签和热门物品获得更多的权重,我们需要对“热门”进行惩罚
借鉴 TF-IDF 的思想,以一个物品的所有标签作为“文档”,标签作为“词语”,从而计算标签的“词频”(在物品所有标签中的频率)和“逆文档频率”(在其它物品标签中普遍出现的频率)
由于“物品 i 的所有标签”n*,i 应该对标签权重没有影响,而“所有标签总数”N 对于所有标签是一定的,所以这两项可以略去。在简单算法的基础上,直接加入对热门标签和热门物品的惩罚项:
其中,𝑛_𝑏^((𝑢))记录了标签 b 被多少个不同的用户使用过,𝑛_𝑖^((𝑢))记录了物品 i 被多少个不同的用户打过标签
TF-IDF算法示例
import numpy as np
import pandas as pd
1. 定义数据和预处理
docA = "The cat sat on my bed"
docB = "The dog sat on my knees"
bowA = docA.split(" ") #先做分词
bowB = docB.split(" ")
bowA
# 构建词库 list转换为set集合并去重
wordSet = set(bowA).union(set(bowB))
wordSet
=========>>
{'The', 'bed', 'cat', 'dog', 'knees', 'my', 'on', 'sat'}
2. 进行词数统计
# 用统计字典来保存词出现的次数
wordDictA = dict.fromkeys( wordSet, 0 )
wordDictB = dict.fromkeys( wordSet, 0 )
# 遍历文档,统计词数
for word in bowA:
wordDictA[word] += 1
for word in bowB:
wordDictB[word] += 1
pd.DataFrame([wordDictA, wordDictB])
3. 基于协同过滤的推荐
来源:oschina
链接:https://my.oschina.net/u/4388685/blog/3394341