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

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

相关文章

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Python实现将实体类列表数据导出到Excel文件

《Python实现将实体类列表数据导出到Excel文件》在数据处理和报告生成中,将实体类的列表数据导出到Excel文件是一项常见任务,Python提供了多种库来实现这一目标,下面就来跟随小编一起学习一... 目录一、环境准备二、定义实体类三、创建实体类列表四、将实体类列表转换为DataFrame五、导出Da

Python实现数据清洗的18种方法

《Python实现数据清洗的18种方法》本文主要介绍了Python实现数据清洗的18种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1. 去除字符串两边空格2. 转换数据类型3. 大小写转换4. 移除列表中的重复元素5. 快速统

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

在Pandas中进行数据重命名的方法示例

《在Pandas中进行数据重命名的方法示例》Pandas作为Python中最流行的数据处理库,提供了强大的数据操作功能,其中数据重命名是常见且基础的操作之一,本文将通过简洁明了的讲解和丰富的代码示例,... 目录一、引言二、Pandas rename方法简介三、列名重命名3.1 使用字典进行列名重命名3.编

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram