5

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

У меня есть набор из примерно 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.

+0

Я могу полностью избавиться от ярлыков '0'. И метки * являются * пространствами имен в двоичной редукции. – richizy

+0

Вы могли найти ответ на свой вопрос? Не похоже, что у нас есть твердый ответ. –

+0

@ML_Pro [См. Мой ответ] (http://stackoverflow.com/a/22767594/345660): используйте '--loss_function logistic'. – Zach

ответ

1

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

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

Вот wikipedia article, объясняя концепцию более полно.

А вот отношение sklearn documentation, которые могли бы менее полезным, так как я не знаю, на каком языке это происходит в.

+2

AUC не предназначен специально для несбалансированных наборов данных. Речь идет о отсрочке принятия решения о компромиссе Precision/Recall (пока какой-либо эксперт по домену не скажет вам, какая стоимость между ложными срабатываниями против ложных негативов). Если вам известны требуемые уровни Precision/Recall, вам не нужен AUC для выбора модели. Наличие несбалансированного набора данных требует мониторинга двух величин вместо одной точности/отзыва, чувствительности/специфичности и т. Д. Подведение итогов к одному qunatity, например AUC или F-score, может легко ввести вас в заблуждение. Проблема, о которой идет речь, совершенно другая. – iliasfl

+2

@iliasfl На самом деле это не так. Возможно, я немного упростил, но auc как метрика специально выбран для устранения проблем случайного угадывания и дисбаланса классов, когда простая точность терпит неудачу в этих отношениях. Когда вы тренируете модель с серьезным дисбалансом и оптимизируете точность, модель быстро сходится только при выборе одного класса, как это было в вопросе. Если вместо этого использовать AUC как метрику оценки, а не точность, эта проблема исчезает. Если вы не уверены, подумайте о том, что происходит, когда вы произвольно угадываете, или угадываете все одно число. –

1

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

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

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

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

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

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

2

Любая линейная модель будет обрабатывать дисбаланс класса «очень плохо», если вы вынудите его использовать потери в квадрате для проблемы с двоичной классификацией. Подумайте о функции потерь: если 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 и логистическая модель предсказывает правильное сочетание 0 и 1.:

> 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.

+0

Любая конкретная причина, почему линейная модель хуже логистики при несбалансированной классификации? Или минимизация потерь в квадрате хуже, чем минимизация кросс-энтропии (максимизировать log-likelilood)? Честно говоря, единственное, что я мог подумать о том, почему большинство моделей плохо справляется с несбалансированной классификацией, заключается в том, что они пытаются минимизировать общую потерю данных обучения, если мы ошибаемся в большинстве примеров большинства классов, потеря может быть высокой, тогда как если ошибаться в большинстве примеров меньшинства, дельта потерь понесена незначительно. – avocado

+1

@avocado Это зависит от того, что вы хотите от модели.Обратите внимание на цитату из исходного вопроса «Я заметил, что все примеры были предсказаны с помощью метки« 0 »... что является одним из способов минимизации потерь, я думаю». Моя точка зрения заключалась в том, что минимизация rmse будет иметь тенденцию давать этот результат. Если вы этого не хотите, вам нужно использовать другую функцию потери. – Zach

+0

спасибо за возвращение и адрес моего q :-) – avocado

Смежные вопросы