R:glmnet 的 caret::train 函数可以在固定的 alpha 和 lambda 交叉验证 AUC 吗?

如何解决R:glmnet 的 caret::train 函数可以在固定的 alpha 和 lambda 交叉验证 AUC 吗?

我想使用 caret::train

计算具有最佳 alpha 和 lambda 的弹性网络回归模型的 10 倍交叉验证 AUC

https://stats.stackexchange.com/questions/69638/does-caret-train-function-for-glmnet-cross-validate-for-both-alpha-and-lambda/69651 解释了如何使用 caret::train

交叉验证 alpha 和 lambda

我关于交叉验证的问题已关闭,因为它已被归类为编程问题:https://stats.stackexchange.com/questions/505865/r-calculate-the-10-fold-crossvalidated-auc-with-glmnet-and-given-alpha-and-lamb?noredirect=1#comment934491_505865

我有什么

数据集:

library(tidyverse)
library(caret)
library(glmnet)
library(mlbench)

# example data
data(PimaIndiansDiabetes,package="mlbench")

# make a training set
set.seed(2323)
train.data <- PimaIndiansDiabetes

我的模型:

# build a model using the training set
set.seed(2323)
model <- train(
  diabetes ~.,data = train.data,method = "glmnet",trControl = trainControl("cv",number = 10,classprobs = TRUE,savePredictions = TRUE),tuneLength = 10,metric="ROC"
)

这里出现错误

Warning message:
In train.default(x,y,weights = w,...) :
  The metric "ROC" was not in the result set. Accuracy will be used instead.

如果我忽略错误,最好的 alpha 和 lambda 将是:

model$bestTune
   alpha      lambda
11   0.2 0.002926378

现在我想使用我的模型和最好的 alpha 和 lambda 以及训练数据来获得 10 倍交叉验证的 AUC。

我的尝试

我的方法是这样的,但是,我收到错误Something is wrong; all the Accuracy metric values are missing:

model <- train(
  diabetes ~.,alpha=model$bestTune$alpha,lambda=model$bestTune$lambda,metric="ROC"
)

如何使用最优 alpha 和 lambda 以及训练数据计算交叉验证的 AUC?

我仍然不确定如何交叉验证 AUC,而不是准确性。

感谢您的帮助。

解决方法

您打算使用“ROC” - ROC 曲线下的面积来选择最佳调整参数,但您没有指定保存此指标的 twoClassSummary()。这就是警告的内容 通知你

Warning message:
In train.default(x,y,weights = w,...) :
  The metric "ROC" was not in the result set. Accuracy will be used instead.

执行车削:

library(tidyverse)
library(caret)
library(glmnet)
library(mlbench)

data(PimaIndiansDiabetes,package="mlbench")

set.seed(2323)
train.data <- PimaIndiansDiabetes

set.seed(2323)
model <- train(
  diabetes ~.,data = train.data,method = "glmnet",trControl = trainControl("cv",number = 10,classProbs = TRUE,savePredictions = TRUE,summaryFunction = twoClassSummary),tuneLength = 10,metric="ROC" #ROC metric is in twoClassSummary
)

由于您指定了 classProbs = TRUEsavePredictions = TRUE,您可以根据预测计算任何指标。 计算精度:

model$pred %>%
  filter(alpha == model$bestTune$alpha,#filter predictions for best tuning parameters
         lambda == model$bestTune$lambda) %>%
  group_by(Resample) %>% #group by fold
  summarise(acc = sum(pred == obs)/n()) #calculate metric
#output
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 10 x 2
   Resample   acc
   <chr>    <dbl>
 1 Fold01   0.740
 2 Fold02   0.753
 3 Fold03   0.818
 4 Fold04   0.776
 5 Fold05   0.779
 6 Fold06   0.753
 7 Fold07   0.766
 8 Fold08   0.792
 9 Fold09   0.727
10 Fold10   0.789

这为您提供了每折指标。获得平均性能

model$pred %>%
  filter(alpha == model$bestTune$alpha,lambda == model$bestTune$lambda) %>%
  group_by(Resample) %>%
  summarise(acc = sum(pred == obs)/n()) %>%
  pull(acc) %>%
  mean
#output
0.769566

