Наивный Байес: неравномерный набор данных испытаний

Я использую scikit-learn Multinomial классификатор Naive Bayes для классификации двоичного текста (классификатор сообщает мне, относится ли документ к категории X или нет). Я использую сбалансированный набор данных для обучения своей модели и сбалансированного набора тестов для тестирования, и результаты очень перспективны.

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

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

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

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

Любые советы приветствуются.

Ответ 1

Вы столкнулись с одной из проблем с классификацией с очень несбалансированным распределением классов. Я должен не соглашаться с теми, которые заявляют, что проблема связана с методом Наивного Байеса, и я приведу объяснение, которое, надеюсь, проиллюстрирует, в чем проблема.

Представьте, что ваш ложный положительный показатель равен 0,01, а ваш истинный положительный показатель равен 0,9. Это означает, что ваш ложный отрицательный показатель равен 0,1, а ваш истинный отрицательный показатель равен 0,99.

Представьте идеализированный тестовый сценарий, в котором у вас есть 100 тестовых случаев из каждого класса. Вы получите (в ожидании) 1 ложный положительный и 90 истинно положительных результатов. Большой! Точность 90/(90 + 1) в вашем положительном классе!

Теперь представьте, что в 1000 раз больше отрицательных примеров, чем положительных. То же 100 положительных примеров при тестировании, но теперь есть 1000000 отрицательных примеров. Вы получаете то же 90 истинно положительных результатов, но (0.01 * 1000000) = 10000 ложных срабатываний. Катастрофа! Ваша точность теперь почти равна нулю (90/(90 + 10000)).

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

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

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

Я надеюсь, что некоторые из них помогут хотя бы понять проблему, с которой вы столкнулись.

Ответ 2

Как говорит @Ben Allison, проблема, с которой вы сталкиваетесь, в основном такова, что точность вашего классификатора недостаточно хороша - или, что более конкретно: его ложноположительная ставка слишком высока для распределения класса, которое она встречает.

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

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

Одним из решений для этого было бы, конечно, использовать больше данных или попробовать другой тип классификатора; например линейная/логистическая регрессия или SVM, которые обычно имеют хорошую производительность при классификации текста.

Сказав это, может случиться так, что вы предпочитаете использовать Naive Bayes по какой-либо причине (например, ограничения на время поездов, частое добавление новых классов или моделей с предварительным расширением). В этом случае я могу дать некоторые практические советы о том, что можно сделать.

  • Предполагая, что у вас уже есть рабочий процесс для создания классификаторов Naive Bayes, вы можете рассмотреть Boosting. Как правило, эти методы будут обучать несколько более слабых классификаторов таким образом, который приводит к более сильному классификатору. Было показано, что усиление классификаций Naive Bayes хорошо работает, например. см. здесь. Лучшие результаты будут достигнуты благодаря большому и чистому набору поездов.
  • Другим практичным и простым решением (хотя и менее "красивым" ) было бы добавить еще один слой после существующего классификатора, простого биномиального классификатора Naive Bayes с порогом - по сути, "ключевого" фильтра, который будет выводиться как положительные только документы, содержащие по крайней мере n слов из данного словаря (вы также можете разрешить несколько слов считаться более одного раза). В зависимости от вашей проблемной области, возможно, можно будет создать такой словарь вручную. После некоторых проб и ошибок, я видел, что этот метод значительно улучшает ложноположительную ставку, но лишь незначительно вредит ложным негативам.

Ответ 3

Я думаю, что gustavodidomenico делает хороший момент. Вы можете думать о Наивом Байесе как об изучении распределения вероятностей, в этом случае слов, относящихся к темам. Таким образом, баланс данных обучения имеет значение. Если вы используете деревья принятия решений, скажем, случайную модель леса, вы изучаете правила для выполнения задания (да, есть вероятностные распределения, и я извиняюсь за объяснение руки, но иногда помогает интуиция). По этой причине деревья во многих случаях более надежны, чем Наивные Байес.