【数据挖掘】推荐系统(一):协同过滤

 一、说明

        推荐系统是一种计算机程序或算法,用于预测用户对特定项目的兴趣度,并根据这些预测向用户提供个性化推荐。这种系统通常使用大量数据来分析用户的行为和偏好,以找出潜在的喜好和兴趣。推荐系统可以应用于电子商务、社交媒体、影视娱乐等领域,帮助提高用户体验、增加销售和粘性。

二、什么是推荐系统

        推荐引擎是机器学习的一个子类,通常处理对产品/用户进行排名或评级。松散地定义,推荐系统是预测用户可能对特定项目给出的评级的系统。然后,这些预测将被排名并返回给用户。

        它们被各种大牌公司使用,如谷歌,Instagram,Spotify,亚马逊,Reddit,Netflix等。通常是为了增加与用户和平台的互动。例如,Spotify 会推荐与您反复听或喜欢的歌曲相似的歌曲,以便您可以继续使用他们的平台听音乐。亚马逊使用推荐功能,根据用户为该用户收集的数据向各种用户推荐商品。

        推荐系统通常被视为“黑匣子”,这些大公司创建的模型不太容易解释。生成的结果通常是对用户需要/想要的东西的建议,但在向他们推荐之前,他们不知道他们需要/想要它。

        构建推荐系统有许多不同的方法,有些使用算法和公式化方法,如页面排名,而另一些则使用更多以建模为中心的方法,如协同过滤、基于内容、链接预测等。所有这些方法的复杂性各不相同,但复杂性并不能转化为“良好”的性能。通常,简单的解决方案和实施会产生最强的结果。例如,像Reddit,Hacker News和Google这样的大公司已经使用推荐引擎的简单公式化实现来推广其平台上的内容。在本文中,我将提供推荐系统体系结构的直观和技术概述,以及在示例生成的数据集上实现几种不同变体。

三、什么是好的推荐?

        确定什么是好的推荐本身就是许多公司都在努力解决的问题。“良好”建议的这种定义有助于评估您构建的推荐器的性能。建议的质量可以通过衡量覆盖范围和准确性的各种策略来评估。准确性是正确建议占所有可能建议的比例,而覆盖范围衡量系统能够提供建议的搜索空间中对象的比例。评估建议的方法完全取决于用于生成建议的数据集和方法。推荐系统与分类和回归建模问题在概念上有几个相似之处。在理想情况下,您可能希望了解真实用户对建议的反应,并跟踪用户周围的指标以改进您的推荐,但是,这很难实现。评估推荐者准确性的常见统计准确性度量是 RMSD、MAE 和 k 折交叉验证。

3.1 K 折叠交叉验证

  • 假设您已经构建了一个模型,该模型将根据一组特征预测用户对项目的评分。K折交叉验证可用于通过准确性指标推断模型的结果
  • 与训练测试拆分的想法相同,除了我们创建 K 许多随机分配的训练和测试集
  • 每个单独的训练集/折叠用于独立地在推荐系统上进行训练,然后根据测试集测量结果系统的准确性
  • 我们取准确率分数的平均值,以了解推荐系统的学习情况
  • 此方法有助于防止模型过度拟合,但这是一个计算量很大的过程

MAE(平均绝对误差)

图片取自统计操作方法

  • 表示评级预测中每个误差的平均绝对值
  • MAE 分数越低越好

RMSD(均方根偏差)

图片取自统计操作方法

  • 与 MAE 类似的指标,但当预测离真实值很远时,惩罚更强,当预测更接近真实值时,惩罚较弱
  • 去掉真值和预测值之差的平方,而不是绝对值的总和。这可确保结果值始终为正,并且在差值高时较大,在差值低时较小。
  • RMSD 分数越低越好

        这些指标通常用于评估建议的质量,但它们缺少各种组件。将用户数据与推荐相关联对于了解推荐的真实质量至关重要。能够跟踪推荐的命中率、对平台的参与度、响应能力等。将提供更清晰的推荐质量观点。其他需要注意的组件是,当用户在 X 时间内未与推荐互动时,了解何时更改推荐,或者何时根据用户的新评分或交互重新训练推荐人。您还需要注意这些建议是否将用户限制在产品的某个子部分,推荐者如何处理新颖性、多样性和选择偏见。A / B测试通常是用于跟踪这些指标的方法(查看我关于贝叶斯和频率A / B测试的文章)。

