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