预测 AUC 1 的集成模型
Ensemble model predicting AUC 1
我正在尝试将 3 个模型组合成一个整体模型:
- 模型 1 - XGBoost
- 模型 2 - 随机森林
- 模型 3 - 逻辑回归
注意:这里的所有代码都使用了 caret 包的 train() 函数。
> Bayes_model
No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 75305, 75305, 75306, 75305, 75306, 75307, ...
Resampling results:
ROC Sens Spec
0.5831236 1 0
>linear_cv_model
No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 75306, 75305, 75305, 75306, 75306, 75305, ...
Resampling results:
ROC Sens Spec
0.5776342 1 0
>rf_model_best
No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 75305, 75305, 75306, 75305, 75306, 75307, ...
Resampling results:
ROC Sens Spec
0.5551996 1 0
这 3 个模型在 55-60 范围内的 AUC 非常差,但相关性并不高,因此我希望将它们集成在一起。这是 R 中的基本代码:
Bayes_pred = predict(Bayes_model,train,type="prob")[,2]
linear_pred = predict(linear_cv_model,train,type="prob")[,2]
rf_pred = predict(rf_model_best,train,type="prob")[,2]
stacked = cbind(Bayes_pred,linear_pred,rf_pred,train[,"target"])
所以这会产生一个包含 4 列的数据框,三个模型预测和目标。我认为现在的想法是 运行 这三个预测变量的另一个元模型,但是当我这样做时,无论我尝试 XGBoost 超参数的什么组合,我都会得到 1 的 AUC,所以我知道出了点问题。
这个设置在概念上是否不正确?
meta_model = train(target~ ., data = stacked,
method = "xgbTree",
metric = "ROC",
trControl = trainControl(method = "cv",number = 10,classProbs = TRUE,
summaryFunction = twoClassSummary
),
na.action=na.pass,
tuneGrid = grid
)
结果:
>meta_model
No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 75306, 75306, 75307, 75305, 75306, 75305, ...
Resampling results:
ROC Sens Spec
1 1 1
我觉得 CV 折叠完美的 AUC 绝对表明数据错误。在这个元模型上尝试逻辑回归时,我也得到了完美的分离。就是说不通。
> summary(stacked)
Bayes_pred linear_pred rf_pred Target
Min. :0.01867 Min. :0.02679 Min. :0.00000 No :74869
1st Qu.:0.08492 1st Qu.:0.08624 1st Qu.:0.01587 Yes: 8804
Median :0.10297 Median :0.10339 Median :0.04762
Mean :0.10520 Mean :0.10522 Mean :0.11076
3rd Qu.:0.12312 3rd Qu.:0.12230 3rd Qu.:0.07937
Max. :0.50483 Max. :0.25703 Max. :0.88889
我知道这不是可重现的代码,但我认为这是一个不依赖于数据集的问题。如上所示,我有三个不同的预测,并且肯定没有单独的大 AUC 值。结合起来我应该看到一些改进但不是完美的分离。
编辑:使用 T. Scharf 提供的非常有用的建议,这是我如何获取折叠预测以在元模型中使用的方法。预测将存储在 "pred" 下的模型中,但预测不是按原始顺序排列的。您需要重新排序它们才能正确堆叠。
使用 dplyr 的 arrange() 函数,这就是我得到贝叶斯模型预测的方式:
Bayes_pred = arrange(as.data.frame(Bayes_model$pred)[,c("Yes","rowIndex")],rowIndex)[,1]
在我的例子中,"Bayes_model" 是插入符号序列对象,"Yes" 是我正在建模的目标 class。
这是正在发生的事情
当你这样做时
Bayes_pred = predict(Bayes_model,train,type="prob")[,2]
linear_pred = predict(linear_cv_model,train,type="prob")[,2]
rf_pred = predict(rf_model_best,train,type="prob")[,2]
这就是问题所在
您需要折叠预测或测试预测作为训练元模型的输入。
您目前正在使用您训练过的模型,以及您训练它们所用的数据。这将产生过于乐观的预测,您现在正在将这些预测提供给元模型进行训练。
A good rule of thumb is to NEVER call predict on data with a model
that has already seen that data, nothing good can happen.
这是您需要做的:
当您训练最初的 3 个模型时,使用 method = cv
和 savePredictions = TRUE
这将保留折叠外预测,可用于训练元模型。
为了让自己相信元模型的输入数据非常乐观,请为该对象的 3 列计算一个个体 AUC
:
stacked = cbind(Bayes_pred,linear_pred,rf_pred,train[,"target"])
与目标相比——它们会非常高,这就是为什么您的元模型如此出色。它使用了非常好的输入。
希望这对您有所帮助,元建模很难...
我正在尝试将 3 个模型组合成一个整体模型:
- 模型 1 - XGBoost
- 模型 2 - 随机森林
- 模型 3 - 逻辑回归
注意:这里的所有代码都使用了 caret 包的 train() 函数。
> Bayes_model
No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 75305, 75305, 75306, 75305, 75306, 75307, ...
Resampling results:
ROC Sens Spec
0.5831236 1 0
>linear_cv_model
No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 75306, 75305, 75305, 75306, 75306, 75305, ...
Resampling results:
ROC Sens Spec
0.5776342 1 0
>rf_model_best
No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 75305, 75305, 75306, 75305, 75306, 75307, ...
Resampling results:
ROC Sens Spec
0.5551996 1 0
这 3 个模型在 55-60 范围内的 AUC 非常差,但相关性并不高,因此我希望将它们集成在一起。这是 R 中的基本代码:
Bayes_pred = predict(Bayes_model,train,type="prob")[,2]
linear_pred = predict(linear_cv_model,train,type="prob")[,2]
rf_pred = predict(rf_model_best,train,type="prob")[,2]
stacked = cbind(Bayes_pred,linear_pred,rf_pred,train[,"target"])
所以这会产生一个包含 4 列的数据框,三个模型预测和目标。我认为现在的想法是 运行 这三个预测变量的另一个元模型,但是当我这样做时,无论我尝试 XGBoost 超参数的什么组合,我都会得到 1 的 AUC,所以我知道出了点问题。
这个设置在概念上是否不正确?
meta_model = train(target~ ., data = stacked,
method = "xgbTree",
metric = "ROC",
trControl = trainControl(method = "cv",number = 10,classProbs = TRUE,
summaryFunction = twoClassSummary
),
na.action=na.pass,
tuneGrid = grid
)
结果:
>meta_model
No pre-processing
Resampling: Cross-Validated (10 fold)
Summary of sample sizes: 75306, 75306, 75307, 75305, 75306, 75305, ...
Resampling results:
ROC Sens Spec
1 1 1
我觉得 CV 折叠完美的 AUC 绝对表明数据错误。在这个元模型上尝试逻辑回归时,我也得到了完美的分离。就是说不通。
> summary(stacked)
Bayes_pred linear_pred rf_pred Target
Min. :0.01867 Min. :0.02679 Min. :0.00000 No :74869
1st Qu.:0.08492 1st Qu.:0.08624 1st Qu.:0.01587 Yes: 8804
Median :0.10297 Median :0.10339 Median :0.04762
Mean :0.10520 Mean :0.10522 Mean :0.11076
3rd Qu.:0.12312 3rd Qu.:0.12230 3rd Qu.:0.07937
Max. :0.50483 Max. :0.25703 Max. :0.88889
我知道这不是可重现的代码,但我认为这是一个不依赖于数据集的问题。如上所示,我有三个不同的预测,并且肯定没有单独的大 AUC 值。结合起来我应该看到一些改进但不是完美的分离。
编辑:使用 T. Scharf 提供的非常有用的建议,这是我如何获取折叠预测以在元模型中使用的方法。预测将存储在 "pred" 下的模型中,但预测不是按原始顺序排列的。您需要重新排序它们才能正确堆叠。
使用 dplyr 的 arrange() 函数,这就是我得到贝叶斯模型预测的方式:
Bayes_pred = arrange(as.data.frame(Bayes_model$pred)[,c("Yes","rowIndex")],rowIndex)[,1]
在我的例子中,"Bayes_model" 是插入符号序列对象,"Yes" 是我正在建模的目标 class。
这是正在发生的事情
当你这样做时
Bayes_pred = predict(Bayes_model,train,type="prob")[,2]
linear_pred = predict(linear_cv_model,train,type="prob")[,2]
rf_pred = predict(rf_model_best,train,type="prob")[,2]
这就是问题所在
您需要折叠预测或测试预测作为训练元模型的输入。
您目前正在使用您训练过的模型,以及您训练它们所用的数据。这将产生过于乐观的预测,您现在正在将这些预测提供给元模型进行训练。
A good rule of thumb is to NEVER call predict on data with a model that has already seen that data, nothing good can happen.
这是您需要做的:
当您训练最初的 3 个模型时,使用 method = cv
和 savePredictions = TRUE
这将保留折叠外预测,可用于训练元模型。
为了让自己相信元模型的输入数据非常乐观,请为该对象的 3 列计算一个个体 AUC
:
stacked = cbind(Bayes_pred,linear_pred,rf_pred,train[,"target"])
与目标相比——它们会非常高,这就是为什么您的元模型如此出色。它使用了非常好的输入。
希望这对您有所帮助,元建模很难...