插入符号中训练数据的 ROC 曲线
ROC curve from training data in caret
使用R包caret,如何根据train()函数的交叉验证结果生成ROC曲线?
说,我执行以下操作:
data(Sonar)
ctrl <- trainControl(method="cv",
summaryFunction=twoClassSummary,
classProbs=T)
rfFit <- train(Class ~ ., data=Sonar,
method="rf", preProc=c("center", "scale"),
trControl=ctrl)
训练函数遍历 mtry 参数范围并计算 ROC AUC。我想查看相关的 ROC 曲线 -- 我该怎么做?
注意:如果采样使用的方法是LOOCV,那么rfFit
会在rfFit$pred
槽中包含一个非空数据帧,这似乎正是我所需要的。但是,我需要 "cv" 方法(k 折验证)而不是 LOO。
另外:不,roc
以前版本的插入符号中包含的功能不是答案——这是一个低级功能,如果没有就不能使用它每个交叉验证样本的预测概率。
ctrl
中只缺少 savePredictions = TRUE
参数(这也适用于其他重采样方法):
library(caret)
library(mlbench)
data(Sonar)
ctrl <- trainControl(method="cv",
summaryFunction=twoClassSummary,
classProbs=T,
savePredictions = T)
rfFit <- train(Class ~ ., data=Sonar,
method="rf", preProc=c("center", "scale"),
trControl=ctrl)
library(pROC)
# Select a parameter setting
selectedIndices <- rfFit$pred$mtry == 2
# Plot:
plot.roc(rfFit$pred$obs[selectedIndices],
rfFit$pred$M[selectedIndices])
也许我遗漏了什么,但一个小问题是 train
估计的 AUC 值总是与 plot.roc
和 pROC::auc
略有不同(绝对差异 < 0.005),尽管 twoClassSummary
使用 pROC::auc
来估计 AUC。 编辑: 我假设发生这种情况是因为来自 train
的 ROC 是使用单独的 CV 集的 AUC 的平均值,在这里我们同时计算所有重新采样的 AUC 以获得整体 AUC.
更新 由于这引起了一些关注,这里有一个使用 plotROC::geom_roc()
for ggplot2
的解决方案:
library(ggplot2)
library(plotROC)
ggplot(rfFit$pred[selectedIndices, ],
aes(m = M, d = factor(obs, levels = c("R", "M")))) +
geom_roc(hjust = -0.4, vjust = 1.5) + coord_equal()
在这里,我正在修改@thei1e 的情节,其他人可能会觉得有帮助。
训练模型并进行预测
library(caret)
library(ggplot2)
library(mlbench)
library(plotROC)
data(Sonar)
ctrl <- trainControl(method="cv", summaryFunction=twoClassSummary, classProbs=T,
savePredictions = T)
rfFit <- train(Class ~ ., data=Sonar, method="rf", preProc=c("center", "scale"),
trControl=ctrl)
# Select a parameter setting
selectedIndices <- rfFit$pred$mtry == 2
更新的 ROC 曲线图
g <- ggplot(rfFit$pred[selectedIndices, ], aes(m=M, d=factor(obs, levels = c("R", "M")))) +
geom_roc(n.cuts=0) +
coord_equal() +
style_roc()
g + annotate("text", x=0.75, y=0.25, label=paste("AUC =", round((calc_auc(g))$AUC, 4)))
2019 年更新。这是最简单的方法https://cran.r-project.org/web/packages/MLeval/index.html。从 Caret 对象和概率中获取最佳参数,然后计算许多指标和绘图,包括:ROC 曲线、PR 曲线、PRG 曲线和校准曲线。您可以将不同模型的多个对象放入其中以比较结果。
library(MLeval)
library(caret)
data(Sonar)
ctrl <- trainControl(method="cv",
summaryFunction=twoClassSummary,
classProbs=T)
rfFit <- train(Class ~ ., data=Sonar,
method="rf", preProc=c("center", "scale"),
trControl=ctrl)
## run MLeval
res <- evalm(rfFit)
## get ROC
res$roc
## get calibration curve
res$cc
## get precision recall gain curve
res$prg
使用R包caret,如何根据train()函数的交叉验证结果生成ROC曲线?
说,我执行以下操作:
data(Sonar)
ctrl <- trainControl(method="cv",
summaryFunction=twoClassSummary,
classProbs=T)
rfFit <- train(Class ~ ., data=Sonar,
method="rf", preProc=c("center", "scale"),
trControl=ctrl)
训练函数遍历 mtry 参数范围并计算 ROC AUC。我想查看相关的 ROC 曲线 -- 我该怎么做?
注意:如果采样使用的方法是LOOCV,那么rfFit
会在rfFit$pred
槽中包含一个非空数据帧,这似乎正是我所需要的。但是,我需要 "cv" 方法(k 折验证)而不是 LOO。
另外:不,roc
以前版本的插入符号中包含的功能不是答案——这是一个低级功能,如果没有就不能使用它每个交叉验证样本的预测概率。
ctrl
中只缺少 savePredictions = TRUE
参数(这也适用于其他重采样方法):
library(caret)
library(mlbench)
data(Sonar)
ctrl <- trainControl(method="cv",
summaryFunction=twoClassSummary,
classProbs=T,
savePredictions = T)
rfFit <- train(Class ~ ., data=Sonar,
method="rf", preProc=c("center", "scale"),
trControl=ctrl)
library(pROC)
# Select a parameter setting
selectedIndices <- rfFit$pred$mtry == 2
# Plot:
plot.roc(rfFit$pred$obs[selectedIndices],
rfFit$pred$M[selectedIndices])
也许我遗漏了什么,但一个小问题是 train
估计的 AUC 值总是与 plot.roc
和 pROC::auc
略有不同(绝对差异 < 0.005),尽管 twoClassSummary
使用 pROC::auc
来估计 AUC。 编辑: 我假设发生这种情况是因为来自 train
的 ROC 是使用单独的 CV 集的 AUC 的平均值,在这里我们同时计算所有重新采样的 AUC 以获得整体 AUC.
更新 由于这引起了一些关注,这里有一个使用 plotROC::geom_roc()
for ggplot2
的解决方案:
library(ggplot2)
library(plotROC)
ggplot(rfFit$pred[selectedIndices, ],
aes(m = M, d = factor(obs, levels = c("R", "M")))) +
geom_roc(hjust = -0.4, vjust = 1.5) + coord_equal()
在这里,我正在修改@thei1e 的情节,其他人可能会觉得有帮助。
训练模型并进行预测
library(caret)
library(ggplot2)
library(mlbench)
library(plotROC)
data(Sonar)
ctrl <- trainControl(method="cv", summaryFunction=twoClassSummary, classProbs=T,
savePredictions = T)
rfFit <- train(Class ~ ., data=Sonar, method="rf", preProc=c("center", "scale"),
trControl=ctrl)
# Select a parameter setting
selectedIndices <- rfFit$pred$mtry == 2
更新的 ROC 曲线图
g <- ggplot(rfFit$pred[selectedIndices, ], aes(m=M, d=factor(obs, levels = c("R", "M")))) +
geom_roc(n.cuts=0) +
coord_equal() +
style_roc()
g + annotate("text", x=0.75, y=0.25, label=paste("AUC =", round((calc_auc(g))$AUC, 4)))
2019 年更新。这是最简单的方法https://cran.r-project.org/web/packages/MLeval/index.html。从 Caret 对象和概率中获取最佳参数,然后计算许多指标和绘图,包括:ROC 曲线、PR 曲线、PRG 曲线和校准曲线。您可以将不同模型的多个对象放入其中以比较结果。
library(MLeval)
library(caret)
data(Sonar)
ctrl <- trainControl(method="cv",
summaryFunction=twoClassSummary,
classProbs=T)
rfFit <- train(Class ~ ., data=Sonar,
method="rf", preProc=c("center", "scale"),
trControl=ctrl)
## run MLeval
res <- evalm(rfFit)
## get ROC
res$roc
## get calibration curve
res$cc
## get precision recall gain curve
res$prg