3.2 数据

        在下面的部分中,我们将更深入地介绍在 Python 中创建推荐引擎和相关实现的不同方法。本节将提供一个脚本,该脚本将合成与书籍关联的数据集。该数据集将用于以下各节中推荐系统的应用,本文的目标不是获得有意义的结果,而是向用户展示各种类型的推荐引擎背后的直觉和实现。因此,这些建议的结果将毫无意义,但方法将与工业生产级环境中的方法相似。

要求

  • python = 3.8.8
  • pandas = 1.2.4

3.3 相关代码 

import pandas as pd
from random import randintdef generate_data(n_books = 3000, n_genres = 10, n_authors = 450, n_publishers = 50, n_readers = 30000, dataset_size = 100000):'''This function will generate a dataset with features associated tobook data set. The dataset will have the following columns : - book_id (String) : Unique identified for the book- book_rating (Integer) : A value between 0 and 10- reader_id (String) : Unique identifier for the user- book_genre (Integer) : An integer representing a genre for the book, value is between 1 and 15, indicating that there are 15 unique genres. Each book can onlyhave 1 genre- author_id (String) : Unique identifier for the author of the book- num_pages (Integer) : Random value between 70 and 500- publisher_id (String) : A unique identifier for the publisher of the book- publish_year (Integer) : The year of book publishing- book_price (Integer) : The sale price of the book- text_lang (Integer) : The language of the book - returns an integer which is mapped to some languageparams:n_books (Integer) : The number of books you want the dataset to haven_genres (Integer) : Number of genres to be chosen fromn_authors (Integer) : Number of authors to be generatedn_publishers (Integer) : Number of publishers for the datasetn_readers (Integer) : Number of readers for the datasetdataset_size (Integer) : The number of rows to be generated example:data = generate_data()'''d = pd.DataFrame({'book_id' : [randint(1, n_books) for _ in range(dataset_size)],'author_id' : [randint(1, n_authors) for _ in range(dataset_size)],'book_genre' : [randint(1, n_genres) for _ in range(dataset_size)],'reader_id' : [randint(1, n_readers) for _ in range(dataset_size)],'num_pages' : [randint(75, 700) for _ in range(dataset_size)],'book_rating' : [randint(1, 10) for _ in range(dataset_size)],'publisher_id' : [randint(1, n_publishers) for _ in range(dataset_size)],'publish_year' : [randint(2000, 2021) for _ in range(dataset_size)],'book_price' : [randint(1, 200) for _ in range(dataset_size)],'text_lang' : [randint(1,7) for _ in range(dataset_size)]}).drop_duplicates()return dd = generate_data(dataset_size = 100000)
d.to_csv('data.csv', index = False)

四、协同过滤系统

4.1 基于直觉

        协同过滤是通过识别来自许多用户的偏好和信息来预测用户兴趣的过程。这是通过使用涉及多个代理、数据源等之间协作的技术过滤数据以获取信息或模式来完成的。协同过滤背后的潜在直觉是,如果用户A和B在产品中具有相似的品味,那么A和B在其他产品中也可能具有相似的品味。

协同过滤中有两种常见的方法,基于内存的方法和基于模型的方法。

  1. 基于内存的方法 - 通常也称为邻域协同过滤。从本质上讲,用户-项目组合的评级是根据其邻域预测的。这可以进一步分为基于用户的协同过滤和基于项目的协同过滤。基于用户本质上意味着志同道合的用户将产生强烈而相似的建议。基于项目的协同筛选根据使用项目的用户评分计算的项目之间的相似性来推荐项目。
  2. 基于模型的方法 — 是使用机器学习的预测模型。与数据集关联的特征被参数化为模型的输入,以尝试解决与优化相关的问题。基于模型的方法包括使用决策树、基于规则的方法、潜在因素模型等。

