У меня есть набор данных, в котором классы несимметричны. Классы либо «1», либо «0», где отношение класса «1»: «0» равно 5: 1. Как вычислить ошибку предсказания для каждого класса и восстановить баланс весов соответственно в sklearn со случайным лесом, вроде как в следующей ссылке: http://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm#balanceНесбалансированная классификация с использованием RandomForestClassifier в sklearn
ответ
Вы можете передать образец весы аргумента Random Forest fit method
sample_weight : array-like, shape = [n_samples] or None
Образец весов. Если «Нет», то образцы одинаково взвешены. Разделение , которое создало бы дочерние узлы с нулевым или отрицательным весом , игнорировалось при поиске разбиения на каждом узле. В случае классификации расщепления также игнорируются, если они приведут к одному классу , несущему отрицательный вес в любом дочернем узле.
В старой версии существует метод preprocessing.balance_weights
для создания весов весов для данных образцов, так что классы становятся равномерно распределенными. Он по-прежнему существует во внутреннем, но все еще пригодном для использования модуле preprocessing._weights, но устарел и будет удален в будущих версиях. Не знаю конкретных причин для этого.
Update
Некоторые разъяснения, как вы, кажется, следует путать. sample_weight
использование простое, как только вы помните, что его цель - сбалансировать целевые классы в наборе учебных материалов. То есть, если у вас есть X
как наблюдения и y
как классы (метки), то len(X) == len(y) == len(sample_wight)
, и каждый элемент sample witght
1-й массив представляет вес для соответствующей пары (observation, label)
. В вашем случае, если 1
класса представлен в 5 раз, как 0
класса, и баланс распределения классов, можно использовать простой
sample_weight = np.array([5 if i == 0 else 1 for i in y])
назначая вес 5
всех 0
экземпляров и вес 1
всех 1
экземпляров. См. Ссылку выше для немного более хитрым balance_weights
функция оценки веса.
Если класс большинства является 1, а класс меньшинство 0, и они находятся в соотношении 5: 1, sample_weight
массив должен быть:
sample_weight = np.array([5 if i == 1 else 1 for i in y])
Обратите внимание, что вы не инвертировать отношения. Это также относится к class_weights
. Большее число связано с классом мажоритов.
Это действительно позор, что метод «подгонки» sklearn не позволяет определить оптимизацию производительности. Никто, кажется, не понимает, не задает вопросов или не интересуется тем, что происходит на самом деле, когда вы решаете задачу классификации при выборе метода соответствия по образцу данных.
Мы (пользователи scikit узнать пакет) молча ушли с предложением косвенно использовать crossvalidated поиск сетки с конкретным методом подсчета очков подходят для неуравновешенных наборов данных в надежде наткнуться на параметрах/metaparameters набора, который производит соответствующие ПКА или F1 счетов ,
Но подумайте над этим: похоже, метод «подгонка» под названием «капюшон» всегда оптимизирует точность. Поэтому в конечном эффекте, если мы стремимся максимизировать оценку F1, GridSearchCV дает нам «модель с лучшим F1 из всех режимов» с лучшей точностью ». Разве это не глупо? Не лучше ли было бы непосредственно оптимизировать параметры модели для максимальной оценки F1? Вспомните старый добрый пакет Matlab ANNs, в котором вы можете установить желаемый показатель производительности в RMSE, MAE и все, что вы хотите, учитывая, что алгоритм вычисления градиента определен. Почему выбор показателя производительности без пропусков из sklearn?
По крайней мере, почему нет простой возможности автоматически присваивать весу экземпляров класса для устранения проблем с неуравновешенными наборами данных? Почему мы должны вычислять вес вручную? Кроме того, во многих машинных учебниках/статьях я видел, как авторы хвалили руководство sklearn как удивительное, если не лучшие источники информации по теме. Нет, правда? Почему проблема неуравновешенных наборов данных (которая, очевидно, имеет огромное значение для ученых-данных), даже не охвачена нигде в документах? Я обращаюсь к этим вопросам соавторами sklearn, если они это прочитают. Или кто-нибудь знает причины для этого, чтобы прокомментировать и разобраться.
UPDATE
Поскольку scikit учиться 0.17, есть 'сбалансированный' вариант class_weight =, который можно передать по крайней мере, к некоторым классификаторам:
режим «сбалансированный» использует значения y для автоматической регулировки веса, обратно пропорциональные частотам класса во входных данных как n_samples/(n_classes * np.bincount (y)).
Но как бы вводить каждый образец в набор тренировок, являющийся классом меньшинства, в массив [n_samples]? – mlo
@mlo не получает смысл вашего комментария, вы не можете перефразировать пожалуйста – alko
Извините. Я имел в виду, что именно вы ввели бы для «[n_samples]»? Будет ли это всего лишь массив всех меток в наборе данных? Например, если у вас есть X (функции) и y (метки), вы бы просто использовали функцию: fit (X, y, sample_weight = y). Если вы не возражаете, можете ли вы привести пример, возможно, используя мою ситуацию выше, где y = [1,1,0,0,0,0,0,0,0,0] (отношение 5: 1). Как бы настроить вес с помощью: sample_weight = [n_samples]? – mlo