У меня много проблем с пониманием того, как работает параметр 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. Это верно? Если нет, может кто-нибудь уточнить?
Большое спасибо, любые разъяснения были бы очень благодарны!