机器学习项目(五) 电影推荐系统(三)

四、基于内容推荐

协同过滤:基于内容 基于用户
找到用户或内容之间的相似性 进行推荐

基于内容推荐简介

基于标的物相关信息、用户相关信息及用户对标的物操作行为来构建推荐算法模型,为用户提供推荐服务。
机器学习项目(五) 电影推荐系统(三)_第1张图片

基于内容推荐

核心步骤
机器学习项目(五) 电影推荐系统(三)_第2张图片

基于用户特征和标的物特征 实现为用户推荐相似的标的物

1.基于用户历史行为记录做推荐:先计算标的物之间的相似性,然后利用用户历史记录中与标的物相似的物品进行推荐(余弦相似度)
2.基于显示的标签标示做推荐:根据用户的标签,表示用户的兴趣,标签可以关联许多的标的物
3.基于向量相似做推荐:将用户和标的物 嵌入向量空间中,找到用户和标的物之间的相似性。计算用户和标的物之间的相似性。

用户特征表示方法

1.用户行为记录作为显示特征:过去一段时间,用户对商品的偏好
2.显示的标签特征:标的物是由很多标签表示的,这些标签又可以表征这些标的物,用户画像也可以基于用户对标的物打上对应的标签
3.向量式的兴趣特征:基于标的物的信息,将标的物嵌入到向量当中,利用向量来表示标的物,有了标的物的向量化之后,用户的兴趣向量就可以用其他操作过的标的物的向量的平均向量来表示,所有的标的物的向量化之后,用户的兴趣向量能够表示出来
4.通过交互方式获取用户兴趣标签:很多APP在注册的时候让用户选择自己的用户标签,一旦用户选择了自己的兴趣标签,就为推荐系统提供了推荐的原材料,具体是与向量的兴趣特征类似,计算对标的物的偏好程度,根据偏好度去进行推荐
5.用户的人口统计学特征:用户在注册或登录平台的时候提供了相关的信息,通过运营用户填写的信息,利用算法推断出一些结论,用户年龄,性别,地域输入,爱好,居住地等,计算用户之间的相似度,从而对用户做推荐

商品特征表示

四大表示方法

1.标签信息:标的物可以用隐式向量、显式标签表示,标的物可以看做多维向量,利用one-hot编码来描述标的物的信息
2.结构化信息:变成向量化,然后将商品特征进行表示
3.包含文本信息的标的物的特征表示:将文本中的信息进行向量化,提取一些关键字、关键词、主题等(TFIDF、IDA),然后计算文本的相似程度(Doc2vec、word2vec)
4.包含图片、音频、或者视频信息的特征表示:利用包含文本的信息进行特征表示,利用图像、音频等领域的技术将特征进行提取

相似度衡量

1.余弦相似度
2.喜好度
3.最近邻方法
4.聚类

余弦相似度

cos ⁡ ( θ ) = A ∗ B ∥ A ∥ ∗ ∥ B ∥ = ∑ i = 1 n A i ∗ B i ∑ i = 1 n ( A i ) 2 ∑ i = 1 n ( B i ) 2 \cos (\theta)=\frac{A^{*} B}{\|A\|^{*}\|B\|}=\frac{\sum_{i=1}^{n} A_{i}{*} B_{i}}{\sqrt{\sum_{i=1}^{n}\left(A_{i}\right)^{2}} \sqrt{\sum_{i=1}^{n}\left(B_{i}\right)^{2}}} cos(θ)=ABAB=i=1n(Ai)2 i=1n(Bi)2 i=1nAiBi

应用场景:
完全个性化推荐、主题推荐、配合其他推荐算法、给用户推荐标签

优缺点分析

优点

可以很好的识别用户的口味
非常直观易懂,可解释性强
可以更加容易的解决冷启动
算法实现相对简单
对于小众领域也能有比较好的推荐效果
非常适合标的物快速增长的有时效性要求的产品

缺点

推荐范围狭窄,新颖性不强
流程复杂、耗时长
较难将长尾标的物分发出去
推荐进准度不太高

import pandas as pd

md = pd. read_csv('./data/movies_metadata.csv')
md.head()

links_small = pd.read_csv('./data/links_small.csv')
links_small = links_small[links_small['tmdbId'].notnull()]['tmdbId'].astype('int')

md = md.drop([19730, 29503, 35587])

md['id'] = md['id'].astype('int')

smd = md[md['id'].isin(links_small)]
smd.shape

smd['tagline'] = smd['tagline'].fillna('')
smd['description'] = smd['overview'] + smd['tagline']
smd['description'] = smd['description'].fillna('')


# 词的向量化
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
# 余弦相似度
from sklearn.metrics.pairwise import linear_kernel, cosine_similarity

# 去停用词
tf = TfidfVectorizer(analyzer='word',ngram_range=(1, 2),min_df=0, stop_words='english')
tfidf_matrix = tf.fit_transform(smd['description'])
# 向量化之后的数据大小
tfidf_matrix.shape

# 建立混淆矩阵 并计算余弦相似度
cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)
cosine_sim[0]

smd = smd.reset_index()
titles = smd['title']
indices = pd.Series(smd.index, index=smd['title'])

def get_recommendations(title):
    idx = indices[title]
    sim_scores = list(enumerate(cosine_sim[idx]))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    sim_scores = sim_scores[1:31]
    movie_indices = [i[0] for i in sim_scores]
    return titles.iloc[movie_indices]

get_recommendations('The Godfather').head(10)

get_recommendations('The Dark Knight').head(10)

你可能感兴趣的:(机器学习实战,python,机器学习,人工智能,推荐系统)