为研究对比推荐算法,如何用sklearn BernoulliRBM为特定用户生成推荐?
用BernoulliRBM给MovieLens用户生成推荐的实操指南
嘿,刚好折腾过用sklearn的BernoulliRBM做推荐,给你拆解下完整流程,一步步来就没那么懵啦~
一、先把数据改成RBM爱吃的样子
BernoulliRBM只认0/1的二值数据,但MovieLens给的是1-5的评分,所以第一步得把用户-电影的评分矩阵转成二值格式。常用两种思路:
- 要么把「用户给过评分」标记为1(代表用户接触过这个电影),没评分的是0;
- 要么把「评分≥3分」标记为1(代表用户喜欢),低于3分或没评分的是0。
先补全你的数据加载+预处理代码:
import pandas as pd import numpy as np from sklearn.neural_network import BernoulliRBM from sklearn.preprocessing import binarize # 加载ml-1m的评分数据(ratings.dat) ratings = pd.read_csv( 'C:\\Users\\admin\\PycharmProjects\\MasterProject\\ml-1m\\ratings.dat', sep='::', names=['user_id', 'movie_id', 'rating', 'timestamp'], engine='python' ) # 构建用户-电影的评分矩阵(行是用户,列是电影,空值填0) user_movie_matrix = ratings.pivot(index='user_id', columns='movie_id', values='rating').fillna(0) # 转成二值矩阵:这里选评分≥3分标记为1(代表用户喜欢),其他为0 binary_matrix = binarize(user_movie_matrix, threshold=2.5) # 阈值设2.5,刚好把3-5分转成1
二、训练RBM模型
RBM的作用是学出用户-电影数据里的潜在偏好特征,比如“喜欢动作片”“偏爱老电影”这类隐因子。直接用sklearn的BernoulliRBM拟合就行:
# 初始化模型,参数可以根据效果调 rbm = BernoulliRBM( n_components=100, # 隐特征的数量,类似SVD的隐因子个数,一般50-200之间试 learning_rate=0.01, # 学习率,太小学得慢,太大容易震荡 n_iter=20, # 迭代次数,跑个10-30次差不多 random_state=42, # 固定随机种子,结果可复现 verbose=1 # 打印训练进度,方便看有没有在跑 ) # 训练模型:每个用户是一个样本,所有电影是特征,直接喂二值矩阵就行 rbm.fit(binary_matrix)
三、给特定用户生成推荐
核心逻辑是:用训练好的RBM“重构”目标用户的偏好向量,重构值越高,说明模型觉得用户越可能喜欢这个电影,然后挑出用户没看过的电影排序就行。
写个简单的推荐函数:
def get_top_recommendations(user_id, binary_matrix, rbm, top_n=10): # 取出目标用户的二值向量,转成二维数组(RBM的方法要求输入是二维) user_vec = binary_matrix.loc[user_id].values.reshape(1, -1) # 用RBM重构用户的偏好向量,得到每个电影的预测喜欢概率(0-1之间) # 这里用gibbs采样重构,也可以用隐特征乘components_的方式,结果差不多 reconstructed_vec = rbm.gibbs(user_vec) # 转成Series,方便按电影ID筛选 reconstructed_scores = pd.Series(reconstructed_vec.flatten(), index=binary_matrix.columns) # 找出用户没评分过的电影(原始矩阵里值为0的) unrated_movies = binary_matrix.loc[user_id][binary_matrix.loc[user_id] == 0].index # 只保留未评分电影的预测分数,排序取TopN top_recs = reconstructed_scores.loc[unrated_movies].sort_values(ascending=False).head(top_n) return top_recs # 示例:给用户ID=1的用户生成Top10推荐 user_id = 1 my_recs = get_top_recommendations(user_id, binary_matrix, rbm) print(f"用户{user_id}的Top10推荐电影:") print(my_recs)
四、几个要注意的小细节
- 二值化策略选哪个? 如果你的研究是看“用户可能接触的电影”,就用“是否有评分”;如果是“用户可能喜欢的电影”,就用评分阈值。两种都试试,看哪种符合你的研究目标。
- 参数怎么调?
n_components(隐特征数)、learning_rate、n_iter这些对结果影响大,可以用交叉验证找最优值,比如把n_components从50调到200,看推荐准确率变化。 - 另一种重构方式 除了
gibbs,也可以先转成隐特征再重构,代码是这样的:
结果和gibbs采样的差不多,你可以选顺手的用。user_hidden = rbm.transform(user_vec) reconstructed_vec = user_hidden @ rbm.components_
内容的提问来源于stack exchange,提问作者py2018
相关产品推荐
相关产品推荐

