Метод оценки OOB RandomForestClassifier

16

Использует ли реализация случайного леса в scikit-learn среднюю точность в качестве метода оценки для оценки ошибки обобщения с выборками из пакета? Это не упоминается в документации, но метод Score () сообщает о средней точности.

У меня очень несбалансированный набор данных, и я использую AUC ROC в качестве метрики оценки в поиске по сетке. Есть ли способ указать классификатору использовать тот же метод оценки и на выборках OOB?

darXider
источник
Oob_score параметр RandomForestClassifier класса не делать то , что вы хотите?
Пьер
AFAIK, oob_scoreсообщить точность. Мне нужно еще раз взглянуть на исходный код.
darXider
Какой параметр вы оцениваете при поиске по сетке?
JahKnows
^ Извините, но я правда сейчас не помню! Я задал этот вопрос 1,5 года назад.
darXider

Ответы:

14

В целом, производительность классификаторов сравнивается с использованием точности, это мера количества правильно классифицированных экземпляров, деленная на общее количество экземпляров. Тем не менее, из данных обучения мы можем получить лучшее приближение ожидаемой ошибки от нашего классификатора, когда мы используем ансамблевое обучение или методы упаковки.

Ошибка вне пакета

Этот показатель является точностью примеров использующих все деревья в ансамбле случайных лесов, для которых он был опущен во время обучения. Таким образом, он действует как пример полу-тестирования. Вы можете понять, насколько хорошо ваш классификатор может обобщать, используя эту метрику.xi

Чтобы реализовать oob в sklearn, вам нужно указать его при создании объекта Random Forests как

from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators = 100, oob_score = True)

Тогда мы можем обучить модель

forest.fit(X_train, y_train)
print('Score: ', forest.score(X_train, y_train))

Оценка: 0,979921928817

Как и следовало ожидать, точность модели при оценке тренировочного набора очень высока. Тем не менее, это бессмысленно, потому что вы вполне можете перегружать свои данные и, следовательно, ваша модель является мусором. Тем не менее, мы можем использовать счет «из сумки» как

print(forest.oob_score_)

+0,86453272101

Это точность при оценке наших экземпляров в обучающем наборе с использованием только деревьев, для которых они были опущены. Теперь давайте посчитаем оценку на тестовом наборе как

print('Score: ', forest.score(X_test, y_test))

Оценка: 0,86517733935

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

Расчет работы с использованием различных метрик

Да, ты можешь это сделать! Однако это зависит от того, как именно ваш код структурирован. Я не уверен, как вы можете включить OOB и AUC вместе с cross_val_scoreфункцией. Однако, если вы выполняете перекрестную сверку вручную, вы можете сделать следующее, алгоритм случайных лесов в sklearn предоставляет вам функцию решения oob как

print(forest.oob_decision_function_)

Класс может быть получен с помощью

from sklearn import metrics
pred_train = np.argmax(forest.oob_decision_function_,axis=1)

Затем мы можем рассчитать AUC с помощью следующего

metrics.roc_auc_score(y_train, pred_train)

+0,86217157846471204

JahKnows
источник
4
Благодарность! Я знаю, как работает OOB-процесс в случайных лесах. Я специально спрашивал, RandomForestClassifierможно ли вернуть оценку OOB, которая НЕ является точной, и вторая часть вашего ответа дает очень хороший совет о том, как решить эту проблему. Тем не менее, я должен подчеркнуть, что не следует использовать метки классов для расчета AUC кривой ROC; скорее, вероятности класса должны использоваться непосредственно. Итак, правильное определение будет pred_train = forest.oob_decision_function_[:, 1].
darXider
@darXider Разве это не так затенено, так как forest.oob_decision_function_.shape [0] == X_train.shape [0], хотя я ожидаю, что это будет == количество образцов OOB, которое должно быть меньше количества образцов в X_train? Кроме того, лично мне было интересно вычислить logloss, для других, которые тоже хотят это делать, я думаю, что pred_train должно быть вместо = forest.oob_decision_function_.
Сандер Ванден Hautte