python机器学习项目 4:推荐系统(23)

作者 : 慕源网 本文共6548个字,预计阅读时间需要17分钟 发布时间: 2021-10-23 共267人阅读

python机器学习项目 4:推荐系统(23)

本文是Python 机器学习系列的一部分。您可以在此处找到本系列之前所有帖子的链接

介绍

本章演示了一个使用机器学习算法的推荐系统。

推荐系统

当谈到数据科学或机器学习时,我们首先想到的是预测、推荐系统或类似的东西。实际上,现在推荐系统非常普遍。如果我们谈论一些最流行的网站,例如 Amazon、eBay,并且不要忘记 Facebook,您会看到这些推荐系统正在发挥作用。您肯定会遇到带有“您可能感兴趣”、“您可能认识此人”或“人们也搜索过”之类的标签的内容。所以我决定看看事情是如何运作的,我在这里。我们将讨论一些基本和常见的推荐系统类型及其工作原理,并将使用 Python 开发它们。需要注意的一件事;这些系统与质量、复杂性、

环境设置

Ipython notebook 或现在称为 Jupyter notebook 是最常用的科学计算技术之一。使用它的主要原因是因为它擅长文字编程。换句话说,它有能力重新运行程序的一部分而不是运行整个程序,这在处理大型数据集时很方便。获得 Jupyter Notebook 应用程序的最简单方法是安装科学的 Python 发行版;其中最常见的是Anaconda。您可以从https://www.anaconda.com/download/下载 Anaconda 发行版,只需使用单个用户的默认设置进行安装。

我们的环境现在都已经设置好了,所以让我们实际做一些事情。创建一个名为 Book Recommendation System 的新文件夹(我这样命名是因为我们要构建一个书籍推荐系统,但您可以将其命名为任何名称。)现在启动 Anaconda 命令提示符并通过输入以下命令来启动一个新notebook 。

$ jupyter notebook   

您应该会看到以下屏幕。

python机器学习项目 4:推荐系统(23)

它所做的是在我们提到的文件夹中创建一个空notebook ,并且还将启动一个基于 Web 的交互环境供您工作。您可以轻松地在浏览器中重命名文件。现在让我们谈谈一些常用的推荐系统并看看实际情况。

基于人气的推荐系统

这是最基本的推荐系统,它根据流行度向每个用户提供广义推荐。但即使如此简单,它也确实有意义。让我们以冰淇淋店的场景为例。其他每位顾客都订购巧克力口味,因此确实在顾客中更受欢迎,并且是那家冰淇淋店的热门产品。所以如果一个新顾客走进来并要求最好的,他会得到一个尝试巧克力口味的建议。旅游景点、酒店推荐、电影、书籍、音乐等也是如此,凡是更受大众欢迎的,更可能被推荐给新客户。

如前所述,这种类型的推荐器会进行泛化推荐,而不是个性化推荐。这意味着该系统不会考虑“个人”偏好或选择,而是会告诉您大多数用户都喜欢这个特定的东西。

建立一个将阐明其背后的想法。让我们开始吧。

# In[1]:    
#importing libraries    
import pandas as pd    
import numpy as np   

Pandas 和 Numpy 是 Python 提供的两个强大的库,用于科学计算、数据操作和数据分析。麻木; 首先; 提供高性能、多维数组以及操作它的工具。而 Pandas 以其数据结构和操作数据的操作而闻名。

# In[2]:    
#reading the files         
data = pd.read_csv('listing.csv', encoding = 'latin-1')    
books = pd.read_csv('books.csv', encoding = 'latin-1')    
# In[3]:    
#use head() function to view first 5 rows for the object based on position. This is just to test if we have right data.    
data.head()  

python机器学习项目 4:推荐系统(23)

# In[4]:        
books.head()   

python机器学习项目 4:推荐系统(23)

# In[5]:    
# Getting recommendation based on No. Of ratings         
rating_count = pd.DataFrame(books, columns=['book_id','no_of_ratings'])    
# Sorting and dropping the duplicates    
rating_count.sort_values('no_of_ratings', ascending=False).drop_duplicates().head(10)  

python机器学习项目 4:推荐系统(23)

# In[6]:    
# getting the detail of 5 most rated books    
most_rated_books = pd.DataFrame([4755, 2409, 2194, 4696, 1616], index=np.arange(5), columns=['book_id'])    
detail = pd.merge(most_rated_books, data, on='book_id')    
detail   

python机器学习项目 4:推荐系统(23)您也可以仅获得评分最高的书籍,如下所示。