4.2 优缺点

4.2.1 优势

        使用协同过滤模型的主要优点是其易于实现和它们提供的高级别覆盖率。它也是有益的,因为它捕获了微妙的特征(对于潜在因子模型来说非常正确),并且不需要理解项目内容。

4.2.2 弊端

        此模型的主要缺点是它对推荐新项目不友好,这是因为没有用户/项目与之交互。这称为冷启动问题。众所周知,基于内存的算法在高度稀疏的数据集上表现不佳。

4.3  协同过滤例子

        协同过滤算法的一些例子:

  • 向用户推荐 YouTube 内容 — 根据与您订阅/观看过类似视频的其他用户向您推荐视频。
  • CourseEra 课程推荐 — 根据已完成现有课程的其他人向您推荐课程。

4.3.1  实现

  1. 从generate_data功能(上面提供的功能)导入数据或从此处下载CSV
  2. 生成一个数据透视表,索引上有读者,列上有书籍,值是评级
  3. 使用 svds 计算项目和用户之间的相似性
  4. 根据user_id生成项目建议
import pandas as pd
import numpy as npfrom scipy.sparse import csr_matrix
from scipy.sparse.linalg import svdsdef normalize(pred_ratings):'''This function will normalize the input pred_ratingsparams:pred_ratings (List -> List) : The prediction ratings '''return (pred_ratings - pred_ratings.min()) / (pred_ratings.max() - pred_ratings.min())def generate_prediction_df(mat, pt_df, n_factors):'''This function will calculate the single value decomposition of the input matrixgiven n_factors. It will then generate and normalize the user rating predictions.params:mat (CSR Matrix) : scipy csr matrix corresponding to the pivot table (pt_df)pt_df (DataFrame) : pandas dataframe which is a pivot tablen_factors (Integer) : Number of singular values and vectors to compute. Must be 1 <= n_factors < min(mat.shape). '''if not 1 <= n_factors < min(mat.shape):raise ValueError("Must be 1 <= n_factors < min(mat.shape)")# matrix factorizationu, s, v = svds(mat, k = n_factors)s = np.diag(s)# calculate pred ratingspred_ratings = np.dot(np.dot(u, s), v) pred_ratings = normalize(pred_ratings)# convert to dfpred_df = pd.DataFrame(pred_ratings,columns = pt_df.columns,index = list(pt_df.index)).transpose()return pred_dfdef recommend_items(pred_df, usr_id, n_recs):'''Given a usr_id and pred_df this function will recommenditems to the user.params:pred_df (DataFrame) : generated from `generate_prediction_df` functionusr_id (Integer) : The user you wish to get item recommendations forn_recs (Integer) : The number of recommendations you want for this user'''usr_pred = pred_df[usr_id].sort_values(ascending = False).reset_index().rename(columns = {usr_id : 'sim'})rec_df = usr_pred.sort_values(by = 'sim', ascending = False).head(n_recs)return rec_dfif __name__ == '__main__':# constantsPATH = '../data/data.csv'# import datadf = pd.read_csv(PATH)print(df.shape)# generate a pivot table with readers on the index and books on the column and values being the ratingspt_df = df.pivot_table(columns = 'book_id',index = 'reader_id',values = 'book_rating').fillna(0)# convert to a csr matrixmat = pt_df.valuesmat = csr_matrix(mat)pred_df = generate_prediction_df(mat, pt_df, 10)# generate recommendationsprint(recommend_items(pred_df, 5, 5))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/12831.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【我的创作纪念日】关于某站的音频爬虫+GUI

文章目录 一、前言&机遇二、爬虫代码三、爬虫GUI四、文件打包五、结果展示未来可期 一、前言&机遇 许久没看私信内容&#xff0c;一上线就看到了官方的私信&#xff0c;我已经来到CSDN1024天啦&#xff01; 想到注册这个号的初衷是学习记录爬虫&#xff0c;后面渐渐变…

