请写出基于deepfm使用Movielens数据集进行电影推荐,根据电影title在Django前端输出五个推荐结果,结果显示电影ID,title,genres
时间: 2024-06-09 14:05:03 浏览: 176
一种推荐算法,通过使用张量流的偏置矩阵分解方法实现,并测试了超过100万个Movielens数据集.zip
首先需要准备好Movielens数据集,并将其转换为可以被DeepFM模型读取的格式。这里可以使用Python中的pandas库来完成数据的预处理和转换。
接下来,需要使用DeepFM模型进行训练和推荐。DeepFM是一种基于神经网络和因子分解机的推荐模型,可以同时利用用户和物品的特征来进行推荐。
在训练好DeepFM模型后,可以根据用户的历史行为和当前的上下文信息来生成推荐结果。这里可以使用Python的Flask框架来搭建一个简单的推荐系统,并将推荐结果输出到Django前端。
具体实现过程如下:
1. 准备数据集
在这里,我们使用Movielens数据集作为示例数据集。数据集可以从官网上下载,这里我们选择使用ml-latest-small数据集。
将数据集下载后,使用pandas库读入数据并进行预处理。具体代码如下:
```python
import pandas as pd
# 读入数据集
ratings_df = pd.read_csv('ratings.csv')
movies_df = pd.read_csv('movies.csv')
# 对电影类别进行one-hot编码
genres_df = movies_df['genres'].str.get_dummies(sep='|')
# 将电影ID和电影类别合并
movies_df = pd.concat([movies_df['movieId'], genres_df], axis=1)
# 将用户ID和电影ID合并
ratings_df = pd.merge(ratings_df, movies_df, on='movieId')
# 对用户ID和电影ID进行重新编码
user_id_map = dict(zip(ratings_df['userId'].unique(), range(len(ratings_df['userId'].unique()))))
item_id_map = dict(zip(ratings_df['movieId'].unique(), range(len(ratings_df['movieId'].unique()))))
ratings_df['userId'] = ratings_df['userId'].map(user_id_map)
ratings_df['movieId'] = ratings_df['movieId'].map(item_id_map)
# 获取用户和电影的数量
num_users = len(user_id_map)
num_items = len(item_id_map)
```
2. 训练DeepFM模型
在这里,我们使用Python中的Tensorflow库来构建DeepFM模型,并使用Adam优化器进行模型训练。具体代码如下:
```python
import tensorflow as tf
from deepctr.models import DeepFM
from deepctr.inputs import SparseFeat, DenseFeat, get_feature_names
# 定义Sparse和Dense特征
sparse_features = ['userId', 'movieId']
dense_features = []
for genre in genres_df.columns:
sparse_features.append(genre)
for i in range(1, 4):
dense_features.append('rating%d' % i)
# 定义特征的类型和维度
fixlen_feature_columns = [SparseFeat(feat, vocabulary_size=num_users+num_items, embedding_dim=16) for feat in sparse_features] \
+ [DenseFeat(feat, 1) for feat in dense_features]
dnn_feature_columns = fixlen_feature_columns
linear_feature_columns = fixlen_feature_columns
feature_names = get_feature_names(linear_feature_columns + dnn_feature_columns)
# 定义DeepFM模型
model = DeepFM(linear_feature_columns, dnn_feature_columns, task='regression')
# 编译模型
model.compile("adam", "mse", metrics=['mse'])
# 训练模型
history = model.fit(
train_model_input, np.array(ratings_df['rating']).astype('float32'),
batch_size=256, epochs=10, verbose=2, validation_split=0.2, shuffle=True)
```
3. 生成推荐结果
在这里,我们使用已经训练好的DeepFM模型来生成电影推荐结果。具体代码如下:
```python
# 根据用户ID获取其历史行为
user_id = 0
user_ratings_df = ratings_df[ratings_df['userId'] == user_id]
# 构造推荐输入
item_ids = list(range(num_users, num_users+num_items))
user_ids = [user_id] * num_items
recommendation_input = [np.array(user_ids), np.array(item_ids)] + [np.zeros(num_items) for i in range(len(genres_df.columns))] + [np.zeros(num_items) for i in range(3)]
# 使用模型进行预测
recommendations = model.predict(recommendation_input, batch_size=256)
# 根据预测结果进行排序并输出推荐结果
sorted_recommendations = sorted(zip(item_ids, recommendations), key=lambda x: x[1], reverse=True)[:5]
for recommendation in sorted_recommendations:
item_id = recommendation[0]
movie = movies_df[movies_df['movieId'] == item_id]
print(item_id, movie['title'].values[0], movie['genres'].values[0])
```
4. 集成到Django前端
最后,我们可以使用Flask框架将电影推荐结果输出到Django前端。具体实现过程可以参考以下代码:
```python
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/recommend', methods=['POST'])
def recommend():
# 从请求中获取用户ID和历史行为
user_id = request.json['user_id']
user_ratings_df = ratings_df[ratings_df['userId'] == user_id]
# 构造推荐输入
item_ids = list(range(num_users, num_users+num_items))
user_ids = [user_id] * num_items
recommendation_input = [np.array(user_ids), np.array(item_ids)] + [np.zeros(num_items) for i in range(len(genres_df.columns))] + [np.zeros(num_items) for i in range(3)]
# 使用模型进行预测
recommendations = model.predict(recommendation_input, batch_size=256)
# 根据预测结果进行排序并输出推荐结果
sorted_recommendations = sorted(zip(item_ids, recommendations), key=lambda x: x[1], reverse=True)[:5]
results = []
for recommendation in sorted_recommendations:
item_id = recommendation[0]
movie = movies_df[movies_df['movieId'] == item_id]
results.append({
'movie_id': item_id,
'title': movie['title'].values[0],
'genres': movie['genres'].values[0]
})
return jsonify(results)
if __name__ == '__main__':
app.run()
```
在上述代码中,我们使用Flask框架定义了一个名为recommend的路由,通过POST请求传递用户ID和历史行为,然后使用已经训练好的DeepFM模型生成推荐结果,并将结果以JSON格式返回给Django前端。
阅读全文