如何执行K折交叉验证并理解输出

时间:2017-10-01 08:59:33

标签: r validation regression cross-validation

我一直在尝试在我创建的数据集中对R执行k-fold交叉验证。该数据的链接如下:

https://drive.google.com/open?id=0B6vqHScIRbB-S0ZYZW1Ga0VMMjA

我使用了以下代码:

    library(DAAG)
    six = read.csv("six.csv") #opening file

    fit <- lm(Height ~ GLCM.135 + Blue + NIR, data=six) #applying a regression model
    summary(fit) # show results

    CVlm(data =six, m=10, form.lm = formula(Height ~  GLCM.135 + Blue + NIR )) # 10 fold cross validation 

这会产生以下输出(Summarized version)

    Sum of squares = 7.37    Mean square = 1.47    n = 5 

    Overall (Sum over all 5 folds) 
    ms 
    3.75 

    Warning message:

    In CVlm(data = six, m = 10, form.lm = formula(Height ~ GLCM.135 +  : 

    As there is >1 explanatory variable, cross-validation
    predicted values for a fold are not a linear function
    of corresponding overall predicted values.  Lines that
    are shown for the different folds are approximate

我不明白 ms 值是指什么,因为我在互联网上看到了不同的解释。据我所知,K-fold交叉验证可以为指定的模型生成一个总体RMSE值(这是我试图为我的研究获得的)。

当我在代码中指定10倍交叉验证时,我也不明白为什么生成的结果产生总体(总共5倍)

如果有人能提供帮助,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

当我跑同样的东西时,我看到它确实做了10次折叠,但打印的最终输出与你的相同(“全部5次折叠”)。 “ms”是均方预测误差。 3.75的值也不是所有10倍的简单平均值(得到3.67):

msaverage <- (1.19+6.04+1.26+2.37+3.57+5.24+8.92+2.03+4.62+1.47)/10
msaverage

请注意,平均折叠和大多数折叠都高于“剩余标准误差”(1.814)。这就是我们所期望的,因为CV误差表示可能在“测试”数据上的模型性能(不是用于训练模型的数据)。例如,在Fold 10上,请注意计算的残差是根据预测的观察结果(5个观察结果)而未在该模型的训练中使用:

fold 10 
Observations in test set: 5 
           12    14     26    54    56
Predicted   20.24 21.18 22.961 18.63 17.81
cvpred      20.15 21.14 22.964 18.66 17.86
Height      21.98 22.32 22.870 17.12 17.37
CV residual  1.83  1.18 -0.094 -1.54 -0.49

Sum of squares = 7.37    Mean square = 1.47    n = 5 

我们收到的警告似乎也很常见 - 在本文中也看到了这一点:http://www.rpubs.com/jmcimula/xCL1aXpM3bZ

我可以建议的一件事可能对你有用的是,在线性回归的情况下,有一个封闭形式的解决方案,用于离开一次交叉验证(loocv)而不实际拟合多个模型。

predictedresiduals <- residuals(fit)/(1 - lm.influence(fit)$hat)
PRESS <- sum(predictedresiduals^2)
PRESS  #Predicted Residual Sum of Squares Error
fitanova <- anova(fit)  #Anova to get total sum of squares
tss <- sum(fitanova$"Sum Sq")   #Total sum of squares
predrsquared <- 1 - PRESS/(tss)
predrsquared

请注意,此值为0.574,而原始Rsquared为0.6422

为了更好地传达RMSE的概念,查看预测残差的分布是有用的:

hist(predictedresiduals)

然后可以将RMSE简单地计算为:

sd(predictedresiduals)