# In[7]:    
# getting the most rated book    
most_rated_book = pd.DataFrame(books, columns=['book_id', 'user_id', 'avg_rating', 'no_of_ratings'])    
most_rated_book.max()   

python机器学习项目 4:推荐系统(23)

# In[8]:    
#getting description for most rated book    
most_rated_book.describe()  

python机器学习项目 4:推荐系统(23)您还可以使用相同的函数获取任何列的描述。

# In[9]:    
# description for author    
    
data['author'].describe() 

python机器学习项目 4:推荐系统(23)

基于相关性的推荐器

由于这是一个更加“个性化”的时代,因此基于人气的推荐系统不足以满足需求。因此,存在基于相关性的推荐器,它会根据项目的相似性(我们正在谈论的评论相似性)做出推荐。它背后的基本思想是,如果你喜欢这个项目,你可能会喜欢一个与它相似的项目。基于相关性的推荐器是一种更简单的基于协同过滤的推荐器形式。他们会给你更多的个性化体验,因为他们会推荐与之前选择的项目最相似的项目。

我们将在我们的推荐系统中使用 Pearson 相关性。这个推荐系统将使用基于项目的相似性;根据用户评分关联项目。

# In[1]:    
# importing libraries    
        
import pandas as pd    
import numpy as np    
  
# In[2]:    
# reading files    
        
data = pd.read_csv('listing.csv', encoding = 'latin-1')    
books = pd.read_csv('books.csv', encoding = 'latin-1')    
  
# In[3]:    
# Checking the data using head function    
        
books.head()   

python机器学习项目 4:推荐系统(23)

# In[4]:    
# calculating the mean    
        
rating = pd.DataFrame(books.groupby('book_id')['no_of_ratings'].mean())    
rating.head()   

python机器学习项目 4:推荐系统(23)

# In[5]:    
# getting the description of rating    
    
rating.describe()  

python机器学习项目 4:推荐系统(23)

# In[6]:    
# sorting based on no of ratings that each book got    
        
rating.sort_values('no_of_ratings', ascending=False).head()   

python机器学习项目 4:推荐系统(23)

 # In[7]:    
# Preparing data table for analysis    
  
ratings_pivot = pd.pivot_table(data=books, values='user_rating', index='user_id', columns='book_id')    
        
ratings_pivot.head()   

python机器学习项目 4:推荐系统(23)由于我们有兴趣找到两个变量之间的相关性,为此,我们将使用 Pearson 相关性,它可以简单地测量线性相关性。在这种情况下,我们有兴趣根据用户评分了解两本书之间的关系。

# In[8]:    
        
correlation_matrix = user_rating.corr(method='pearson')    
correlation_matrix.head(10)   

python机器学习项目 4:推荐系统(23)如您所见,现在我们的表包含 Pearson 相关系数值。

# In[9]:     
# getting the users who rated this particular book (most rated) and making sure rating is not zero    
        
OneManOut_rating = ratings_pivot[4755]    
OneManOut_rating[OneManOut_rating>=0]   

python机器学习项目 4:推荐系统(23)现在让我们找到类似的书。

# In[10]:    
# finding similar books to One Man Out book using Pearson correlation    
        
similar_to_OneManOut = ratings_pivot.corrwith(OneManOut_rating)    
corr_OneManOut = pd.DataFrame(similar_to_OneManOut, columns=['PearsonR'])    
corr_OneManOut.dropna(inplace=True)    
corr_OneManOut.head()   

由于遇到被零除,您将遇到运行时警告。

python机器学习项目 4:推荐系统(23)但这不会妨碍我们,因此可以忽略它。我们仍然会得到如下输出。python机器学习项目 4:推荐系统(23)

# In[11]:    
    
OneManOut_corr_summary = corr_OneManOut.join(rating) 

python机器学习项目 4:推荐系统(23)

# In[12]:    
# getting the most similar book    
        
OneManOut_corr_summary.sort_values('PearsonR', ascending=False).head(10)    
  
Building Recommendation Systems In Python   
  
        
book_corr_OneManOut = pd.DataFrame([2629, 493, 4755, 4571, 2900, 1417, 2681, 1676, 2913, 1431], index = np.arange(10), columns=['book_id'])    
detail= pd.merge(book_corr_OneManOut, data,on='book_id')    
detail   

python机器学习项目 4:推荐系统(23)

