您当前的位置:首页 > 电脑百科 > 人工智能

如何用Python构建机器学习推荐系统?网易云、爱奇艺也用这种方法

时间:2020-08-07 09:57:39  来源:  作者:

本文将教大家用Python中基于模型的协同过滤构建推荐系统,这种推荐系统经常被用于音乐、视频网站等。

推荐系统广泛应用于音乐、电影、书籍、新闻、研究文章、餐馆等产品的推荐。

如何用Python构建机器学习推荐系统?网易云、爱奇艺也用这种方法

 

构建推荐系统有两种常用方法:

  • 协同过滤:https://en.wikipedia.org/wiki/Collaborative_filtering
  • 基于内容的筛选:https://developers.google.com/machine-learning/recommendation/content-based/basics

协同过滤方法通过从许多其他用户(协作)收集偏好信息来预测(过滤)用户对产品的兴趣。协同过滤方法背后的假设是,如果一个人 P1 和另一个人 P2 对某个问题有相同的意见,P1比随机选择的人更有可能分享P2对不同问题的意见。

基于内容的过滤方法利用产品特性/属性,根据其他用户之前的行为或对产品的评价等明确反馈,推荐与用户喜欢的产品相似的其他产品。

推荐系统可以使用这两种方法中的一种或两种。

在本文中,将使用 Kaggle Netflix prize 数据集来演示如何使用基于模型的协同过滤方法在 Python 中构建推荐系统。

本文其余部分安排如下:

  • 协同过滤概述
  • 用 Python 构建推荐系统
  • 总结

1、协同过滤概述

协同过滤背后的主要思想是,一个人经常从另一个兴趣相似的人那里得到最佳推荐。协同过滤使用各种技术来匹配兴趣相似的人,并基于共同的兴趣给出推荐。

协同过滤系统的高级工作流程如下:

  • 用户对项目(如电影、书籍)进行评分,以表达他或她对项目的偏好;
  • 系统将评分视为用户对项目兴趣的程度;
  • 系统会将此用户的评分与其他用户的评分进行匹配,并找到具有最相似评分的人;
  • 系统推荐相似用户评分较高但尚未被该用户评分的项目。

通常,协同过滤系统通过两个步骤向给定用户推荐产品:

  • 第1步:寻找与给定用户共享相同评级模式的人;
  • 第2步:使用步骤1中找到的用户的评分来计算给定用户对产品的评分预测。

这称为基于用户的协作过滤。这种方法的一个具体实现是基于用户的最近邻算法。

另一种选择是,基于项目的协同过滤(例如,对x感兴趣的用户也对y感兴趣)以项目为中心的方式工作:

  • 第1步:建立一个项目--项目矩阵的评分关系对项目;
  • 第2步:通过检查矩阵并匹配用户的评分数据,预测当前用户对产品的评分。

有两种类型的协同过滤系统:

在一个基于模型的系统中,我们使用不同的机器学习算法开发模型来预测用户对未评分项目的评分。基于模型的协同过滤算法有很多,如奇异值分解(SVD)、贝叶斯网络、聚类模型等。

基于内存的系统使用用户的评分数据来计算用户或项目之间的相似度。这类系统的典型例子是基于邻域的方法和基于项/基于用户的 top-N 建议。

本文介绍了如何利用 SVD 模型构建一个基于模型的协同过滤系统。

2、用Python构建推荐系统

下面,将给大家详细介绍用 Python 构建推荐系统的流程。

2.1 安装库

有多个Python库可用于构建推荐系统(例如 Python scikit Surprise、基于Spark RDD的协同过滤API)。我在本文中使用 Python scikit Surprise 库进行演示。

可以按如下方式安装库:

pip install scikit-surprise

2.2 加载数据

如前所述,我在本文中使用Kaggle Netflix prize数据集。有可用于不同目的的多个数据文件。本文中使用了以下数据文件:

训练数据:

  • Combined_data_1.txt
  • Combined_data_2.txt
  • Combined_data_3.txt
  • Combined_data_4.txt

电影标题数据文件:

  • movie_titles.csv

由于训练数据集太大,无法在笔记本电脑上处理。 因此,为了方便演示,我仅从每个训练数据文件中加载前 100,000 条记录。

将训练数据文件下载到本地计算机上之后,可以将每个训练数据文件中的前 100,000 条记录作为Pandas 数据帧加载到内存中,如下所示:

def readFile(file_path, rows=100000):
    data_dict = {'Cust_Id' : [], 'Movie_Id' : [], 'Rating' : [], 'Date' : []}
    f = open(file_path, "r")
    count = 0
    for line in f:
        count += 1
        if count > rows:
            break
            
        if ':' in line:
            movidId = line[:-2] # remove the last character ':'
            movieId = int(movidId)
        else:
            customerID, rating, date = line.split(',')
            data_dict['Cust_Id'].Append(customerID)
            data_dict['Movie_Id'].append(movieId)
            data_dict['Rating'].append(rating)
            data_dict['Date'].append(date.rstrip("n"))
    f.close()
            
    return pd.DataFrame(data_dict)
