【发布时间】:2021-05-06 02:49:51
【问题描述】:
一个由两部分组成的问题:我试图弄清楚:
(1) 如何使用 lm() 生成线性回归的 ROC 曲线(如果正确的话??),以及 (2) 如何通过 k 折交叉验证来实现,这样我就可以得到平均 ROC 曲线(和 AUC)。
如果结果是连续变量,它必须转换为二进制变量,对吗?通常我会使用glm(..., family = 'binomial') 来拟合逻辑回归模型,但这是最合适的方法吗? (看来我只是在拟合不同的模型。)
我想从cvAUC 包的rdrr.io website 中得到类似下面的图(红线是平均 ROC 曲线,虚线是 k 倍 ROC 曲线),但我不知道如何到达那里我的数据。
以data(USArrests) 为例:
library(dplyr)
library(pROC)
data(USArrests)
# create train and test sets
set.seed(2021)
dat <- mutate(USArrests, index=1:nrow(USArrests))
train.dat <- sample_frac(dat, 0.5) # splits `dat` in half
test.dat <- subset(dat, !dat$index %in% train.dat$index) # uses other half to test
# trying to build predictions with lm()
fit <- lm(Murder ~ Assault, data = train.dat)
predicted <- predict(fit, test.dat, type = "response")
# roc curve
roc(test.dat$Murder ~ predicted, plot = TRUE, print.auc = TRUE) # AUC = 1.000
上面的代码得到了结果,但是给出了警告:
警告信息: 在 roc.default(response, m[[predictors]], ...) 中: “响应”有两个以上的层次。考虑明确设置“级别”或改用“multiclass.roc”
我不知道该怎么做。它还得到了 AUC = 1.000——这种方法是否错误,为什么?
此外,它仅适用于一个训练/测试集。我不确定如何使用 k 折集进行训练。我想我必须以某种方式将它与caret::train() 结合起来。我尝试使用来自ROC curve from training data in caret 的随机森林模型的 ROC 解决方案,但它不适用于我的代码。
例子:
library(caret)
library(MLeval)
train_control <- trainControl(method = "cv", number = 10, savePredictions = TRUE)
rfFit <- train(Murder ~ Assault, data = USArrests, trControl = train_control, method = "lm")
rfFit$pred$mtry # NULL
res <- MLeval::evalm(rfFit) # error with error message below
MLeval:机器学习模型评估
输入:插入符号训练函数对象
不平均概率。
第 1 组类型:cv[.data.frame(preds, c(G1, G2, "obs")) 中的错误: 选择了未定义的列
【问题讨论】:
-
您采用的方法是错误的 IMO - AUC 是通过尝试使用连续预测变量(例如,来自 GLM 的预测)对二进制(或多类别)变量进行分类而生成的。如果您对线性模型的预测准确性感兴趣,为什么不使用 R 平方之类的方法?
-
@DaveArmstrong,是的,我认为这是错误的,直到我看到这个RPubs (tutorial?); section 4.2,它介绍了“线性回归的 ROC”。我还被要求为我的线性回归结果提供 ROC 曲线,这就是我试图弄清楚这一点的原因。
-
如果我将
lm()更改为glm()并创建一个二元结果变量,我应该如何通过k-fold 交叉验证来完成它的ROC? -
我在下面提出了一个解决方案。
标签: r cross-validation lm roc