h2o 交叉验证预测摘要中 AUC NaN 值的解释
Interpretation of AUC NaN values in h2o cross-validation predictions summary
我注意到对于某些运行:
train=as.h2o(u)
mod = h2o.glm(family= "binomial", x= c(1:15), y="dc",
training_frame=train, missing_values_handling = "Skip",
lambda = 0, compute_p_values = TRUE, nfolds = 10,
keep_cross_validation_predictions= TRUE)
模型的某些 cv 迭代的 AUC 交叉验证指标摘要中存在 NaN。
例如:
print(mod@model$cross_validation_metrics_summary["auc",])
交叉验证指标摘要:
mean sd cv_1_valid cv_2_valid cv_3_valid cv_4_valid cv_5_valid cv_6_valid cv_7_valid cv_8_valid cv_9_valid cv_10_valid
auc 0.63244045 0.24962118 0.25 0.6666667 0.8095238 1.0 0.6666667 0.46666667 NaN NaN 1.0 0.2
当我设置较小的 nfolds=7 时,CV 中的 NaN 似乎不太频繁出现。
应如何解释这些 NaN 值以及 h2o 交叉验证何时输出它们?
我想当无法在迭代中正确评估 AUC 时会发生这种情况。我的训练集有 70 个完整行。
这样的AUC交叉验证结果(包含NaN)能被认为是可靠的吗?
在某些特定情况下,计算 ROC 曲线时可能会被零除,从而导致 AUC 为 NaN。很可能是由于数据量小,您有一些折叠没有真正的积极性,并导致了这个问题。
我们可以通过保留折叠列然后计算每个折叠中 dc 的值来测试它:
...
train <- as.h2o(u)
mod <- h2o.glm(family = "binomial"
, x = c(1:15)
, y = "dc"
, training_frame = train
, missing_values_handling = "Skip"
, lambda = 0
, compute_p_values = TRUE
, nfolds = 10
, keep_cross_validation_fold_assignment = TRUE
, seed = 1234)
fold <- as.data.frame(h2o.cross_validation_fold_assignment(mod))
df <- cbind(u,fold)
table(df[c("dc","fold_assignment")])
fold_assignment
dc 0 1 2 3 4 5 6 7 8 9
0 4 6 6 2 9 6 6 4 4 6
1 2 2 3 4 0 2 0 0 1 2
mod@model$cross_validation_metrics_summary["auc",]
Cross-Validation Metrics Summary:
mean sd cv_1_valid cv_2_valid cv_3_valid cv_4_valid cv_5_valid cv_6_valid cv_7_valid
auc 0.70238096 0.19357596 0.875 0.6666667 0.5 0.375 NaN 0.5833333 NaN
cv_8_valid cv_9_valid cv_10_valid
auc NaN 1.0 0.9166667
我们看到带有 NaN 的折叠与只有 dc=0 的折叠相同。
不计算 NaN,折叠的 AUC 范围很广(从 0.2 到 1)告诉我们这不是一个稳健的模型,它很可能过度拟合。你能添加更多数据吗?
我注意到对于某些运行:
train=as.h2o(u)
mod = h2o.glm(family= "binomial", x= c(1:15), y="dc",
training_frame=train, missing_values_handling = "Skip",
lambda = 0, compute_p_values = TRUE, nfolds = 10,
keep_cross_validation_predictions= TRUE)
模型的某些 cv 迭代的 AUC 交叉验证指标摘要中存在 NaN。
例如:
print(mod@model$cross_validation_metrics_summary["auc",])
交叉验证指标摘要:
mean sd cv_1_valid cv_2_valid cv_3_valid cv_4_valid cv_5_valid cv_6_valid cv_7_valid cv_8_valid cv_9_valid cv_10_valid
auc 0.63244045 0.24962118 0.25 0.6666667 0.8095238 1.0 0.6666667 0.46666667 NaN NaN 1.0 0.2
当我设置较小的 nfolds=7 时,CV 中的 NaN 似乎不太频繁出现。
应如何解释这些 NaN 值以及 h2o 交叉验证何时输出它们?
我想当无法在迭代中正确评估 AUC 时会发生这种情况。我的训练集有 70 个完整行。
这样的AUC交叉验证结果(包含NaN)能被认为是可靠的吗?
在某些特定情况下,计算 ROC 曲线时可能会被零除,从而导致 AUC 为 NaN。很可能是由于数据量小,您有一些折叠没有真正的积极性,并导致了这个问题。
我们可以通过保留折叠列然后计算每个折叠中 dc 的值来测试它:
...
train <- as.h2o(u)
mod <- h2o.glm(family = "binomial"
, x = c(1:15)
, y = "dc"
, training_frame = train
, missing_values_handling = "Skip"
, lambda = 0
, compute_p_values = TRUE
, nfolds = 10
, keep_cross_validation_fold_assignment = TRUE
, seed = 1234)
fold <- as.data.frame(h2o.cross_validation_fold_assignment(mod))
df <- cbind(u,fold)
table(df[c("dc","fold_assignment")])
fold_assignment
dc 0 1 2 3 4 5 6 7 8 9
0 4 6 6 2 9 6 6 4 4 6
1 2 2 3 4 0 2 0 0 1 2
mod@model$cross_validation_metrics_summary["auc",]
Cross-Validation Metrics Summary:
mean sd cv_1_valid cv_2_valid cv_3_valid cv_4_valid cv_5_valid cv_6_valid cv_7_valid
auc 0.70238096 0.19357596 0.875 0.6666667 0.5 0.375 NaN 0.5833333 NaN
cv_8_valid cv_9_valid cv_10_valid
auc NaN 1.0 0.9166667
我们看到带有 NaN 的折叠与只有 dc=0 的折叠相同。
不计算 NaN,折叠的 AUC 范围很广(从 0.2 到 1)告诉我们这不是一个稳健的模型,它很可能过度拟合。你能添加更多数据吗?