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

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

相关文章

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

macOS彻底卸载Python的超完整指南(推荐!)

《macOS彻底卸载Python的超完整指南(推荐!)》随着python解释器的不断更新升级和项目开发需要,有时候会需要升级或者降级系统中的python的版本,系统中留存的Pytho版本如果没有卸载干... 目录MACOS 彻底卸载 python 的完整指南重要警告卸载前检查卸载方法(按安装方式)1. 卸载

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性