df1 = readFile('./data/netflix/combined_data_1.txt', rows=100000)
df2 = readFile('./data/netflix/combined_data_2.txt', rows=100000)
df3 = readFile('./data/netflix/combined_data_3.txt', rows=100000)
df4 = readFile('./data/netflix/combined_data_4.txt', rows=100000)
df1['Rating'] = df1['Rating'].astype(float)
df2['Rating'] = df2['Rating'].astype(float)
df3['Rating'] = df3['Rating'].astype(float)
df4['Rating'] = df4['Rating'].astype(float)

针对训练数据的不同部分所产生的不同数据帧如下组合:

df = df1.copy()
df = df.append(df2)
df = df.append(df3)
df = df.append(df4)
df.index = np.arange(0,len(df))
df.head(10)
如何用Python构建机器学习推荐系统?网易云、爱奇艺也用这种方法

 

接下来我们来把 movie-titles 文件可以作为 Pandas 数据帧加载到内存中:

df_title = pd.read_csv('./data/netflix/movie_titles.csv', encoding = "ISO-8859-1", header = None, names = ['Movie_Id', 'Year', 'Name'])
df_title.head(10)
如何用Python构建机器学习推荐系统?网易云、爱奇艺也用这种方法

 

2.3 训练评估模型

Surprise中的数据集模块提供了从文件、Pandas 数据帧或内置数据集(如ml-100k(MovieLens 100k)加载数据的各种不同方法,例如:

  • Dataset.load_builtin()
  • Dataset.load_from_file()
  • Dataset.load_from_df()

在本文中,我使用 load_from_df()方法从 Pandas 数据帧加载数据。

Surprise中的 Reader 类用于解析包含用户、项目和用户对项目的评分文件。默认格式是每个评分存储在订单用户项目评分的单独一行中。此顺序和分隔符可使用以下参数进行配置:

  • line_format 是类似于“ item user rating”的字符串,用于指示字段名称用空格分隔的数据顺序;
  • sep 用于指定字段之间的分隔符,例如空格,“,”等;
  • rating_scale 用于指定评分等级。默认值为(1,5);
  • skip_lines 用于指示文件开头要跳过的行数,默认值为 0。

本文将使用默认设置,项、用户、等级分别对应于数据帧中的 Cust_Id,Movie_Id 和 Rating 列。

Surprise 库包含了构建推荐系统的多个模型/算法的实现,如 SVD、概率矩阵分解(PMF)、非负矩阵分解(NMF)等,本文使用的是 SVD 模型。

下面的代码是从 Pandas 数据帧中加载数据并创建一个 SVD 模型实例:

from surprise import Reader, Dataset, SVD
from surprise.model_selection.validation import cross_validate
reader = Reader()
data = Dataset.load_from_df(df[['Cust_Id', 'Movie_Id', 'Rating']], reader)
svd = SVD()

产品推荐的数据和模型准备好后,可以使用交叉验证对模型进行评估,如下所示:

# 运行5倍交叉验证并打印结果
cross_validate(svd, data, measures=['RMSE', 'MAE'], cv=5, verbose=True)

以下是 SVD 模型交叉验证的结果:

如何用Python构建机器学习推荐系统?网易云、爱奇艺也用这种方法

 

一旦模型被评估到我们满意的程度,我们就可以使用整个训练数据集重新训练模型:

trainset = data.build_full_trainset()
svd.fit(trainset)

2.4 推荐产品

当推荐模型经过适当的训练后,就可以用来进行预测。

例如,给定一个用户(例如,客户Id 785314),我们可以使用经过训练的模型来预测用户对不同产品(即 Movie titles)的评级:

titles = df_title.copy()
titles['Estimate_Score'] = titles['Movie_Id'].apply(lambda x: svd.predict(785314, x).est)

为了向给定用户推荐产品(即电影),我们可以按预测收视率的降序对电影列表进行排序,并将前N部电影作为推荐:

titles = titles.sort_values(by=['Estimate_Score'], ascending=False)
titles.head(10)

以下是向客户 Id 为 785314 的用户推荐的前 10 部电影:

如何用Python构建机器学习推荐系统?网易云、爱奇艺也用这种方法

 

3、总结

在本文中,我使用了 scikit Surprise 库和 Kaggle Netflix prize 数据集来演示如何使用基于模型的协作过滤方法在 Python 中构建推荐系统。

如本文开头所述,数据集太大,无法在笔记本电脑或任何传统的个人计算机上处理。 因此,出于演示目的,我仅从每个训练数据集文件中加载了前 100,000 条记录。

在实际应用程序的设置中,我建议将 Spark 与 Koalas 一起使用,或者在 Spark MLLib 中使用Alteraternating Least Squares(ALS)算法来实现协作过滤系统并在 Spark 集群上运行。

Github 源代码及项目地址:https://github.com/yzzhang/machine-learning/tree/master/recommender

--END--

本文作者张跃峰博士,原文链接:https://towardsdatascience.com/machine-learning-for-building-recommender-system-in-python-9e4922dd7e97

翻译:未艾信息(www.weainfo.net)

喜欢本文的同学记得转发+点赞~

更多内容,欢迎大家关注我们的公众号:为AI呐喊(weainahan)



Tags:Python 机器学习   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
本文将教大家用Python中基于模型的协同过滤构建推荐系统,这种推荐系统经常被用于音乐、视频网站等。推荐系统广泛应用于音乐、电影、书籍、新闻、研究文章、餐馆等产品的推荐...【详细内容】
2020-08-07  Tags: Python 机器学习  点击:(93)  评论:(0)  加入收藏
▌简易百科推荐
作为数据科学家或机器学习从业者,将可解释性集成到机器学习模型中可以帮助决策者和其他利益相关者有更多的可见性并可以让他们理解模型输出决策的解释。在本文中,我将介绍两个...【详细内容】
2021-12-17  deephub    Tags:AI   点击:(15)  评论:(0)  加入收藏
基于算法的业务或者说AI的应用在这几年发展得很快。但是,在实际应用的场景中,我们经常会遇到一些非常奇怪的偏差现象。例如,Facebook将黑人标记为灵长类动物、城市图像识别系统...【详细内容】
2021-11-08  数据学习DataLearner    Tags:机器学习   点击:(32)  评论:(0)  加入收藏
11月2日召开的世界顶尖科学家数字未来论坛上,2013年诺贝尔化学奖得主迈克尔·莱维特、2014年诺贝尔生理学或医学奖得主爱德华·莫索尔、2007年图灵奖得主约瑟夫·斯发斯基、1986年图灵奖得主约翰·霍普克罗夫特、2002...【详细内容】
2021-11-03  张淑贤  证券时报  Tags:人工智能   点击:(39)  评论:(0)  加入收藏
鉴于物联网设备广泛部署、5G快速无线技术闪亮登场,把计算、存储和分析放在靠近数据生成的地方来处理,让边缘计算有了用武之地。 边缘计算正在改变全球数百万个设备处理和传输...【详细内容】
2021-10-26    计算机世界  Tags:边缘计算   点击:(45)  评论:(0)  加入收藏
这是几位机器学习权威专家汇总的725个机器学习术语表,非常全面了,值得收藏! 英文术语 中文翻译 0-1 Loss Function 0-1损失函数 Accept-Reject Samplin...【详细内容】
2021-10-21  Python部落    Tags:机器学习   点击:(43)  评论:(0)  加入收藏
要开始为开源项目做贡献,有一些先决条件:1. 学习一门编程语言:由于在开源贡献中你需要编写代码才能参与开发,你需要学习任意一门编程语言。根据项目的需要,在后期学习另一种语言...【详细内容】
2021-10-20  TSINGSEE青犀视频    Tags:机器学习   点击:(37)  评论:(0)  加入收藏
SimpleAI.人工智能、机器学习、深度学习还是遥不可及?来这里看看吧~ 从基本的概念、原理、公式,到用生动形象的例子去理解,到动手做实验去感知,到著名案例的学习,到用所学来实现...【详细内容】
2021-10-19  憨昊昊    Tags:神经网络   点击:(47)  评论:(0)  加入收藏
语言是人类思维的基础,当计算机具备了处理自然语言的能力,才具有真正智能的想象。自然语言处理(Natural Language Processing, NLP)作为人工智能(Artificial Intelligence, AI)的核心技术之一,是用计算机来处理、理解以及运...【详细内容】
2021-10-11    36氪  Tags:NLP   点击:(48)  评论:(0)  加入收藏
边缘计算是什么?近年来,物联网设备数量呈线性增长趋势。根据艾瑞测算, 2020年,中国物联网设备的数量达74亿,预计2025年突破150亿个。同时,设备本身也变得越来越智能化,AI与互联网在...【详细内容】
2021-09-22  汉智兴科技    Tags:   点击:(54)  评论:(0)  加入收藏
说起人工智能,大家总把它和科幻电影中的机器人联系起来,而实际上这些科幻场景与现如今的人工智能没什么太大关系。人工智能确实跟人类大脑很相似,但它们的显著差异在于人工智能...【详细内容】
2021-09-17  异步社区    Tags:人工智能   点击:(57)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条