Работа с классовым дисбалансом в классификации с несколькими метками

Я видел несколько вопросов о дисбалансе классов в мультиклассовой среде. Однако у меня проблема с несколькими этикетками, как бы вы с ней справились в этом случае?

У меня есть набор из примерно 300 тысяч текстовых примеров. Как упоминалось в заголовке, каждый пример имеет по крайней мере одну метку, и существует только 100 возможных уникальных меток. Я свел эту проблему к двоичной классификации для Vowpal Wabbit, воспользовавшись преимуществами пространств имен, например

От:

healthy fruit | bananas oranges jack fruit
evil monkey | bipedal organism family guy
...  

To:

1 |healthy bananas oranges jack fruit
1 |fruit bananas oranges jack fruit
0 |evil bananas oranges jack fruit
0 |monkey bananas oranges jack fruit
0 |healthy bipedal organism family guy
0 |fruit bipedal organism family guy
1 |evil bipedal organism family guy
1 |monkey bipedal organism family guy
...  

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

После обучения, при тестировании на одном и том же наборе обучения, я заметил, что все примеры были предсказаны с меткой «0» ... что, я полагаю, является одним из способов минимизировать потери. На данный момент я не знаю, что делать. Я думал об использовании экономичной классификации «один против всех», чтобы попытаться сбалансировать классы, но сокращение нескольких меток до нескольких классов невозможно, поскольку существует 2 ^ 100 комбинаций меток. Мне интересно, есть ли у кого-нибудь еще какие-нибудь предложения.

Изменить: у меня наконец-то появилась возможность протестировать классовый дисбаланс, особенно для vw. vw очень плохо справляется с дисбалансом, по крайней мере, для многомерных, редко заполненных текстовых функций. Я пробовал соотношения от 1: 1 до 1:25, при этом производительность резко ухудшалась при соотношении 1: 2.


person richizy    schedule 09.12.2013    source источник
comment
Я могу полностью избавиться от ярлыков 0. И метки являются пространствами имен в двоичной редукции.   -  person richizy    schedule 02.04.2014
comment
Вы смогли найти ответ на свой вопрос? Похоже, у нас пока нет однозначного ответа.   -  person GeorgeOfTheRF    schedule 20.09.2015
comment
@ML_Pro См. Мой ответ: используйте --loss_function logistic.   -  person Zach    schedule 22.10.2015


Ответы (3)


Любая линейная модель будет "очень плохо" справляться с дисбалансом классов, если вы заставите ее использовать квадрат потерь для задачи двоичной классификации. Подумайте о функции потерь: если 99% наблюдений равны нулю, прогноз 0 во всех случаях дает квадратичную ошибку 0,01. Vowpal Wabbit не может творить чудеса: если вы попросите его минимизировать квадратичную потерю ошибок, он действительно сведет к минимуму квадратичную потерю ошибок, как и любая другая программа регрессии.

Вот демонстрация той же «проблемы» с моделью линейной регрессии в R:

set.seed(42)
rows <- 10000
cols <- 100
x <- matrix(sample(0:1, rows*cols, replace=TRUE), nrow=rows)
y <- x %*% runif(cols) + runif(rows)
y <- ifelse(y<quantile(y, 0.99), 0, 1)
lin_mod <- glm(y~., data.frame(y, x), family='gaussian') #Linear model
log_mod <- glm(factor(y)~., data.frame(y, x), family='binomial') #Logistic model

Сравнение прогнозов линейной и логистической модели показывает, что линейная модель всегда предсказывает 0, а логистическая модель предсказывает правильное сочетание нулей и единиц:

> table(ifelse(predict(lin_mod, type='response')>0.50, 1, 0))

    0 
10000 
> table(ifelse(predict(log_mod, type='response')>0.50, 1, 0))

   0    1 
9900  100 

Используйте --loss_function="logistic" или --loss_function="hinge" для задач двоичной классификации в vowpal wabbit. Вы можете оценить свои прогнозы постфактум, используя потерю Хэмминга, но может быть полезно сравнить ваши результаты с потерей Хэмминга при постоянном прогнозе 0.

