R中predict()函数预测时data和newdata参数的差异是什么
predict()传入
data和newdata的差异说明 底层运行逻辑差异
你遇到的差异本质是rpart包的预测方法参数匹配规则导致的:
predict.rpart()(rpart提供的predict泛型实现)的参数列表里不存在data这个入参,你传入的data=Boston_test会被判定为无效的多余参数,直接被函数忽略。此时函数没有收到指定的新数据集,就会走默认逻辑:返回模型训练集(也就是你拟合树时用的Boston_train)的预测结果。- 传入
newdata=Boston_test时,是匹配到了predict.rpart()的正式参数,函数会基于训练好的决策树,对传入的Boston_test样本逐一计算预测值,返回的才是测试集对应的预测结果。
为什么没有报错且RMSE结果异常
你示例中刚好把数据集拆成了等长的训练集和测试集(Boston共506条数据,各取253条),所以训练集预测结果的长度和测试集标签长度完全一致,R计算RMSE时不会触发长度不匹配的警告,只会默默计算,最终得到错误的RMSE结果。
如果你的训练集和测试集长度不一样,传入data=的写法就会立刻出现向量长度不匹配的警告,更容易定位问题。
验证方法
你可以运行以下代码确认逻辑:
# 验证data参数被忽略,返回的就是训练集预测结果 identical(tree.pred, predict(Boston_tree)) # 查看两个预测结果的对应数据集来源 length(tree.pred) == nrow(Boston_train) length(tree.pred2) == nrow(Boston_test)
运行后可以看到第一个判断返回TRUE,直接证明data参数没有生效。
内容的提问来源于stack exchange,提问作者Ghassany
相关产品推荐
相关产品推荐

