目标: 我想了解为什么在较小的树上RMSE
会增加。
背景: 我正在学习rpart
算法。我有一些数据,我将它分成了三个部分(训练、验证、测试)。我使用的是这个Kaggle数据集。
我拟合了模型:
homes_model <- rpart(formula = SalePrice ~ ., data = homes_train, method = "anova")
使用这个基础树:
然后,我在测试数据上计算了RMSE:
pred_base <- predict(object=homes_model, newdata = homes_test)library(Metrics)rmse_base <- rmse(actual=homes_test$SalePrice, #实际值 predicted = pred_base )
这个第一棵树的rmse_base
是: 46894
。
然后,我查看了cptable
,根据最低的xerror+xstd
规则选择了最佳树。
CP nsplit rel error xerror xstd1 0.446 0 1.00 1.00 0.0962 0.114 1 0.55 0.56 0.0543 0.078 2 0.44 0.48 0.0554 0.035 3 0.36 0.41 0.0375 0.021 4 0.33 0.40 0.0466 0.018 5 0.31 0.41 0.0477 0.017 6 0.29 0.39 0.0458 0.017 7 0.27 0.39 0.0459 0.013 8 0.25 0.37 0.04310 0.010 9 0.24 0.35 0.043
我选择了有7个分支的树:
opt_index <- 7cp_opt <- homes_model$cptable[opt_index, "CP"]# 修剪模型(到最优的cp值)homes_model_opt <- prune(tree = homes_model, cp = cp_opt)
我绘制了它:
然后我在这个较小的树上再次计算了测试数据的RMSE
:
#计算预测值 pred_opt <- predict(object=homes_model_opt, newdata = homes_test)#计算RMSErmse_opt <- rmse(actual=homes_test$SalePrice, #实际值 predicted = pred_opt) #预测值
它从46894
上升到了49964
。为什么?较小的树不应该更好地拟合未见过的数据吗?
回答:
树的大小总是需要在足够大以表示数据变化和不至于过大以至于过拟合之间找到平衡。较大的树有时能产生更好的结果是因为它们能更细致地分割数据,从而反映出细微差别。较小的树有时能产生更好的结果是因为它们在过拟合上的问题较少。但如果最小的树总是最好的,那为什么不只用一个节点呢?只使用根节点会用平均值来估计,这不太可能真的准确。这两种相互冲突的力量必须平衡以获得最佳结果。