【问题标题】:How to build regression models and then compare their fits with data held out from the model training-testing?如何建立回归模型,然后将它们与模型训练测试中的数据进行比较?
【发布时间】:2017-10-09 09:09:46
【问题描述】:

我一直在使用 R 中的 caret 包构建几个不同的回归模型,以便预测某些基因序列在某些实验条件下的荧光程度。

我遵循将数据分成两组的基本协议:一组“训练-测试集”(80%)和一组“保留集”(20%),前者将用于构建模型,后者将用于测试它们,以便根据 R 平方和 RMSE 值等指标比较和选择最终模型。可以在此处 (http://www.kimberlycoffey.com/blog/2016/7/16/compare-multiple-caret-run-machine-learning-models) 找到我关注的众多指南中的一个。

但是,我遇到了一个障碍,我不知道如何根据不同模型预测保留集中分数的能力来测试和比较不同模型。在我上面链接的指南中,作者使用ConfusionMatrix 来计算每个模型的特异性和准确性,然后构建一个predict.train 对象,该对象将最近构建的模型应用于保留数据集(即在链接中称为test)。但是,ConfusionMatrix 只能应用于分类模型,其中结果(或响应)是一个分类值(据我的研究表明。如果这是不正确的,请纠正我,因为我无法得出结论对这种情况有任何疑问)。

我发现resamples 方法能够将多个模型相互比较(来源:https://www.rdocumentation.org/packages/caret/versions/6.0-77/topics/resamples),但它无法考虑新模型如何与我从训练中排除的数据相匹配——测试会话。

我尝试使用最近构建的模型和保留数据创建predict 对象,然后使用插入符号的R2RMSE 方法计算Rsquared 和RMSE 值。但我不确定这种方法是否是比较和选择最佳模型的最佳方法。

此时,我应该注意,我使用的所有模型构建方法都是​​基于线性回归的,因为我需要能够提取系数并将它们应用到单独的 Python 脚本中。

我考虑的另一个选项是在我的结果中设置一个阈值,其中任何荧光值超过 100 的基因序列都被认为是有用的,而得分低于 100 的序列则不是。这将允许我使用ConfusionMatrix。但我不确定我应该如何在我的 R 代码中实现这一点,以在我的结果变量中创建这两个类。我还担心这种方法可能会使我的回归模型难以应用于其他数据并进行预测。

不管怎样,每个预测变量都是整数或浮点数,并且具有非正态分布的范围。

这是我目前使用的代码:

library(caret)

data <- read.table("mydata.csv")

sorted_Data<- data[order(data$fluorescence, decreasing= TRUE),]

splitprob <- 0.8

traintestindex <- createDataPartition(sorted_Data$fluorescence, p=splitprob, list=F)
holdoutset <- sorted_Data[-traintestindex,]
trainingset <- sorted_Data[traintestindex,]

traindata<- trainingset[c('x1', 'x2', 'x3', 'x4', 'x5', 'fluorescence')]

cvCtrl <- trainControl(method = "repeatedcv", number= 20, repeats = 20, verboseIter = FALSE)

modelglmStepAIC <- train(fluorescence~., traindata, method = "glmStepAIC", preProc = c("center","scale"), trControl = cvCtrl)

model_rlm <- train(fluorescence~., traindata, method = "rlm", preProc = c("center","scale"), trControl = cvCtrl)

pred_glmStepAIC<- predict.lm(modelglmStepAIC$finalModel, holdoutset)

pred_rlm<- predict.lm(model_rlm$finalModel, holdoutset)

glmStepAIC_r2<- R2(pred_glmStepAIC, holdoutset$fluorescence)
glmStepAIC_rmse<- RMSE(pred_glmStepAIC, holdoutset$fluorescence)

rlm_r2<- R2(pred_rlm, holdoutset$fluorescence)
rlm_rmse<- RMSE(pred_rlm, holdoutset$fluorescence)

【问题讨论】:

  • 里面有编程问题吗?否则,这似乎更适合 stats.stackexchange.com。
  • 将读者的注意力范围和示例的可重复性视为获得正确答案的最重要因素。
  • @Roland 我在这里发帖是因为我不知道要实现什么代码来比较和选择我的最终模型。我没有在 CrossValidated 上发帖,因为他们对专注于统计的问题非常挑剔,而不是实际的编码方面。话虽如此,如果您认为他们可能会接受,我可能会删除这篇文章并将其放在 CrossValidated 上。
  • @A.Val。你能推荐我一种使这个问题可重现的方法吗?我知道set.seed(1),但我不确定要使用哪些包含的数据集以使其他用户可以重现此代码。

标签: r modeling r-caret


【解决方案1】:

Caret 提供的样本外性能指标是 RMSE、MAE 以及拟合值和观察值之间的平方相关性(称为 R2)。在此处查看更多信息https://topepo.github.io/caret/measuring-performance.html

至少在时间序列回归环境中,RMSE 是回归模型样本外性能的标准衡量标准。

我建议不要对连续结果变量进行离散化,因为您实际上是在通过离散化丢弃信息。

【讨论】:

  • 很好,我在文档中完全错过了 postResample 方法的存在,该方法允许您使用保留(即测试)数据计算模型的 Rsquared、RMSE 和 MAE。我现在可以获取这些数字,甚至将它们放入数据框中以进行进一步比较。谢谢!
  • @Otto Kässi 为什么预测值和观测值之间的平方相关性“被称为 R2”? R2 实际上等价于两个向量的平方相关,如这个证明 (lemma1-3) stackoverflow.com/a/40901487/7769076
  • @AgileBean -- 是的,你当然是对的!我已经相应地编辑了答案。感谢您的警惕!
猜你喜欢
  • 1970-01-01
  • 2022-09-18
  • 2021-09-21
  • 1970-01-01
  • 2022-08-20
  • 2019-10-23
  • 2021-03-03
  • 2021-06-22
  • 1970-01-01
相关资源
最近更新 更多