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

Несбалансированная классификация с использованием RandomForestClassifier в sklearn

У меня есть набор данных, в котором классы не сбалансированы. Классы либо "1", либо "0", где отношение класса "1": "0" равно 5: 1. Как вы вычисляете ошибку предсказания для каждого класса и весы перебалансировки соответственно в sklearn с Random Forest, вроде как в следующей ссылке: http://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm#balance

4b9b3361

Ответ 1

Вы можете передать образец весов аргументам в метод Random Forest fit

sample_weight : array-like, shape = [n_samples] or None

Вес образца. Если "Нет", то образцы одинаково взвешены. Разделяет   которые создавали бы дочерние узлы с нулевым или отрицательным весом   игнорируется при поиске разделения в каждом node. В случае   классификация, разделение также игнорируется, если они   один класс, несущий отрицательный вес в любом из детей node.

В более старой версии был метод preprocessing.balance_weights для создания весов баланса для заданных выборок, так что классы становятся равномерно распределенными. Он по-прежнему присутствует во внутреннем, но все еще используемом модуле preprocessing._weights, но устарел и будет удален в будущих версиях. Не знаю конкретных причин для этого.

Обновление

Некоторые разъяснения, поскольку вы, кажется, смущены. Использование sample_weight простое, как только вы помните, что его цель - сбалансировать целевые классы в наборе учебных материалов. То есть, если у вас есть X как наблюдения и y как классы (метки), тогда len(X) == len(y) == len(sample_wight), и каждый элемент массива sample witght 1-d представляет вес для соответствующей пары (observation, label). Для вашего случая, если класс 1 представлен 5 раз как 0 class, и вы балансируете распределения классов, вы можете использовать простые

sample_weight = np.array([5 if i == 0 else 1 for i in y])

присвоение веса 5 всем экземплярам 0 и весу 1 для всех экземпляров 1. См. Ссылку выше для более хитрой balance_weights функции оценки веса.

Ответ 2

Это действительно позор, что метод "fit" sklearn не позволяет указать оптимизацию производительности. Никто, кажется, не понимает, не задает вопросов или не интересуется тем, что происходит на самом деле, когда вы прибегаете к методу выборки данных при решении задачи классификации.

Мы (пользователи пакета обучения scikit) молча оставляем за собой предложение косвенно использовать поиск с перекрестными сетками с помощью специального метода подсчета, подходящего для несбалансированных наборов данных, в надежде напасть на набор параметров/метапараметров, который создает соответствующие AUC или F1 оценка.

Но подумайте об этом: похоже, что метод подгонки под капотом каждый раз всегда оптимизирует точность. Поэтому в конечном эффекте, если мы стремимся максимизировать оценку F1, GridSearchCV дает нам "модель с лучшим F1 из всех режимов" с лучшей точностью ". Разве это не глупо? Не было бы лучше напрямую оптимизировать параметры модели для максимальной оценки F1? Вспомните старый хороший пакет ANT, который вы можете установить в RMSE, MAE, и все, что вы хотите, чтобы определить, что алгоритм вычисления градиента определен. Почему выбор метрики производительности молча пропущен из sklearn?

По крайней мере, почему нет простой возможности автоматически присваивать веса экземпляров класса для устранения проблем с несбалансированными наборами данных? Почему мы должны вычислять вес вручную? Кроме того, во многих машинных учебниках/статьях я видел, как авторы хвалили руководство sklearn как удивительное, если не лучшие источники информации по теме. Нет, правда? Почему проблема неуравновешенных наборов данных (которая, очевидно, имеет огромное значение для ученых-данных), даже не охвачена нигде в документах? Я обращаюсь к этим вопросам со спонсорами sklearn, если они это прочитают. Или кто-нибудь знает причины для этого, чтобы прокомментировать и разобраться.

UPDATE

Начиная с scikit-learn 0.17, существует опция class_weight = 'balanced', которую вы можете передать, по крайней мере, некоторым классификаторам:

"Сбалансированный" режим использует значения y для автоматической настройки веса, обратно пропорциональные частотам классов во входных данных как n_samples/(n_classes * np.bincount(y)).

Ответ 3

Если класс мажора равен 1, а класс меньшинства равен 0, и они находятся в соотношении 5: 1, массив sample_weight должен быть:

sample_weight = np.array([5 if i == 1 else 1 for i in y])

Обратите внимание, что вы не инвертируете отношения. Это также относится к class_weights. Большее число связано с классом мажорита.

Ответ 4

Используйте параметр class_weight='balanced'

Из документации sklearn: сбалансированный режим использует значения y для автоматической регулировки весов, обратно пропорциональных частотам классов во входных данных как n_samples/(n_classes * np.bincount(y))