我有一个机器学习问题: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最佳阈值?
是不是有什么问题,或者只是堆叠乐团更好?
答案 0 :(得分:1)
对于您的问题:为什么两个混淆矩阵不同?他们是否应该找到相同的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。