推荐系统在现代应用中占据了重要地位,尤其在电影、音乐等个性化内容推荐中广泛使用。本文将介绍如何使用数据预处理、特征工程以及多种推荐算法(包括协同过滤、基于内容的推荐、混合推荐等)来实现电影推荐系统。通过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聚类及神经网络来构建个性化的电影推荐系统。通过结合这些方法,可以为用户提供更加精准且多样化的推荐内容。