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


у меня много проблем с пониманием того, как class_weight параметр в логистической регрессии scikit-learn работает.

Ситуация

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

Первая Попытка: Ручная Подготовка Данных Обучения

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

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

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

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

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

1 63

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", что легче понять: это в основном означает репликацию меньшего класса, пока у вас нет столько же образцов, сколько и в более крупном, но неявным образом.