person Zach    schedule 31.03.2014
comment
Есть ли конкретная причина, по которой линейная модель хуже логистической при несбалансированной классификации? Или минимизация потерь в квадрате хуже, чем минимизация перекрестной энтропии (максимизация логарифмического правдоподобия)? Честно говоря, единственное, что я мог подумать о том, почему большинство моделей плохо справляются с несбалансированной классификацией, это то, что они пытаются минимизировать общие потери данных обучения, если мы ошибаемся в большинстве примеров классов большинства, убытки могут быть высокими, тогда как в случае ошибки в большинстве примеров класса меньшинств понесенная дельта убытков будет незначительной. - person avocado; 31.12.2017
comment
@avocado Это зависит от того, что вы хотите от модели. Обратите внимание на цитату из исходного вопроса. Я заметил, что все примеры были предсказаны с меткой «0» ... что, я думаю, является одним из способов минимизировать потери. Я просто хотел сказать, что минимизация rmse даст такой результат. Если вы этого не хотите, вам нужно использовать другую функцию потерь. - person Zach; 08.01.2018
comment
@avocado ха, нет проблем. Вы можете +1 к моему комментарию, если он вам нравится :-D - person Zach; 10.01.2018

Я так понимаю, вы сократили проблему до 100, задач двоичной классификации? Это был бы стандартный способ делать что-то в многопользовательской среде.

Если вашей оценочной метрикой действительно является потеря Хэмминга, тогда вам может быть лучше спрогнозировать большинство для каждой двоичной проблемы. Трудно превзойти это для очень несбалансированных проблем. Но в большинстве случаев ваша метрика оценки отличается. Например, вы можете захотеть оптимизировать показатель F1 (микро или макро). В таких случаях вы можете попытаться как-то сбалансировать выборки + ve и -ve для каждой двоичной проблемы. Есть несколько способов сделать это.

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

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

Кроме того, вы не можете изменить порог, но изменить «веса» примеров в различных задачах обучения. Например, если вы обнаружите, что метка «здоровый» встречается в 1 тыс. Образцов и не встречается в 29 тыс. Образцов, просто используйте вес 29 для примеров с меткой «здоровый» и вес 1 для примеров без метки.

Я не знаю, как бы вы это сделали в VW. Тебе придется в этом разобраться.

person Harish    schedule 16.12.2013

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

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

Вот статья в Википедии, объясняющая эту концепцию более полно.

А вот соответствующая документация по sklearn, которая может оказаться менее полезной. поскольку я не уверен, на каком языке это происходит.

person Slater Victoroff    schedule 09.12.2013
comment
AUC не предназначен специально для несбалансированных наборов данных. Речь идет об отложении решения о компромиссе между точностью и отзывом (до тех пор, пока какой-нибудь эксперт в предметной области не скажет вам, какова цена между ложными срабатываниями и ложными отрицаниями). Если вы знаете требуемые уровни точности / отзыва, вам не нужен AUC для выбора модели. Несбалансированный набор данных требует всего лишь мониторинга двух величин вместо одной точности / отзыва, чувствительности / специфичности и т. Д. Подведение итогов к одному количеству, например AUC или F-score, может легко ввести вас в заблуждение. Речь идет о совершенно другой проблеме. - person iliasfl; 28.12.2013
comment
@iliasfl На самом деле это не так. Возможно, я немного упростил, но auc как метрика специально выбрана для устранения проблем, связанных со случайным угадыванием и дисбалансом классов, когда простая точность в этих отношениях терпит неудачу. Когда вы тренируете модель с серьезным дисбалансом и оптимизируете точность, модель быстро сходится к выбору только одного класса, как это произошло в вопросе. Если вместо этого использовать AUC в качестве метрики оценки, а не точности, эта проблема исчезнет. Если вы не уверены, подумайте о том, что происходит, когда вы случайным образом угадываете или угадываете все одно число. - person Slater Victoroff; 28.12.2013