Предложения по обучению с учетом затрат в крайне несбалансированной среде


15

У меня есть набор данных с несколькими миллионами строк и ~ 100 столбцов. Я хотел бы обнаружить около 1% примеров в наборе данных, которые относятся к общему классу. У меня есть ограничение минимальной точности, но из-за очень асимметричной стоимости я не слишком заинтересован в каком-либо конкретном отзыве (пока у меня нет 10 положительных совпадений!)

Какие подходы вы бы порекомендовали в этой настройке? (ссылки на статьи приветствуются, ссылки на реализации приветствуются)

Ответы:


15

Я нашел, что Он и Гарсия (2009) являются полезным обзором обучения в несбалансированных классовых проблемах. Вот несколько определенно не всеобъемлющих вещей для рассмотрения:

Основанные на данных подходы:

Можно отобрать класс большинства или класс меньшинства. (Брейман указал, что это формально эквивалентно назначению неоднородных затрат на неправильную классификацию.) Это может вызвать проблемы: недопущение выборки может привести к тому, что учащийся упустит аспекты класса большинства; передискретизация увеличивает риск переобучения.

Существуют методы «информированной недостаточной выборки», которые уменьшают эти проблемы. Одним из них является EasyEnsemble , который независимо выбирает несколько подмножеств из класса большинства и создает несколько классификаторов, комбинируя каждое подмножество со всеми данными класса меньшинства.

SMOTE (Техника избыточной выборки синтетического меньшинства) или SMOTEBoost (комбинируя SMOTE с бустингом) создают синтетические экземпляры класса меньшинства путем создания ближайших соседей в пространстве признаков. SMOTE реализован в R в пакете DMwR (который сопровождает книгу Луиса Торго «Интеллектуальный анализ данных с использованием R, обучение с использованием конкретных примеров», CRC Press 2016 ).

Подходы к модели

Примените специфичные для класса веса в вашей функции потерь (большие веса для случаев меньшинства).

Для подходов, основанных на деревьях, вы можете использовать расстояние Хеллингера в качестве примесной функции узла, как рекомендовано в Cieslak et al. «Деревья решений по расстоянию Хеллингера надежны и нечувствительны к перекосам» ( код Weka здесь .)

Используйте классификатор одного класса , изучая (в зависимости от модели) плотность вероятности или границу для одного класса и рассматривая другой класс как выбросы.

Конечно, не используйте точность как показатель для построения модели. Каппа Коэна - разумная альтернатива.

Модельные подходы к оценке

Если ваша модель возвращает прогнозируемые вероятности или другие оценки, выберите порог принятия решения, который обеспечивает соответствующий компромисс ошибок (используя набор данных, независимый от обучения и тестирования). В R пакет OptimalCutpoints реализует ряд алгоритмов, в том числе чувствительных к стоимости, для определения отсечки.


Спасибо за подробный ответ. Я попытался занизить выборку и потерпел неудачу. Модели демонстрируют отличную производительность в выборке, но дисбаланс все еще присутствует в тестовом наборе (и реальных данных, которые я в конечном итоге буду использовать), поэтому точность OOS моделей ужасна. Я также пробовал весовые коэффициенты для каждого класса, но моя заявка включает в себя легко поддающуюся количественному определению более высокую стоимость ложных срабатываний, чем ложных отрицательных. Что касается классификаторов одного класса, я попытался установить линейный SVM (нелинейные слишком медленные), и он имеет 0 точности даже в выборке ...
em70

1
Я чувствую к тебе. Высокая точность трудна, если подавляющее большинство ваших случаев отрицательны. Я бы использовал веса, специфичные для класса (например, обратно пропорциональные доле дел в классе) для обучения, и сохранял веса, специфичные для типа ошибки, для определения порога принятия решения. Надеюсь, вы используете перекрестную проверку с каппа Коэна, а не точность для выбора модели. Я бы визуализировал плотность вероятностей для классов в калибровочных данных наряду с точностью до стороны и обогащением (точность / пропорция положительных случаев) при всех отсечениях, чтобы действительно понять доступные компромиссы.
MattBagg

Отличный ответ, спасибо. Я уже давно использую технику, аналогичную упомянутому EasyEnsemble, но сомневаюсь в этом (несмотря на ощутимую производительность на смоделированных данных). Теперь я знаю, что это имеет смысл.
ayorgo

5

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

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

Если вы используете алгоритмы машинного обучения, это может быть сложнее. Макс Кун изо всех сил пытается обобщить проблему в главе 16 «Прикладное прогнозное моделирование». Но сложная тема для подведения итогов. Если вы не хотите покупать книгу, код R доступен в пакете AppliedPredictiveModeling для этой главы и может быть достаточным в зависимости от вашего знакомства с R и используемых алгоритмов.

Обычно обсуждение вращается вокруг заниженной / избыточной выборки +/- чувствительных к стоимости алгоритмов. С такими вариациями, как Jous-Boost также возможно
Пример такого рода обсуждения: Чен и др. «Использование случайного леса для изучения несбалансированных данных» http://statistics.berkeley.edu/sites/default/files/tech-reports/666.pdf


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

Глава так себе. Сплошные усилия, но сложная тема для подведения итогов. Множество неподдерживаемых претензий опубликовано различными способами. Я считаю, что стратифицированная недостаточная выборка в случайных лесах - хорошее начало с точки зрения машинного обучения. Код находится в упаковке книги.
Чарльз

0

Вы можете взглянуть на реализацию scikit-learn. обратите внимание на аргумент class_ weight, который может иметь значения словаря весов классов или 'auto':

класс sklearn.svm.SVC (C = 1.0, ядро ​​= 'rbf', степень = 3, гамма = 0.0, coef0 = 0.0, сжатие = True, вероятность = False, tol = 0.001, cache_size = 200, class_weight = None, подробный = False, max_iter = -1, random_state = Нет)

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

scikit-learn имеет несколько других алгоритмов классификации, некоторые из которых принимают веса классов.


Можете ли вы рассказать подробнее о том, как можно использовать веса классов для достижения целей ОП? Я думаю, что это подразумевается в вашем посте, но это еще не ответ.
gung - Восстановить Монику

Да, аргумент class_weight может иметь значение «auto», если кто-то заглядывает в документацию, или он может иметь значение словаря, которое имеет весовые коэффициенты класса. В случае «авто» алгоритм обучения сам находит вес каждого класса в соответствии с количеством выборок в каждом.
Пепел
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.