h2o.ai AutoML StackedEnsemble, предоставляющий ложно улучшенные показатели проверки - PullRequest
1 голос
/ 06 января 2020

Я считаю, что обнаружил ошибку (или ограничение) в метриках проверки 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)

...