You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Surprise库GridSearchCV时遇'DataFrame'无'raw_ratings'属性错误

解决GridSearchCV调优KNNBasic时的'DataFrame' object has no attribute 'raw_ratings'错误

问题原因

你传入gs.fit()的data是Pandas DataFrame,但Surprise库的GridSearchCV并不支持直接传入原生DataFrame——库内代码会尝试访问数据集的raw_ratings属性,而DataFrame没有这个属性,因此触发错误。

解决方案

需要先将Pandas DataFrame转换成Surprise库专用的Dataset对象,再传入拟合方法:

1. 转换数据集格式

使用surprise.Dataset.load_from_df()方法完成转换,需要提前定义评分范围(Reader对象),并指定DataFrame中用户ID、物品ID、评分三列的顺序:

from surprise import Dataset, Reader

# 根据你的实际评分范围调整rating_scale,比如是0-10就写成(0,10)
reader = Reader(rating_scale=(1, 5))
# 替换成你的DataFrame中对应的列名,确保顺序是[用户ID列, 物品ID列, 评分列]
surprise_data = Dataset.load_from_df(data[['user_id', 'item_id', 'rating']], reader)

2. 传入转换后的数据集拟合

修改gs.fit()的参数为转换后的surprise_data即可:

gs.fit(surprise_data)

完整修正代码

from surprise import KNNBasic, Dataset, Reader
from surprise.model_selection import GridSearchCV

param_grid = {'k': [10, 20, 30], 'min_k': [3, 6, 9],
              'sim_options': {'name': ["cosine", 'pearson', "pearson_baseline"],
                              'user_based': [False], "min_support": [2, 4]}
              }

# 转换DataFrame为Surprise专用数据集
reader = Reader(rating_scale=(1, 5))
surprise_data = Dataset.load_from_df(data[['user_id', 'item_id', 'rating']], reader)

# 执行网格搜索调参
gs = GridSearchCV(KNNBasic, param_grid, measures=['rmse', 'mae'], cv=3, n_jobs=-1)
gs.fit(surprise_data)

# 输出最优结果
print(gs.best_score['rmse'])
print(gs.best_params['rmse'])

内容的提问来源于stack exchange,提问作者Shrikanth Krish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:31:32