sklearn实现RMSE交叉验证的代码正确性及RMSE相关问题咨询
问题解答
1. 代码正确性分析
你这段代码存在3个需要调整的问题:
- 遗漏依赖导入:代码中用到了
np(numpy)但缺少import numpy as np的导入语句,直接运行会报错 - 模型拟合逻辑冗余:
cross_val_score会自动在每折交叉验证的训练子集上拟合传入的模型,不需要提前拟合regressor,提前拟合的参数也不会被调用,属于无效操作 - 指标计算不匹配:你使用的
scoring='neg_mean_absolute_error'对应的是负平均绝对误差,取绝对值后得到的是MAE(平均绝对误差),不是你后面提到的RMSE(均方根误差),如果要计算RMSE,需要把scoring参数改为'neg_root_mean_squared_error'
修正后的代码示例:
import numpy as np from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score # regressor直接传入初始化后的未拟合模型即可 cv = KFold(n_splits=10, random_state=1, shuffle=True) scores = cross_val_score(regressor, X, y, scoring='neg_root_mean_squared_error', cv=cv, n_jobs=-1) # 输出10折交叉验证的平均RMSE print(np.mean(np.abs(scores)))
2. RMSE取值是否可以大于100
完全可以,RMSE的取值没有固定上限,它的量级完全取决于你的因变量y的数值范围:
- 比如你的y是预测房屋总价,取值范围在10万到1000万区间,那RMSE达到几千、几万都是正常情况
- 只有当你提前对y做了0-1归一化/标准化处理后,RMSE才会被限制在较小的数值区间
你得到的121的RMSE是否合理,只需要和你的y的取值区间对比即可,比如y的最大值为1000的话,121的误差属于合理范围。
3. RMSE的适用场景
RMSE两种用法都支持:
- 直接评估模型整体优劣:前提是你所在的业务场景有明确的可接受误差阈值,比如你预测电商用户的月消费额,业务上允许的平均误差是200元,那RMSE如果低于200就符合上线要求,高于200就需要继续优化
- 不同模型之间效果对比:这是更常用的场景,注意对比的前提是所有模型都在完全相同的数据集、相同的交叉验证策略下计算RMSE,数值越小说明模型的预测误差越小,效果越好
内容的提问来源于stack exchange,提问作者user11974462
相关产品推荐
相关产品推荐

