Одна категория текстовой классификации на несбалансированном наборе данных - PullRequest
2 голосов
/ 06 марта 2019

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

Отрицательный = 1200

Положительный = 4800

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

Поэтому я взял 1200 Отрицательных и 1200 Положительных и сделал их сбалансированными .

Я реализовал плотную модель64 узла в 4 слоях с регуляризацией 0,5 с использованием Keras и возможность достижения 60% точности перекрестной проверки, в то время как точность поезда достигает 95%.

Глядя на val_acc и acc Я чувствую, что это примерно переоснащение после примерно 20 эпох.Кроме того, он также не может обобщать из-за меньшего числа строк данных в сбалансированном наборе данных.

  • Как можно решить такие проблемы?
  • Может ли One Class SVM помочь в классификации текста по одной категории?
  • Если One Class SVM может помочь, то может ли кто-нибудь предоставить базовый пример или ресурс для его реализации?

1 Ответ

4 голосов
/ 06 марта 2019

Прежде всего, вы уверены, что нет никаких положительных классов в тех 6000, которые вы считаете отрицательными?Мусор, мусор, убедитесь, что дело не в этом.

Как можно решить такие проблемы

В порядке, в котором я бы подошел к проблеме.

  • Убедитесь, что ваше представление данных хорошее.Если вы работаете с текстовыми данными, вам следует использовать векторы слов, такие как pretrained word2vec , также доступный в tenorflow и концентратор tenorflow (вы можете найти более продвинутый подход кздесь встраивание слов, таких как ELMo .

  • Получение большего количества примеров - это, как правило, должно дать наилучшие результаты (в случае выполнения вышеописанного шага), но потребует времени.

  • Попытка использовать другой алгоритм - некоторые алгоритмы на самом деле не заботятся о дисбалансе классов. Я думаю, что деревья решений и их варианты являются наиболее заметными. Вы должны действительно проверить их, начиная с простого дерева решений,чем случайный лес и увеличенные деревья, такие как xgboost , LightGBM или catboost , последние три должны работать очень похоже, xgboost может бытьлучший выбор из-за обилия материалов по этой теме.
  • Различные метрики - точность не самая лучшая, так как она высоко мотивирована NegaурокИспользуйте другие метрики, такие как точность и отзыв и сосредоточьтесь на последнем (поскольку ваш алгоритм, вероятно, не находит достаточно положительных классов).
  • Взвешенная потеря - ошибка, допущенная в положительных примерах, будет взвешена выше, чемтот на отрицательных примерах.Мне нравится это лучше, чем следующие, так как модель пытается приспособиться к данным. Здесь является примером нестандартной потери в Tensorflow.
  • Повышение частоты дискретизации - обратное тому, что вы делали, давая вашей модели одни и те же положительные примеры несколько раз (в каждом случае 5 раз, так что 6000 положительныхпримеров, а также негативов).Вы не теряете информацию, но обучение занимает больше времени (в основном это несуществующая проблема с вашими 7200 примерами).
  • Понижение - то, что вы сделали здесь, но вы теряете много информации об отрицательном классе и его особенностях,Лучше для больших наборов данных, ваш маленький.
  • Творческие подходы - с текстовыми данными сложнее, если бы это было не так, вы могли бы попробовать уменьшить размерность или другое представление данных, которое могло бы найти основную причинуРазница между положительными и отрицательными точками.Сложнее всего и, вероятно, не поможет в вашем случае.

Может ли One Class SVM помочь

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

Если вы все равно хотите попробовать, есть реализация в sklearn здесь .

...