【问题标题】:How to perform a K-fold cross validation and understanding the outputs如何执行 K 折交叉验证并理解输出
【发布时间】:2018-03-12 15:45:13
【问题描述】:

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

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 

这会产生以下输出(摘要版本)

    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 折交叉验证时,我也不明白为什么生成的结果会产生 Overall(所有 5 折的总和)

如果有人可以提供帮助,将不胜感激。

【问题讨论】:

    标签: r validation regression cross-validation


    【解决方案1】:

    当我运行同样的事情时,我看到它确实做了 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 错误可能代表“测试”数据(而不是用于训练模型的数据)上的模型性能。例如,在折叠 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

    我可以建议对您有用的一件事是,在线性回归的情况下,有一个封闭形式的解决方案可用于留一法交叉验证 (locv),而无需实际拟合多个模型。

    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)
    

    【讨论】:

    • 非常感谢您的回复,我的统计数据不是最好的,有什么方法可以从您建议的方法中获得 RMSE 值。如果不是,我该如何解释您提出的这种新方法,因为我需要在表单中验证此模型。
    • 原始LM的RMSE可以通过'summary(fit)$sigma'获得。它也可以在 PRESS 上计算为 'RMSE
    • 非常感谢您的帮助
    • 确认均方根误差是指预测高度值与模型确定的实际高度值之间的差异
    • 预测值和实际值之间的差异称为残差。 RMSE 是残差的标准差
    猜你喜欢
    • 2016-01-15
    • 1970-01-01
    • 2022-10-15
    • 2020-08-29
    • 2017-02-06
    • 1970-01-01
    • 2020-02-06
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多