H2O AutoML留一法的性能比10倍交叉验证好得多

时间:2019-12-16 15:15:47

标签: r machine-learning cross-validation h2o automl

我有一个机器学习问题:88个实例,2个类(“ FR”类的40个实例,“ RF”类的48个实例)。我自己尝试了几种不同的算法,并通过交叉验证和留一法评估结果,我的准确度不能超过0.6。这是csv格式的数据集的链接:https://drive.google.com/open?id=1lhCOP3Aywk4kGDEStAwL6Uq1H3twSJWS

尝试使用10倍交叉验证的H2O AutoML,我获得了大致相同的结果:cross-validation-leaderbord。 但是,当我尝试留一法时,我的结果却出乎意料地好得多:leave-one-out-leaderboard

我通过 fold_column 参数执行了留一法验证,方法是为每个实例分配不同的折叠,这是代码:

train <- read.csv("training_set.csv", header = TRUE)
train$ID <- seq.int(nrow(train))

# Identify predictors and response
y <- "class"
x <- setdiff(setdiff(names(train), y), "ID")

# For binary classification, response should be a factor
train[,y] <- as.factor(train[,y])

# Run AutoML for 20 base models 
aml <- h2o.automl(x = x, y = y,
                  fold_column = "ID",
                  keep_cross_validation_predictions = TRUE,
                  keep_cross_validation_fold_assignment = TRUE,
                  sort_metric = "logloss",
                  training_frame = as.h2o(train),
                  max_models = 20,
                  seed = 1)

# View the AutoML Leaderboard
lb <- aml@leaderboard
print(lb, n = nrow(lb))

首先,我不知道这是否是执行留一法的正确方法,我还尝试将n_folds设置为88,但结果大致相同。 这里是在 aml @ leader @ model [[“ cross_validation_metrics”]] 中找到的信息:

H2OBinomialMetrics: stackedensemble
** Reported on cross-validation data. **
** 88-fold cross-validation on training data (Metrics computed for combined holdout predictions) **

MSE:  0.1248958
RMSE:  0.353406
LogLoss:  0.4083967
Mean Per-Class Error:  0.075
AUC:  0.8635417
pr_auc:  0.7441933
Gini:  0.7270833

Confusion Matrix (vertical: actual; across: predicted) for F1-optimal threshold:
       FR RF    Error   Rate
FR     34  6 0.150000  =6/40
RF      0 48 0.000000  =0/48
Totals 34 54 0.068182  =6/88

Maximum Metrics: Maximum metrics at their respective thresholds
                        metric threshold    value idx
1                       max f1  0.712894 0.941176  53
2                       max f2  0.712894 0.975610  53
3                 max f0point5  0.712894 0.909091  53
4                 max accuracy  0.712894 0.931818  53
5                max precision  0.712894 0.888889  53
6                   max recall  0.712894 1.000000  53
7              max specificity  0.739201 0.975000   0
8             max absolute_mcc  0.712894 0.869227  53
9   max min_per_class_accuracy  0.715842 0.850000  46
10 max mean_per_class_accuracy  0.712894 0.925000  53

尽管这些信息似乎是一致的,但另一件事使我认为上述混淆矩阵与 h2o.confusionMatrix(aml @ leader) 所获得的矩阵之间的区别是错误的:< / p>

Confusion Matrix (vertical: actual; across: predicted)  for max f1 @ threshold = 0.117307738035598:
       FR RF    Error    Rate
FR     18 22 0.550000  =22/40
RF      3 45 0.062500   =3/48
Totals 21 67 0.284091  =25/88

为什么两个混淆矩阵不同?他们是否应该找到相同的F1最佳阈值?

是不是有什么问题,或者只是堆叠乐团更好?

2 个答案:

答案 0 :(得分:1)

  • 只有88个数据实例,存在过拟合的风险。为了确保您不过度拟合,应将数据样本作为 holdout / test (模型/培训不会显示),然后将其余部分用于培训和交叉验证。然后,您可以使用保留数据来查看其性能是否与通过验证得出的结果相似,并查看LOO是否更好。

对于您的问题:为什么两个混淆矩阵不同?他们是否应该找到相同的F1最佳阈值?

  • 两个混淆矩阵都使用最大F1阈值。不同之处可能是数据集用于计算F1。您可以在表格“最大指标:各自指标处的最大指标”的第一行上看到该阈值。

  • aml@leader@model[["cross_validation_metrics"]]似乎正在使用验证数据,而h2o.confusionMatrix(aml@leader)正在使用训练数据。您可以尝试aml@leader@model[["training_metrics"]]来查看它是否与h2o.confusionMatrix(aml@leader)相匹配。

答案 1 :(得分:1)

这里发生了很多事情(我同意Neema关于过度拟合的评论)。正如他还提到的那样,您看到的主要问题是您正在将交叉验证指标与培训指标进行比较。 h2o.confusionMatrix()函数(和所有度量实用程序函数)默认返回训练错误。

但是,我认为h2o.confusionMatrix()函数存在一个错误,因为它不允许使用xval = TRUE参数(通常会在任何H2O指标函数中返回CV指标)。我提交了一个错误报告here