Как обрабатывать искаженный ответ в алгоритмах H2O

В моем проблемном наборе данных переменная ответа сильно смещена влево. Я попытался подогнать модель под h2o.randomForest() и h2o.gbm(), как показано ниже. Я могу задать настройки min_split_improvement и min_rows, чтобы избежать переобучения в этих двух случаях. Но с этими моделями я вижу очень большие ошибки в наблюдениях за хвостом. Я пытался использовать weights_column для избыточной выборки хвостовых наблюдений и недостаточной выборки других наблюдений, но это не помогает.

h2o.model <- h2o.gbm(x = predictors, y = response, training_frame = train,valid = valid, seed = 1,
                              ntrees =150, max_depth = 10, min_rows = 2, model_id = "GBM_DD", balance_classes = T, nbins = 20, stopping_metric = "MSE", 
                     stopping_rounds = 10, min_split_improvement = 0.0005)


h2o.model <- h2o.randomForest(x = predictors, y = response, training_frame = train,valid = valid, seed = 1,ntrees =150, max_depth = 10, min_rows = 2, model_id = "DRF_DD", balance_classes = T, nbins = 20, stopping_metric = "MSE", 
                     stopping_rounds = 10, min_split_improvement = 0.0005)

Я попробовал функцию h2o.automl() пакета h2o для решения проблемы для лучшей производительности. Однако я вижу значительное переоснащение. Я не знаю никаких параметров в h2o.automl() для управления переоснащением.

Кто-нибудь знает, как избежать переобучения с помощью h2o.automl()?

ИЗМЕНИТЬ

Распределение преобразованного ответа log приведено ниже. После предложения Эрин введите здесь описание изображения

EDIT2: Распространение исходного ответа.

введите здесь описание изображения


person deepAgrawal    schedule 18.01.2018    source источник
comment
Возможно, попробуйте преобразовать проблемные функции, у каретки есть полезная функция BoxCoxTrans, которая может помочь с асимметрией.   -  person missuse    schedule 19.01.2018
comment
Это похоже на распределение Possion, поэтому я бы либо использовал линейную модель, в которой я указал распределение, либо попытался бы использовать повышение, которое справится с этим. Вот что делает бустинг: i2.wp.com/freakonometrics.hypotheses.org/files/2015/07/   -  person Esben Eickhardt    schedule 25.01.2018


Ответы (2)


H2O AutoML использует алгоритмы H2O (например, RF, GBM) внизу, поэтому, если вы не можете получить там хорошие модели, вы столкнетесь с теми же проблемами, что и при использовании AutoML. Я не уверен, что назвал бы это переоснащением - скорее ваши модели плохо предсказывают выбросы.

Я рекомендую регистрировать вашу переменную ответа — это полезно делать, когда у вас искаженный ответ. В будущем H2O AutoML попытается автоматически обнаруживать искаженный ответ и вести журнал, но это не функция текущей версии (H2O 3.16.*).

Вот немного подробнее, если вы не знакомы с этим процессом. Сначала создайте новый столбец, например. log_response следующим образом и используйте его в качестве ответа при обучении (в RF, GBM или AutoML):

train[,"log_response"] <- h2o.log(train[,response])

Предупреждения. Если в вашем ответе есть нули, вместо них следует использовать h2o.log1p(). Убедитесь, что исходный ответ не включен в ваши предикторы. В вашем случае вам не нужно ничего менять, потому что вы уже явно указываете предикторы с помощью вектора predictors.

Имейте в виду, что когда вы регистрируете ответ, ваши прогнозы и показатели модели будут соответствовать логарифмической шкале. Итак, если вам нужно преобразовать ваши прогнозы обратно в нормальный масштаб, например:

model <- h2o.randomForest(x = predictors, y = "log_response", 
                          training_frame = train, valid = valid)
log_pred <- h2o.predict(model, test)
pred <- h2o.exp(log_pred)

Это дает вам прогнозы, но если вы также хотите увидеть метрики, вам придется вычислять их с помощью функции h2o.make_metrics() с использованием новых предварительных значений, а не извлекать метрики из модели.

perf <- h2o.make_metrics(predicted = pred, actual = test[,response])
h2o.mse(perf)

Вы можете попробовать это с помощью RF, как я показал выше, или GBM, или с AutoML (что должно обеспечить лучшую производительность, чем один RF или GBM).

Надеюсь, это поможет улучшить производительность ваших моделей!

person Erin LeDell    schedule 18.01.2018
comment
Я думал, что преобразование данных не поможет с ансамблевыми моделями, поскольку они являются нелинейными моделями и могут фиксировать эти закономерности. Производительность на задней стороне улучшается, хотя и не так сильно, как хотелось бы. Я также поиграю с функцией веса, чтобы посмотреть, поможет ли это. Возможно, я использовал недостаточно большой вес. - person deepAgrawal; 20.01.2018
comment
Вы трансформируете целевой отклик, а не характеристики (совсем разные вещи). После регистрации ответа распределение выглядит более нормальным? - person Erin LeDell; 20.01.2018
comment
Он менее перекошенный, но все же не выглядит нормальным. Я обновил свой исходный пост преобразованным дистрибутивом. - person deepAgrawal; 20.01.2018
comment
Да, это все еще относительно перекошено. У вас должны быть действительно большие выбросы в исходном ответе. Мне было бы интересно увидеть распространение исходного ответа... - person Erin LeDell; 22.01.2018
comment
Привет, Эрин, извини за задержку. Я только что обновил свой пост с исходным распределением ответов. - person deepAgrawal; 22.01.2018

Когда ваша целевая переменная искажена, mse не является хорошей метрикой для использования. Я бы попробовал изменить функцию потерь, потому что gbm пытается подогнать модель под градиент функции потерь, и вы хотите убедиться, что используете правильное распределение. если у вас есть всплеск на нуле и смещенная вправо положительная цель, вероятно, Tweedie будет лучшим вариантом.

person EmmaStin    schedule 09.01.2019