电影推荐是一个非常常见的问题,各种电影平台的推荐算法都大多采用了机器学习和深度学习的方法。在这篇文章中,我们将介绍如何使用Python语言来构建一个简单的电影推荐模型。
1. 数据集
首先,我们需要一个电影数据集。我们选择了MovieLens数据集,一个包含丰富电影信息的公共数据集。在MovieLens数据集中,有一个ratings.csv文件记录了用户对电影的评分(从1到5),每一行都包含了用户ID、电影ID、评分和时间戳。我们可以使用pandas库来读取这个文件:
```python
import pandas as pd
ratings = pd.read_csv('ratings.csv')
```
接下来,我们需要计算电影之间的相似度,以便为用户推荐相似的电影。在这里,我们使用电影之间的余弦相似度来计算它们的相似度。在Numpy库中,有一个cosine_similarity函数可以方便地计算余弦相似度:
```python
from sklearn.metrics.pairwise import cosine_similarity
movie_similarity = cosine_similarity(movie_vector)
```
在上面的代码中,movie_vector是一个矩阵,它的每一行代表一个电影,每一列代表一个特征。我们使用电影的特征向量来构建这个矩阵。
2. 特征工程
现在我们需要从MovieLens数据集中提取一些有用的特征来描述电影。在这里,我们选取了电影的类型作为特征。首先,我们需要将电影的类型转换为二进制特征向量,其中每个元素代表一个电影类型。为此,我们使用pandas的get_dummies函数:
```python
genres = set()
for m in movies.genres:
genres.update(m.split('|'))
genres = sorted(genres)
for genre in genres:
movies['genre-' + genre] = movies.genres.apply(lambda x: int(genre in x))
```
在上面的代码中,我们首先从电影类型中提取不同的类型,然后为每个类型创建一个新的相应的二进制特征,并将新的特征添加到movies数据集中。
接下来,我们需要将这些特征向量组合成一个大的特征矩阵:
```python
def get_movie_vector(movie_id):
movie = movies[movies.movieId == movie_id].iloc[0]
genres = movie[5:]
return genres.values.reshape(1, -1)
movie_ids = ratings.movieId.unique()
movie_vector = np.concatenate([get_movie_vector(i) for i in movie_ids], axis=0)
```
在上面的代码中,我们首先定义了一个get_movie_vector函数,用于返回给定电影的特征向量。我们在这里使用了numpy的concatenate函数来构建特征矩阵。
3. 建立推荐系统
现在,我们已经准备好使用余弦相似度和特征向量来创建推荐系统了。我们首先需要编写一个函数,用于根据用户的历史评分和电影相似性得分来预测用户对未评分电影的评分:
```python
def predict_rating(user_id, movie_id, movie_similarity):
user_ratings = ratings[ratings.userId == user_id]
user_similarity = movie_similarity[movie_id, user_ratings.movieId.values]
user_weight = user_ratings.rating.values - user_ratings.rating.mean()
return (user_weight * user_similarity).sum() / user_similarity.sum()
```
在上面的代码中,我们使用Numpy数组和pandas数据框来计算用户的历史评分、电影与用户评分的相似性和用户的评分偏差。
接下来,我们可以使用这个函数来为每个用户和每个未评分电影生成一个推荐列表:
```python
from collections import defaultdict
def get_recommendations(user_id, movie_similarity, n=10):
watched_movies = ratings[ratings.userId == user_id].movieId.values
recommendations = defaultdict(float)
for movie_id in ratings.movieId.unique():
if movie_id not in watched_movies:
rating = predict_rating(user_id, movie_id, movie_similarity)
recommendations[movie_id] = rating
return sorted(recommendations.items(), key=lambda x: x[1], reverse=True)[:n]
get_recommendations(1, movie_similarity)
```
在上面的代码中,我们使用collections库的defaultdict函数来创建推荐列表。然后,我们遍历所有未看过的电影,为每个电影计算预测评分并将其添加到推荐列表中。
4. 模型评估
最后,我们需要评估我们的模型的性能。通常,我们使用交叉验证来评估模型的准确性和泛化能力。在这里,我们使用了均方根误差(RMSE)来评估我们模型的性能:
```python
from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error
k = 5
kf = KFold(n_splits=k, shuffle=True)
rmses = []
for train_index, test_index in kf.split(ratings):
train_ratings = ratings.loc[train_index]
test_ratings = ratings.loc[test_index]
movie_ids = train_ratings.movieId.unique()
movie_vector = np.concatenate([get_movie_vector(i) for i in movie_ids], axis=0)
movie_similarity = cosine_similarity(movie_vector)
y_true = test_ratings.rating.values
y_pred = []
for user_id, movie_id, _ in test_ratings.values:
rating = predict_rating(user_id, movie_id, movie_similarity)
y_pred.append(rating)
rmse = mean_squared_error(y_true, y_pred, squared=False)
rmses.append(rmse)
print(f'Average RMSE: {sum(rmses) / len(rmses)}')
```
在上面的代码中,我们使用了KFold函数来分割数据集。对于每个分割,我们都重新计算了推荐系统所需的特征矩阵和电影相似度矩阵。然后,我们使用预测评分和真实评分之间的RMSE来评估模型的性能。
总结
在本文中,我们介绍了如何使用Python语言构建一个简单的电影推荐模型。我们使用了MovieLens数据集来提取电影特征,并使用余弦相似度来计算电影之间的相似度。然后,我们编写了一个预测函数来为用户推荐未评分的电影。最后,我们使用交叉验证来评估我们的模型性能。这个模型可能不够复杂,但它可以提供一个很好的入门级别的理解。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/
发表评论 取消回复