现在,如果您在我们的数据集中看到评分最高的书 One Man Out: Curt Flood Versus Baseball 属于法律类型,但我们的推荐引擎给我们提供了混合推荐,包括 Travel、Law 等。这是因为我们使用的是评级之间的关系以提出我们的建议。这本书在我们的数据集中被评为 4 次,因此是我们推荐引擎推荐的第一本书。这意味着我们的推荐人正在工作。

基于内容的推荐器

存在另一种类型的推荐器,称为基于内容的推荐器。这种类型的推荐器使用项目的描述来推荐下一个最相似的项目。基于内容的推荐器也会进行“个性化”推荐。基于相关性的推荐和基于内容的推荐之间的主要区别在于,前者考虑的是“用户行为”,而后者考虑的是推荐内容。基于内容的推荐器使用描述中使用的产品特征或关键字来查找项目之间的相似性。让我们看看如何构建一个。

# In[1]:    
# importing libraries    
    
import pandas as pd    
from sklearn.metrics.pairwise import linear_kernel    
from sklearn.feature_extraction.text import TfidfVectorizer  

linear_kernelis 用于计算两个变量之间的线性内核。我们将使用这个函数而不是 cosine_similarities() 因为它更快,而且我们还使用了 TF-IDF 向量化,一个简单的点积会给我们相同的余弦相似度分数。现在,什么是 TF-IDF 向量?我们无法以数据集中的形式计算给定描述之间的相似性。这实际上是不可能的。为此,计算所有文档的词频-逆文档频率 (TF-IDF),这将简单地返回一个矩阵,其中每个单词代表一列。sklearn 的 TfidfVectorizer 会在几行中为我们完成这项工作。

# In[2]:    
# reading file    
        
book_description = pd.read_csv('description.csv', encoding = 'latin-1')    
  
# In[3]:    
# checking if we have the right data    
        
book_description.head()  

python机器学习项目 4:推荐系统(23)

# In[4]:    
# removing the stop words    
books_tfidf = TfidfVectorizer(stop_words='english')    
# filling the missing values with empty string    
book_description['description'] = book_description['description'].fillna('')    
# computing TF-IDF matrix required for calculating cosine similarity    
book_description_matrix = books_tfidf.fit_transform(book_description['description'])   

让我们检查计算矩阵的形状。

# In[5]:    
book_description_matrix.shape 

python机器学习项目 4:推荐系统(23)上面的形状意味着在我们的数据集中用 4186 个词来描述 143 本书。

# In[6]:    
# computing cosine similarity matrix using linear_kernal of sklearn    
        
cosine_similarity = linear_kernel(book_description_matrix, book_description_matrix) 
# In[7]:    
# Get the pairwise similarity scores of all books compared to the book passed by index, sorting them and getting top 5    
# here 2 is the index of the book in dataset    
        
similarity_scores = list(enumerate(cosine_similarity[2]))    
similarity_scores = sorted(similarity_scores, key=lambda x: x[1], reverse=True)    
similarity_scores = similarity_scores[1:6]    
  
# Get the similar books index    
books_index = [i[0] for i in similarity_scores]    
        
# printingthe top 5 most similar books using integer-location based indexing (iloc)    
print (book_description['name'].iloc[books_index])  

python机器学习项目 4:推荐系统(23)现在如果我们得到索引为 6 的书的推荐,

python机器学习项目 4:推荐系统(23)如果您注意到我们得到的结果;根据我们的推荐引擎,索引 2 的书与索引 6 的书相似。让我们按照描述进行操作,看看我们的推荐器是否有效。

根据 Goodreads;这是对“Angela’s Ashes”的简短描述

“当我回顾我的童年时,我想知道我是如何生存下来的。当然,这是一个悲惨的童年:快乐的童年几乎不值得你花时间。比普通的悲惨童年更糟糕的是爱尔兰的悲惨童年,而且更糟糕的是爱尔兰天主教徒悲惨的童年。”

而“Running with Scissors”是这样的,

“一个闻所未闻的亡命之徒童年的真实故事,圣诞树终年不灭,安定像糖果一样被消耗掉,如果事情变得沉闷,电击治疗机可以提供娱乐”。

这表明故事的概要之间有些相似。此外,这两本书都属于“传记与回忆录”类型。这表明我们的建议足够好,而且非常简单。

致读者

包含数据集和 Jupyter 笔记本的完整存储库也存在于 GitHub 上。你可以在这里下载。

结论

所以在本章中,您学习了如何构建推荐系统。


慕源网 » python机器学习项目 4:推荐系统(23)

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录