Метод озвучення RandomForestClassifier OOB


16

Чи є випадкова реалізація лісу в scikit-learn, використовуючи середню точність, як метод його оцінювання для оцінки похибки узагальнення за допомогою зразків з мішків? Це не зазначено в документації, але метод score () повідомляє про середню точність.

У мене сильно незбалансований набір даних, і я використовую AUC ROC як мій показник оцінки в пошуку в сітці. Чи є спосіб сказати класифікатору використовувати той самий метод оцінювання і на зразках OOB?


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

Як очікувалося, точність моделі при оцінці навчального набору дуже висока. Однак це безглуздо, тому що ви дуже добре можете переозброїти свої дані, і, отже, ваша модель є сміттям. Однак ми можемо використати оцінку "out of-bag" як

print(forest.oob_score_)

0,86453272101

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

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

Оцінка: 0,86517733935

Ми бачимо, що точність, виміряна oob, дуже схожа на ту, отриману з тестовим набором. Таким чином, з теорії випливає, що точність 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


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? Крім того, особисто мені було цікаво обчислити логію, тому що для інших, хто хоче це зробити, я вважаю, що перед_тренінг повинен бути = forest.oob_decision_function_.
Sander Vanden Hautte
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.