use*_*207 1 r cross-validation
我在包含151个变量和161个观察值的数据集上执行了以下操作: -
> library(DAAG)
> fit <- lm(RT..seconds.~., data=cadets)
> cv.lm(df = cadets, fit, m = 10)
Run Code Online (Sandbox Code Playgroud)
得到以下结果: -
fold 1
Observations in test set: 16
7 11 12 24 33 38 52 67 72
Predicted 49.6 44.1 26.4 39.8 53.3 40.33 47.8 56.7 58.5
cvpred 575.0 -113.2 640.7 -1045.8 876.7 -5.93 2183.0 -129.7 212.6
RT..seconds. 42.0 44.0 44.0 45.0 45.0 46.00 49.0 56.0 58.0
CV residual -533.0 157.2 -596.7 1090.8 -831.7 51.93 -2134.0 185.7 -154.6
Run Code Online (Sandbox Code Playgroud)
我想要做的是将预测结果与实际实验结果进行比较,因此我可以绘制两者相互对应的图表,以显示它们的相似程度.我是正确的假设我会通过使用Predicted行中的值作为我的预测结果而不是cvpred来做到这一点?
我只是问这个问题,因为当我在插入符号包中执行相同的操作时,预测值和观察值之间的差异远远大于彼此:
library(caret)ctrl < - trainControl(method ="cv",savePred = T,classProb = T)mod < - train(RT..seconds .~.,data = cadets,method ="lm",trControl = ctrl) MOD $ PRED
pred obs rowIndex .parameter Resample
1 141.2 42 6 none Fold01
2 -504.0 42 7 none Fold01
3 1196.1 44 16 none Fold01
4 45.0 45 27 none Fold01
5 262.2 45 35 none Fold01
6 570.9 52 58 none Fold01
7 -166.3 53 61 none Fold01
8 -1579.1 59 77 none Fold01
9 2699.0 60 79 none Fold01
Run Code Online (Sandbox Code Playgroud)
该模型不应该是这个不准确,因为我最初从1664变量开始,通过使用随机森林减少它,因此只使用变量重要性大于1的变量,这大大减少了我的数据集从162*1664到162*151.
如果有人能向我解释这一点,我将不胜感激,谢谢
我认为这里很少有混乱的地方,让我试着为你清理一下.
"预测"部分cv.lm与crossvalidaiton的结果不对应.如果您对crossvalidaiton感兴趣,那么您需要查看"cvpred"结果 - "Predicted"对应于使用您所有数据的模型拟合的预测.
您的预测与您的cvpredictions之间存在如此大的差异的原因可能是因为您的最终模型过度拟合,这应该说明为什么交叉验证如此重要.
我相信你的cv.lm模型不合适.我从来没有使用过这个包,但我认为你想传递的东西cv.lm(df = cadets, RT..seconds.~., m = 10)不是你的fit对象.我不确定为什么你在上面的例子中看到cvpred和Predicted选项之间存在如此大的差异,但这些结果告诉我,传入模型将导致使用适合每个CV的所有数据的模型折:
library(DAAG)
fit <- lm(Sepal.Length ~ ., data=iris)
mod1 <- cv.lm(df=iris,fit,m=10)
mod2 <- cv.lm(df=iris,Sepal.Length ~ .,m=10)
> sqrt(mean((mod1$cvpred - mod1$Sepal.Length)^2))
[1] 0.318
> sqrt(mean((mod2$cvpred - mod2$Sepal.Length)^2))
[1] 5.94
> sqrt(mean((mod1$cvpred - mod1$Predicted)^2))
[1] 0.0311
> sqrt(mean((mod2$cvpred - mod2$Predicted)^2))
[1] 5.94
Run Code Online (Sandbox Code Playgroud)
caret结果之间存在差异的原因是因为您正在查看"预测"部分."cvpred"应该与插入符号紧密排列(尽管确保在你的cv结果上做出索引),如果你想用"插入符号"排列"预测"结果,你需要使用类似的东西来预测predict(mod,cadets).