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

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

相关文章

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个