LSTM介绍

LSTM ft表示 遗忘门。LSTM对于每一次的输入,首先决定遗忘掉之前的哪些记忆。将ft和t-1时刻的细胞状态相乘,得出将遗忘哪些记忆。 记忆门 是用来控制是否将t时刻的数据并入细胞状态。tanh函数可以将此刻向量中的有效信息提取出来,为gt。sigmoid函数用于控制此刻多少记忆进入…

比ping还好用的排障命令

遇到网络故障的时候&#xff0c;你一般会最先使用哪条命令进行排障&#xff1f; 除了Ping&#xff0c;还有Traceroute、Show、Telnet又或是Clear、Debug等等。 今天安排的&#xff0c;是Traceroute排障命令详解&#xff0c;给你分享2个经典排障案例哈。 01 Traceroute原理和功…

Hive 复习重点

文章目录 特点SQL查询转换成MR作业的过程内部表 & 外部表 & 分区表 & 分桶表内部表外部表分区表 分桶表DQL语法性能优化SQL语句优化数据格式化 ORC, Parquet列式存储小文件过多优化并行执行优化JVM 优化推测执行行列过滤limit 限制本地模式(开启MR&#xff0c;单机…

简单分享下怎么创建一个微信小程序

怎么创建一个微信小程序?三招教你这样做!!微信小程序不会做没关系,看我这篇文章就够啦!!实现0基础到大神的瞬间飞跃不是梦!! 戳下方链接即可直达官网&#xff0c;上千种行业精美模板任君挑选&#xff0c;快一起来试试吧&#xff01;让小程序制作不再困难&#xff01;上千个行业…

win系统删除oracle数据文件恢复---惜分飞

有客户联系我们,说win平台下的数据库,在由于空间紧张,在关闭数据库的情况下删除的两个数据文件,导致数据库无法正常访问很多业务表,需要对其进行恢复,查看alert日志发现大概操作,删除文件之后,启动数据库失败 Completed: alter database mount exclusive alter database open E…

库表实验操作

目录 1、创建数据库Market&#xff0c;在 Market中创建数据表customers。​编辑 2、在Market中创建数据表orders。 3、创建数据库Team&#xff0c;定义数据表player。 1、创建数据库Market&#xff0c;在 Market中创建数据表customers。 &#xff08;1&#xff09;mysql>…

【在线文件管理】响应式文件管理AngularJS

目录 1.功能展示截图 2.实现代码 2.1HTML页面代码 2.2后台代码 2.2.1项目结构 2.2.2项目代码 其他问题 1.功能展示截图 项目中需要用到文件管理来自由控制文件的上传、下载、删除等&#xff0c;就想到做一个简单的在线文件管理功能。 支持在线编辑&#xff1a; 2.实现代…

Vue组件库Element-常见组件-Form表单

Form表单 Form 表单&#xff1a;由输入框、选择器、单选框、多选框等控件组成&#xff0c;用以收集、检验、提交数据 具体关键代码如下&#xff1a; <template><div><el-row><!-- button 按钮 --><el-button>默认按钮</el-button><e…

基于JavaSpringBoot+Vue+uniapp微信小程序实现鲜花商城购物系统

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Array.from详解

德玛玩前端 2023-07-07 在以往的开发中&#xff0c;对于Array.from的了解是from是Array的静态方法&#xff0c;可以将类数组和迭代对象转换为数组&#xff0c;可以结合Set集合快速实现数组的去重&#xff0c;一直以为Array,from()只有一个参数&#xff0c;不是传类数组就是可迭…

JavaWeb 速通HTML

目录 一、拾枝杂谈 1.网页组成 : 1 结构 2 表现 3 行为 2.HTML入门 : 1 基本介绍 2.基本结构 : 3.HTML标签 : 1 基本说明 2 注意事项 二、常用标签汇总及演示 1.font标签 : 1 定义 2 演示 2.字符实体 : 1 定义 2 演示 3.标题标签 : 1 定义 2 演示 4. 超链接标签 : 1…