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

R H2O AutoML留一比10倍交叉验证的性能要好得多,r,machine-learning,cross-validation,h2o,automl,R,Machine Learning,Cross Validation,H2o,Automl,我有一个机器学习问题:88个实例,2个类(40个“FR”类实例,48个“RF”类实例)。我自己尝试了几种不同的算法,通过交叉验证和漏掉一种来评估结果,我无法达到超过0.6的准确度。以下是csv格式的数据集链接: 使用10倍交叉验证尝试H2O AutoML时,我得到了大致相同的结果:。 但是,当我尝试忽略一个时,我意外地得到了更好的结果: 我通过fold_column参数为每个实例指定不同的fold,执行了leave one out验证,代码如下: train <- read.csv("tr

我有一个机器学习问题:88个实例,2个类(40个“FR”类实例,48个“RF”类实例)。我自己尝试了几种不同的算法,通过交叉验证和漏掉一种来评估结果,我无法达到超过0.6的准确度。以下是csv格式的数据集链接:

使用10倍交叉验证尝试H2O AutoML时,我得到了大致相同的结果:。 但是,当我尝试忽略一个时,我意外地得到了更好的结果:

我通过fold_column参数为每个实例指定不同的fold,执行了leave one out验证,代码如下:

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))
尽管这些信息似乎是一致的,但另一件让我认为有问题的事情是,上面的混淆矩阵与通过h2o.confusionMatrix获得的混淆矩阵之间存在差异(aml@leader):

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

有什么不对劲吗?或者仅仅是堆叠的合奏效果好得多?

  • 只有88个数据实例,存在过度拟合的风险。为确保您没有过度拟合,您应该将数据样本作为保持/测试(模型/培训将不显示),然后使用其余数据进行培训和交叉验证。然后,您可以使用保持数据来查看它的性能是否与您从验证中发现的类似,并查看LOO是否更好
对于您的问题:为什么这两个混淆矩阵不同?他们不应该找到相同的F1最佳阈值吗

  • 两个混淆矩阵都使用最大F1阈值。差异可能是数据集用于计算F1的值。您可以在表“最大度量:各自阈值下的最大度量”的第一行中看到阈值

  • aml@leader@模型[[“交叉验证度量”]
    似乎正在使用验证数据,并且
    h2o.confusionMatrix(aml@leader)
    正在使用培训数据。您可以试试
    aml@leader@建模[[“training_metrics”]
    以查看它是否匹配
    h2o.ConversionMatrix(aml@leader)


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


但是,我认为
h2o.confusionMatrix()
函数有一个bug,因为它不允许
xval=TRUE
参数(该参数通常会在任何h2o metrics函数中返回CV度量)。我提交了一份错误报告。

关于第一头公牛,我认为这是没有必要的,因为我认为表演中遗漏了一头公牛,我应该避免过度装配。事实上,在交叉验证度量中,他们说这些度量是交叉验证的。过度拟合是否是因为堆叠集合的元学习者没有使用交叉验证进行训练?在这种情况下,我想运行上述代码的次数和我的数据集中的实例数一样多,每次运行时删除一个实例并将其用作验证集,以便自己执行遗漏验证。
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
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