Я считаю, что обнаружил ошибку (или ограничение) в метриках проверки h2o.ai AutoML StackedEnsemble.
При запуске AutoML только с одним типом модели (в данном случае XGBoost) и перекрестной проверкой с n-кратным увеличением я с удивлением увидел, что BestOfFamily StackedEnsemble показал лучшие результаты, чем любая из отдельных моделей XGBoost. Что не должно быть возможным, поскольку BestOfFamily StackedEnsemble в этом сценарии содержит только одну модель, ведущую модель XGBoost, и поэтому должна иметь идентичные метрики проверки для нее. Я подтвердил, проверив, что StackedEnsemble действительно содержит только лучшую модель XGBoost, но имеет другие и превосходные метрики проверки.
Моя лучшая гипотеза для этого заключается в том, что алгоритм metalearner (по крайней мере, GLM по умолчанию) не принимает с учетом веса, который я присвоил тренировочным данным. Некоторые из наблюдений в данных обучения связаны между собой, и мне нужно было уменьшить их вес по сравнению с более уникальными наблюдениями (если это не имеет смысла или неправильно, не стесняйтесь исправлять, поскольку я довольно любитель, но это рядом с точка). Когда я обнаружил эту аномалию, я использовал только XGBoost, но я использую AutoML с несколькими категориями моделей, и я обеспокоен тем, что проблема повлияет на эти составные ансамбли и их ранжирование.
Так что, к сожалению, если это не будет объяснено или исправлено, я не смогу использовать составные ансамбли в своих текущих усилиях, так как я не могу доверять метрикам проверки. У кого-нибудь есть такое объяснение или метод решения проблемы?
h2o Версия: 3.28.0.1
Используется в сочетании с версией R: 3.6.1
По запросу, ниже приведен некоторый быстро скомпонованный R-код для генерации синтетических данных c и применения AutoML, который должен воспроизвести проблему.
Дальнейшее редактирование: когда в этом примере все весовые коэффициенты совпадают, метрика проверки c для Best of Family Stacked Ensemble ближе, но все же не идентичен, единственной модели XGBoost, которую содержит. Я не понимаю, как это может быть правдой, поскольку составной ансамбль одной модели должен иметь выходные данные, идентичные этой одной модели, верно?
h2o.init()
DF<-data.frame(c(rep(T,1000), rep(F,1000)))
colnames(DF)<-"RESULT"
DF$WEIGHT<-rep(c(rep(1,500), rep(2,500)), 2)
DF[which(DF$RESULT & DF$WEIGHT==1), "VAR_1"]<-rnorm(length(which(DF$RESULT & DF$WEIGHT==1)), mean = 1, sd = 1)
DF[which(DF$RESULT & DF$WEIGHT==2), "VAR_1"]<-rnorm(length(which(DF$RESULT & DF$WEIGHT==2)), mean = 1, sd = 2)
DF[which(!DF$RESULT & DF$WEIGHT==1), "VAR_1"]<-rnorm(length(which(!DF$RESULT & DF$WEIGHT==1)), mean = 2, sd = 1)
DF[which(!DF$RESULT & DF$WEIGHT==2), "VAR_1"]<-rnorm(length(which(!DF$RESULT & DF$WEIGHT==2)), mean = 2, sd = 2)
DF[which(DF$RESULT & DF$WEIGHT==1), "VAR_2"]<-rnorm(length(which(DF$RESULT & DF$WEIGHT==1)), mean = 1, sd = 1)
DF[which(DF$RESULT & DF$WEIGHT==2), "VAR_2"]<-rnorm(length(which(DF$RESULT & DF$WEIGHT==2)), mean = 1, sd = 2)
DF[which(!DF$RESULT & DF$WEIGHT==1), "VAR_2"]<-rnorm(length(which(!DF$RESULT & DF$WEIGHT==1)), mean = 2, sd = 1)
DF[which(!DF$RESULT & DF$WEIGHT==2), "VAR_2"]<-rnorm(length(which(!DF$RESULT & DF$WEIGHT==2)), mean = 2, sd = 2)
DF[which(DF$RESULT & DF$WEIGHT==1), "VAR_3"]<-rnorm(length(which(DF$RESULT & DF$WEIGHT==1)), mean = 1, sd = 1)
DF[which(DF$RESULT & DF$WEIGHT==2), "VAR_3"]<-rnorm(length(which(DF$RESULT & DF$WEIGHT==2)), mean = 1, sd = 2)
DF[which(!DF$RESULT & DF$WEIGHT==1), "VAR_3"]<-rnorm(length(which(!DF$RESULT & DF$WEIGHT==1)), mean = 2, sd = 1)
DF[which(!DF$RESULT & DF$WEIGHT==2), "VAR_3"]<-rnorm(length(which(!DF$RESULT & DF$WEIGHT==2)), mean = 2, sd = 2)
TRAIN<-as.h2o(DF, "TRAIN")
AUTOML<-h2o.automl(project_name = "ERROR_TEST",
training_frame = "TRAIN",
y="RESULT",
weights_column = "WEIGHT",
stopping_metric = "logloss",
modeling_plan = list(list(name="XGBoost", alias='defaults'), "StackedEnsemble"),
sort_metric = "logloss",
verbosity = "info")
print(AUTOML@leaderboard)