如何建立回归模型,然后将它们的拟合度与模型训练测试中的数据进行比较?

How to build regression models and then compare their fits with data held out from the model training-testing?

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

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

但是,我 运行 陷入困境,因为我不知道如何根据不同模型预测保留集中分数的能力来测试和比较它们。在我 link 编辑到上面的指南中,作者使用 ConfusionMatrix 来计算每个模型在构建 predict.train 对象后计算每个模型的特异性和准确性,该对象将最近构建的模型应用于保留数据集(在 link 中称为 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)

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

至少在时间序列回归上下文中,RMSE 是回归模型样本外性能的标准度量。

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