数据预处理与协同过滤推荐算法——从数据清洗到个性化电影推荐

2024-09-07 22:52

本文主要是介绍数据预处理与协同过滤推荐算法——从数据清洗到个性化电影推荐,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

推荐系统在现代应用中占据了重要地位,尤其在电影、音乐等个性化内容推荐中广泛使用。本文将介绍如何使用数据预处理、特征工程以及多种推荐算法(包括协同过滤、基于内容的推荐、混合推荐等)来实现电影推荐系统。通过Pandas、Scikit-learn、TensorFlow等工具,我们将展示如何从数据清洗开始,逐步实现各类推荐算法。

 完整项目代码:

基于协同过滤的电影推荐系统

一、数据预处理

数据预处理是机器学习中的关键步骤,它决定了模型能否正确理解数据。在本项目中,我们处理的电影数据具有多值类别型特征(如国家、语言、类型)、文本特征(如导演、演员等),以及数值型特征(如评分、票数等)。因此,合理的特征处理能够提升推荐效果。

1. 加载数据与处理缺失值

我们首先加载数据并对缺失值进行填充,确保数据完整性。

df.fillna({'rating': df['rating'].mean(),'vote': df['vote'].median(),'runtime': df['runtime'].median(),'country': "['Unknown']",'language': "['Unknown']",'genre': "['Unknown']",'director': "['Unknown']",'composer': "['Unknown']",'writer': "['Unknown']",'cast': "['Unknown']"
}, inplace=True)
2. 多值类别型特征的处理

对于国家、语言和类型等多值类别型特征,我们使用 MultiLabelBinarizer 进行独热编码,将其转换为模型能够处理的数值型数据。

mlb_country = MultiLabelBinarizer()
country_encoded = mlb_country.fit_transform(df['country'])
mlb_language = MultiLabelBinarizer()
language_encoded = mlb_language.fit_transform(df['language'])
mlb_genre = MultiLabelBinarizer()
genre_encoded = mlb_genre.fit_transform(df['genre'])
3. 文本特征的处理

对于电影的文本特征,如导演、演员等,我们使用 TfidfVectorizer 来生成TF-IDF向量。这种方法可以将文本数据转化为数值特征,以便后续分析和建模。

4. 数值型特征标准化

为了消除数值型特征的量纲差异,我们对评分、票数等特征进行标准化处理。

scaler = StandardScaler()
scaled_numeric_features = scaler.fit_transform(df[['year', 'rating', 'vote', 'runtime']])
5. 合并所有特征

将所有经过处理的特征合并,形成最终的特征矩阵。

processed_features = np.hstack([country_encoded, language_encoded, genre_encoded,cast_tfidf, scaled_numeric_features
])
二、推荐算法实现
1. 协同过滤算法

协同过滤是一种基于用户行为相似性的推荐方法。在此,我们首先创建用户-电影评分矩阵,并基于余弦相似度计算用户之间的相似度。

user_movie_ratings = df.pivot_table(index='user_id', columns='title', values='rating', fill_value=0)
similarity_matrix = cosine_similarity(user_movie_ratings)
similarity_matrix_df = pd.DataFrame(similarity_matrix, index=user_movie_ratings.index, columns=user_movie_ratings.index)

然后,利用相似用户的评分为目标用户推荐电影。

def recommend_movies(user_id, num_recommendations=5):user_ratings = user_movie_ratings.loc[user_id]unseen_movies = user_ratings[user_ratings == 0].index.tolist()weighted_ratings = np.dot(similarity_matrix_df[user_id].values, user_movie_ratings[unseen_movies].values) / similarity_matrix_df[user_id].sum()movie_scores = dict(zip(unseen_movies, weighted_ratings))return sorted(movie_scores.items(), key=lambda x: x[1], reverse=True)[:num_recommendations]
2. 基于内容的推荐

基于内容的推荐算法通过计算电影特征之间的相似性来推荐类似的电影。我们首先合并电影的文本特征(如类型、导演、演员),然后使用TF-IDF来计算相似度。

df['combined_features'] = df['kind'] + " " + df['genre'].apply(lambda x: " ".join(eval(x))) + " " + df['director'].fillna('') + " " + df['cast']
tfidf_vectorizer = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf_vectorizer.fit_transform(df['combined_features'])
cosine_sim = cosine_similarity(tfidf_matrix)

然后,为特定电影生成基于内容的推荐。

def recommend_based_on_content(movie_title, k=5):similar_scores = cosine_sim_df[movie_title]top_items_indices = similar_scores.argsort()[-k-1:-1][::-1]return df['title'].iloc[top_items_indices]
3. 混合推荐算法

混合推荐算法结合了基于内容和协同过滤的优点。我们通过对内容相似度和协同过滤相似度加权平均来生成推荐列表。

def hybrid_recommendation(movie_title, user_rating, weight_content=0.5, k=5):content_scores = cosine_sim_df[movie_title]collaborative_scores = similarity_matrix_df[movie_title] * (user_rating - 2.5)hybrid_scores = (content_scores * weight_content + collaborative_scores * (1 - weight_content)).dropna()return hybrid_scores.sort_values(ascending=False).head(k)
4. 基于K-means的推荐

我们还可以使用K-means聚类算法对电影进行聚类,然后基于聚类结果推荐相似电影。

kmeans = KMeans(n_clusters=10, random_state=42)
df['cluster'] = kmeans.fit_predict(combined_features)
def recommend_movies_from_cluster(title):cluster_id = df[df['title'] == title]['cluster'].iloc[0]return df[df['cluster'] == cluster_id]['title'].tolist()
5. 基于神经网络的推荐

最后,我们使用神经网络模型来预测用户对电影的评分。我们使用Keras构建了一个简单的神经网络模型,并进行了训练和预测。

model = Sequential([Dense(128, activation='relu', input_dim=processed_features.shape[1]),Dropout(0.3),Dense(64, activation='relu'),Dropout(0.3),Dense(1, activation='linear')
])
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(processed_features, ratings, epochs=10, validation_split=0.2)

本文详细介绍了数据预处理、特征工程以及多种推荐算法的实现。我们展示了如何通过协同过滤、基于内容的推荐、混合推荐、K-means聚类及神经网络来构建个性化的电影推荐系统。通过结合这些方法,可以为用户提供更加精准且多样化的推荐内容。

这篇关于数据预处理与协同过滤推荐算法——从数据清洗到个性化电影推荐的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146390

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个