如何保留原维度按非空值拆分评分数据集的训练测试集?
按非空评分条目拆分训练集与测试集的方法
你之前用train_test_split直接拆分宽表的问题在于,它是按行(用户)做拆分,导致训练/测试集的用户维度缩减,不符合你保留原维度的需求。正确的思路是按非空评分条目拆分,再重构出维度一致的训练集和测试集,具体步骤如下:
1. 提取非空评分的长格式数据
先把宽表中非空的评分提取出来,转成userId-movieId-rating的长格式,方便后续拆分:
import pandas as pd import numpy as np # 从宽表转回长格式,仅保留非空评分 ratings_long = data.stack().reset_index(name='rating')
2. 拆分训练/测试的评分条目
对非空的评分记录做80/20拆分:
from sklearn.model_selection import train_test_split train_entries, test_entries = train_test_split(ratings_long, test_size=0.2, random_state=42)
3. 构建维度一致的训练集和测试集
复制原宽表结构,分别保留对应拆分后的评分,其余设为null:
# 构建训练集:仅保留训练条目的评分 data_train = data.copy() data_train[:] = np.nan data_train.loc[train_entries['userId'], train_entries['movieId']] = train_entries['rating'].values # 构建测试集:仅保留测试条目的评分 data_test = data.copy() data_test[:] = np.nan data_test.loc[test_entries['userId'], test_entries['movieId']] = test_entries['rating'].values
此时data_train和data_test的维度均为(610, 9724),与原数据集一致。
4. 计算预测结果的RMSE
用SVD完成预测后,提取测试集中的真实值与对应预测值计算RMSE:
from sklearn.metrics import mean_squared_error # 假设predicted_data是你的SVD预测结果(维度与原数据一致) true_ratings = data_test.stack().values pred_ratings = predicted_data.loc[data_test.notna()].values rmse = np.sqrt(mean_squared_error(true_ratings, pred_ratings)) print(f"测试集RMSE: {rmse:.4f}")
内容的提问来源于stack exchange,提问作者Bothurin
相关产品推荐
相关产品推荐

