推荐系统是一种软件系统,它根据用户偏好提供特定建议,帮助用户做出决策。这些建议可以是电影、音乐、新闻、旅游套餐、电商产品等。推荐系统的发展源于人们在日常生活中依赖他人做出常规决策的普遍观念。互联网上信息量的爆炸式增长促进了推荐系统的开发,从而增加了用户的利益和利润。
推荐系统可以分为三大类:
这类系统根据用户之间的相似性计算或用户过去喜欢的项目之间的相似性来推荐项目。协同过滤可以进一步分为两类:
用户基础的协同过滤:推荐系统通过计算某些相似性度量来找出与目标用户相似的用户,然后根据相似用户的偏好向目标用户推荐项目。在这里,相似性计算是一个重要任务。
基于项目的协同过滤:推荐系统根据用户过去的偏好找出项目,然后向用户推荐相似的项目。这些项目可能会引起用户的兴趣。
系统侧重于向用户推荐的项目属性。例如,如果一个YouTube用户观看了喜剧视频,那么系统将向他推荐喜剧类型的视频。同样,如果一个Netflix用户观看了特定导演的电影,那么系统将向他推荐那些电影。
这些系统是协同和基于内容的系统的结合。
步骤1:读取数据集。
import pandas as pd
data = pd.read_csv(r"C:UsersDellDesktopDatasetdataset.csv")
data.head()
关于数据集:它包括了注册高中的学生数据,包括他们的ID、专业、最喜欢的科目和在12年级获得的分数。它还包括了他们在大学毕业时所追求的课程和专业的成绩列。希望根据他们的分数、专业和最喜欢的科目向学生推荐课程。
现在将构建一个基于内容的推荐系统,根据他们的基本信息向学生推荐课程。
步骤2:创建数据集中每个学生的综合描述。
descriptions = data['gender'] + ' ' + data['subject'] + ' ' + data['stream'] + ' ' + data['marks'].apply(str)
打印第一个描述:
descriptions[0]
步骤3:创建学生之间的相似性矩阵。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel
def create_similarity_matrix(new_description, overall_descriptions):
# Append the new description to the overall set.
overall_descriptions.append(new_description)
# Define a tfidf vectorizer and remove all stopwords.
tfidf = TfidfVectorizer(stop_words="english")
# Convert tfidf matrix by fitting and transforming the data.
tfidf_matrix = tfidf.fit_transform(overall_descriptions)
# Calculating the cosine similarity matrix.
cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)
return cosine_sim
函数create_similarity_matrix()用于生成学生描述的余弦相似性矩阵。它首先将新学生描述添加到总体描述中。然后,学生描述需要转换为词向量(词的向量表示)。因此,将使用TFIDF(词频-逆文档频率)进行转换。TF-IDF分数是词在文档中出现的频率,由它出现的文档数量加权。这样做是为了减少在描述中频繁出现的词的重要性,因此,在计算最终相似性分数时,它们的重要性会降低。
上述函数最终输出余弦相似性矩阵。
步骤4:定义get_recommendations()函数。
def get_recommendations(new_description, overall_descriptions):
# create the similarity matrix
cosine_sim = create_similarity_matrix(new_description, overall_descriptions)
# Get pairwise similarity scores of all the students with new student.
sim_scores = list(enumerate(cosine_sim[-1]))
# Sort the descriptions based on similarity score.
sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
# Get the scores of top 10 descriptions.
sim_scores = sim_scores[1:10]
# Get the student indices.
indices = [i[0] for i in sim_scores]
return data.iloc[indices]
步骤5:向新学生推荐课程。
new_description = pd.Series('male physics science 78')
get_recommendations(new_description, descriptions)
显示前两个推荐。
1. 冷启动问题:每当新用户进入推荐系统时,就会出现推荐什么以及基于什么的问题,因为之前没有数据,无法进行相似性计算。解决这个问题的一个方法是让新用户填写一个包含个人兴趣、爱好、职业等基本信息的小介绍表,创建一个基本的用户档案,然后向新用户推荐项目。这将在很大程度上解决冷启动问题。
2. 数据稀疏问题:推荐系统的主要问题是缺乏适当的数据,这是推荐过程的主要需求。许多用户不费心评论他们购买的项目。结果,用户-项目评分矩阵有许多稀疏条目,这降低了相似性计算算法的性能。因此,一个解决方案是预测稀疏条目,许多研究人员已经给出了预测这些评分的算法,例如负加权单斜率算法。
3. 数据集变化:随着每天数据量的增加,推荐系统的数据集也在不断增加,这可能会改变数据集的整体结构和组成。因此,需要在数据集中包含新用户和新项目。
4. 可扩展性问题:在实际场景中,并不总是可能每次都找到相似的用户和相似的项目,以防止系统失败。因此,构建一个可扩展的推荐系统是一个主要问题。
5. 欺骗攻击:欺骗攻击被定义为包含虚假档案和有偏见的评论和评分的过程,以偏整个推荐过程。恶意攻击者可能会注入这些档案,以增加/减少目标项目的推荐频率。
1. 通过增加销售项目数量来增加利润:构建商业推荐系统的主要目标之一是增强业务并增加利润。这可以通过向用户推荐新项目来实现,这些项目可能会吸引用户,与没有推荐系统的用户相比,他们可能会购买更多的项目。
2. 提高用户满意度:任何商业应用的主要动机都应该是用户满意度,因为它增强了整体业务增长和公司的健康发展。一个设计良好的推荐系统增强了用户使用该应用的整体体验。他们可能会发现推荐有用且符合用户需求。因此,RS的主要目的是满足用户并使他们快乐。
3. 提取有用的模式:推荐系统提供了一种提取用户需求和偏好的有用模式的方法,这些模式可以作为业务的战略信息。例如,如果一家公司能够洞察到哪些产品被其客户广泛喜欢,哪些产品不被喜欢,那么他们可以改变他们的产品列表。