R: glmnet的插入符::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

What I have

数据集:

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

现在,我想使用我的模型获得一个10倍的交叉验证AUC,该模型具有最佳的alpha和lambda以及训练数据。

What I tried

我的方法是这样的,然而,我得到了错误:Something is wrong; all the Accuracy metric values are missing:

model <- train(
diabetes ~., data = train.data, method = "glmnet",
trControl = trainControl("cv",
number = 10,
classProbs = TRUE,
savePredictions = TRUE),
alpha=model$bestTune$alpha,
lambda=model$bestTune$lambda,
tuneLength = 10,
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,所选择的模型将执行次优。

插入符号有一个函数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

现在根据您想要的度量选择一个阈值并使用它。通常用于不平衡数据的指标是科恩的Kappa,尤登的J或马修斯的相关系数(MCC)。这里有一篇关于这件事的像样的论文。

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

这是一个关于如何在回归中使用插入符号的嵌套重采样的解释。需要进行一些修改才能使其适用于具有优化阈值的分类。

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

最新更新