Как мне построить собственную метрику оценки для минимизации ошибки теста для моего сильно несбалансированного класса с использованием XGBoost? - PullRequest
0 голосов
/ 05 марта 2019

Я собрал данные о том, сколько времени требуется для выпуска продукта в конвейере выпуска.До настоящего времени 95% данных заняли <400 минут [outlier = 0].Тогда 5% данных находятся между [700,40 000] минут [outlier = 1].Я хочу построить классификатор, используя xgboost, который предсказывает, будет ли событие "выбросом" или нет.Дело в том, что это очень редко встречается с выбросами, и у меня есть около 200 точек данных, которые являются выбросами, и 3200 точек данных, которые не являются. </p>

В настоящее время без настройки моя модель может предсказать 98% [outlier = 0] случаеви 67% от [outlier = 1].Для меня важно, что модель не работает хуже при обнаружении [outlier = 0], поскольку 95% данных находится в этом наборе, но я хочу посмотреть, смогу ли я настроить модель для увеличения производительности при обнаружении [outlier =1].

Итак, у меня есть две переменные:

      ratio_wrong_0 = len(predicted_wrong_0) / len(true_0)
      ratio_wrong_1 = len(predicted_wrong_1) / len(true_1)

Поэтому я хочу, чтобы ratio_wrong_0 был ниже 5%, и минимизировать ratio_wrong_1 одновременно.У кого-нибудь есть идеи, как я могу построить такую ​​метрику для оценки во время настройки моих параметров?

1 Ответ

0 голосов
/ 05 марта 2019

Во-первых, если вы сохраните набор данных как есть, вы, скорее всего, будете всегда склонны недооценивать класс [outlier = 1], поскольку лучше прогнозировать [outlier = 0], если он неизвестен, чтоВы, кажется, понимаете.

Есть несколько простых вещей, которые вы можете сделать:

  • При выборке из представленного класса: если у вас есть 200 [outlier = 1],Вы можете взять наугад 200-иш [outlier = 0].Однако, похоже, что количество данных будет слишком низким.Однако его легко реализовать, поэтому вы можете попробовать.

  • Превышение выборки для представленного класса: прямо противоположное, где вы в основном копируете / вставляете данные из [outliers =1], чтобы получить примерно одинаковое количество вхождений.

Эти методы обычно считаются эквивалентными, однако, в вашем случае, я думаю, что избыточная выборка приведет к избыточной аппроксимации.Поскольку оба класса не имеют одинаковый диапазон возможных значений, а в диапазоне [700, 4000] 200 точек данных недостаточно для правильного обобщения.

Теперь, чтобы перейти к более сложным вещам, вымог бы попробовать начальную загрузку.Для получения более подробной информации об этой методике см. Повторная выборка начальной загрузки для несбалансированных данных при контролируемом обучении , Жорж Дюпре и Масато Кода для методологии.Это может сработать, и вы можете использовать для этого sklearn.utils.resample.Я считаю этот урок довольно хорошим.

Начальная загрузка - это метод повторной выборки, который позволяет использовать несколько сбалансированных наборов данных для обучения.Вы должны быть осторожны с переоснащением.

Об используемых метриках, вы хотите использовать AUROC, ROC или Precision / Recall.Вы можете прочитать хорошую статью о том, какие метрики использовать для несбалансированных наборов данных .

Наконец, вы можете использовать Алгоритмы Penalize, которые существенно делают так, что ошибка в наименее представленном классе (здесь [outlier = 1]) является более дорогостоящей.Иногда он используется в медицинских приложениях, где вы скорее бы поставили диагноз больному по ошибке, чем наоборот.

Эта замечательная статья, которая подводит итог всего этого , должна быть прочитана.

...