使用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
相关产品推荐
相关产品推荐

