Подтвердить что ты не робот

Как работает параметр class_weight в scikit-learn?

У меня много проблем с пониманием того, как работает параметр class_weight в scikit-learn Logistic Regression.

Ситуация

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

Первая попытка: вручную подготовить данные обучения

Я разделил данные, которые у меня были на непересекающиеся наборы для обучения и тестирования (около 80/20). Затем я случайно опробовал данные обучения вручную, чтобы получить данные обучения в разных пропорциях, чем 19: 1; от 2: 1 → 16: 1.

Затем я обучил логистическую регрессию на этих разных подмножествах данных обучения и построил набросок (= TP/(TP + FN)) в зависимости от разных тренировочных пропорций. Разумеется, отзыв был рассчитан на непересекающихся образцах TEST, которые имели наблюдаемые пропорции 19: 1. Обратите внимание, что, хотя я обучал разные модели различным учебным данным, я вычислил отзыв для всех из них по тем же (непересекающимся) тестовым данным.

Результаты были такими же ожидаемыми: отзыв составлял около 60% при соотношении тренировок 2: 1 и быстро сокращался к моменту достижения 16: 1. Было несколько пропорций 2: 1 → 6: 1, где отзыв был прилично выше 5%.

Вторая попытка: поиск сетки

Затем я хотел протестировать различные параметры регуляризации, поэтому я использовал GridSearchCV и сделал сетку из нескольких значений параметра C, а также параметр class_weight. Чтобы перевести мои пропорции n: m отрицательных: положительные образцы обучения на язык словаря class_weight, я подумал, что я просто указываю несколько словарей следующим образом:

{ 0:0.67, 1:0.33 } #expected 2:1
{ 0:0.75, 1:0.25 } #expected 3:1
{ 0:0.8, 1:0.2 }   #expected 4:1

и я также включил None и auto.

На этот раз результаты были полностью испорчены. Все мои напоминания вышли крошечным (< 0,05) для каждого значения class_weight, кроме auto. Поэтому я могу только предположить, что мое понимание того, как установить словарь class_weight, неверно. Интересно, что значение class_weight "auto" в поиске сетки составляло около 59% для всех значений C, и я догадался, что он равен 1:1?

Мои вопросы

1) Как вы правильно используете class_weight для достижения разных балансов в данных обучения из того, что вы на самом деле даете ему? В частности, какой словарь я передаю в class_weight для использования пропорций n: m отрицательных: положительные образцы обучения?

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

3) Что делает auto значение class_weight в отношении пропорций? Я прочитал документацию, и я предполагаю, что "уравновешивает данные, обратно пропорциональные их частоте", просто означает, что он делает это 1:1. Это верно? Если нет, может кто-нибудь уточнить?

Большое спасибо, любые разъяснения были бы очень благодарны!

4b9b3361

Ответ 1

Во-первых, может быть нехорошо просто пережить один. Вы можете просто напомнить 100%, классифицируя все как положительный класс. Я обычно предлагаю использовать AUC для выбора параметров, а затем найти порог для рабочей точки (например, заданного уровня точности), который вас интересует.

Как работает class_weight: он наказывает ошибки в образцах class[i] с class_weight[i] вместо 1. Таким образом, более высокий класс-вес означает, что вы хотите уделять больше внимания классу. Из того, что вы говорите, кажется, что класс 0 в 19 раз чаще, чем класс 1. Таким образом, вы должны увеличить class_weight класса 1 относительно класса 0, например {0:.1, 1:.9}. Если class_weight не суммируется с 1, это в основном изменит параметр регуляризации.

Как работает class_weight="auto", вы можете посмотреть эту дискуссию. В версии dev вы можете использовать class_weight="balanced", что проще понять: в основном это означает репликацию меньшего класса, пока у вас не будет столько образцов, сколько у большего, но неявным образом.