当 ROC 用作选择指标时,超参数会针对所有决策阈值进行优化。在许多情况下,所选择的模型在使用 0.5 的默认决策阈值时会执行次优。

Caret 有一个函数 thresholder()

它将根据超过指定决策阈值的重采样数据计算许多指标。

thresholder(model,seq(0,1,length.out = 10)) #in reality I would use length.out = 100

#输出

alpha     lambda prob_threshold Sensitivity Specificity Pos Pred Value Neg Pred Value Precision Recall        F1 Prevalence Detection Rate Detection Prevalence Balanced Accuracy  Accuracy
1    0.1 0.03607775      0.0000000       1.000  0.00000000      0.6510595            NaN 0.6510595  1.000 0.7886514  0.6510595      0.6510595            1.0000000         0.5000000 0.6510595
2    0.1 0.03607775      0.1111111       0.994  0.02621083      0.6557464      0.7380952 0.6557464  0.994 0.7901580  0.6510595      0.6471463            0.9869617         0.5101054 0.6562714
3    0.1 0.03607775      0.2222222       0.986  0.15270655      0.6850874      0.8711111 0.6850874  0.986 0.8082906  0.6510595      0.6419344            0.9375256         0.5693533 0.6952837
4    0.1 0.03607775      0.3333333       0.964  0.32421652      0.7278778      0.8406807 0.7278778  0.964 0.8290127  0.6510595      0.6276316            0.8633459         0.6441083 0.7408578
5    0.1 0.03607775      0.4444444       0.928  0.47364672      0.7674158      0.7903159 0.7674158  0.928 0.8395895  0.6510595      0.6041866            0.7877990         0.7008234 0.7695147
6    0.1 0.03607775      0.5555556       0.862  0.59002849      0.7970454      0.7053968 0.7970454  0.862 0.8274687  0.6510595      0.5611928            0.7043575         0.7260142 0.7669686
7    0.1 0.03607775      0.6666667       0.742  0.75740741      0.8521972      0.6114289 0.8521972  0.742 0.7926993  0.6510595      0.4830827            0.5677204         0.7497037 0.7473855
8    0.1 0.03607775      0.7777778       0.536  0.90284900      0.9156149      0.5113452 0.9156149  0.536 0.6739140  0.6510595      0.3489918            0.3828606         0.7194245 0.6640636
9    0.1 0.03607775      0.8888889       0.198  0.98119658      0.9573810      0.3967404 0.9573810  0.198 0.3231917  0.6510595      0.1289474            0.1354751         0.5895983 0.4713602
10   0.1 0.03607775      1.0000000       0.000  1.00000000            NaN      0.3489405       NaN  0.000       NaN  0.6510595      0.0000000            0.0000000         0.5000000 0.3489405
       Kappa          J      Dist
1  0.0000000 0.00000000 1.0000000
2  0.0258717 0.02021083 0.9738516
3  0.1699809 0.13870655 0.8475624
4  0.3337322 0.28821652 0.6774055
5  0.4417759 0.40164672 0.5329805
6  0.4692998 0.45202849 0.4363768
7  0.4727251 0.49940741 0.3580090
8  0.3726156 0.43884900 0.4785352
9  0.1342372 0.17919658 0.8026597
10 0.0000000 0.00000000 1.0000000

现在根据您想要的指标选择一个阈值并使用它。通常用于不平衡数据 Cohen's KappaYouden's JMatthews correlation coefficient (MCC) 的指标。这是关于此事的一个体面的paper

请注意,由于此数据用于寻找最佳阈值,因此以这种方式获得的性能将存在乐观偏差。为了评估选择的决策阈值的性能,最好使用几个独立的测试集。换句话说,我建议使用嵌套重采样,您可以使用内部折叠优化参数和阈值,并对外部折叠进行评估。

Here is an explanation 关于如何使用带插入符号的嵌套重采样和回归。需要进行一些修改才能使其与优化阈值的分类一起工作。

请注意,这不是选择最佳决策阈值的唯一方法。另一种方法是先验地选择所需的度量(例如 MCC)并将决策阈值视为一个超参数,该超参数将与所有其他超参数一起进行调整。我相信创建自定义模型时插入符号不支持这一点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?