Як змінити поріг класифікації у R randomForests?


10

Вся література з моделювання розподілу видів передбачає, що при прогнозуванні присутності / відсутності виду за допомогою моделі, яка видає ймовірності (наприклад, RandomForests), важливим є вибір порогової ймовірності, за якою фактично класифікувати вид як наявність чи відсутність, і слід не завжди покладаються на дефолт 0,5. Мені потрібна допомога з цим! Ось мій код:

library(randomForest)
library(PresenceAbsence)

#build model
RFfit <- randomForest(Y ~ x1 + x2 + x3 + x4 + x5, data=mydata, mytry = 2, ntrees=500)

#eventually I will apply this to (predict for) new data but for first I predict back    to training data to compare observed vs. predicted
RFpred <- predict(RFfit, mydata, type = "prob")

#put the observed vs. predicted in the same dataframe
ObsPred <- data.frame(cbind(mydata), Predicted=RFpred)

#create auc.roc plot
auc.roc.plot(ObsPred, threshold = 10, xlab="1-Specificity (false positives)",
  ylab="Sensitivity (true positives)", main="ROC plot", color=TRUE,
  find.auc=TRUE, opt.thresholds=TRUE, opt.methods=9) 

З цього я визначив, що поріг, який я хотів би використати для класифікації присутності від передбачуваних ймовірностей, становить 0,7, а не за замовчуванням 0,5. Я абсолютно не розумію, що робити з цією інформацією. Чи просто я використовую цей поріг при створенні карти мого виводу? Я міг би легко створити відображений на карті вихід з постійними ймовірностями, а потім просто перекласифікувати ті, у кого значення більше 0,7, а такі <0,7 як відсутні.

Або я хочу взяти цю інформацію та запустити своє моделювання randomForests, використовуючи параметр cut-off? Що саме робить параметр відсічення? Чи змінює це результат голосування? (наразі каже, що це "більшість"). Як використовувати цей параметр відсікання? Я не розумію документацію! Дякую!


2
Я б сказав, що це може належати тут: Питання (1) оцінки ймовірності з РФ, (2) чи можна накладати на модель функцію витрат чи потрібно вбудовувати її в модель, і (3) як реалізувати функції витрат в РФ виникають періодичні проблеми, не пов'язані просто з програмуванням.
charles

Відповіді:


7

#set поріг або значення відсікання до 0,7

cutoff=0.7

# всі значення, нижчі за значення відрізання 0,7, класифікуються як 0 (в цьому випадку присутні)

RFpred[RFpred<cutoff]=0

#all значення, що перевищують значення відсікання 0,7, класифікуються як 1 (у цьому випадку відсутні)

 RFpred[RFpred>=cutoff]=1

1
Чи могли б ви трохи розширити свою відповідь? По крайней мере, було б корисно анотувати свій код.
Патрік Куломбе

2
FWIW, я думаю, що цього цілком достатньо.
Sycorax каже, що повернеться до Моніки

Ця відповідь ідеально звучить. Я згоден.
Seanosapien

7

Вибачте, що ви не отримали спроб відповідей. Рекомендую книгу Макса Куна для висвітлення цієї проблеми. Це досить широке питання. Просто додайте кілька біт:

  1. Криві ROC є популярними, але мають сенс лише, якщо ви намагаєтесь зрозуміти компроміс між вартістю «Неправдивий негативний» та «Хибнопозитивний». Якщо CostFN = CostFP, то не впевнені, що вони мають сенс. С-статистика та інші похідні заходи все ще користуються. Якщо ви хочете досягти максимальної точності - просто налаштуйте свою модель на це (пакет карет робить це просто), не робіть кривої ROC.
  2. Усі використовують ймовірності, отримані з РЧ-моделей. Думаю, слід подумати над цим - це не ймовірнісні моделі, вони не побудовані для цього. Це часто працює. Як мінімум, я б створив графік валідації імовірностей РФ за новими даними, якби мене справді цікавили ймовірності
  3. Найпростішим способом було б використання "просто перекласифікувати ті, у кого значення вище 0,7, а ті, що <0,7 відсутні".
  4. Якщо вартість (FN) не дорівнює собівартості (FP), то вам потрібно зробити РФ залежною від витрат. R не робить це легко. Функція зважування в пакеті RandomForest не працює. Найкращий варіант - це пограти з вибіркою, підкресливши більшість випадків, щоб отримати необхідну функцію витрат. Але співвідношення між співвідношенням вибірки та вартістю не є прямим. Тому ви можете дотримуватися (3)

Оновлення щодо ваг класу Енді Ліав:
"Поточна опція" classwt "в пакеті randomForest існує з самого початку і відрізняється від того, як офіційний код Fortran (версія 4 і пізніші) реалізує ваги класів. Він просто враховує клас ваги в розрахунку індексу Джині при розбитті вузлів, точно так, як робиться одне дерево CART, коли задано ваги класу. Проф. Брейман придумав нову схему зважування класу, реалізовану в новій версії свого коду Fortran після того, як ми виявили, що просто використовуємо ваги в індексі Джіні, здається, не дуже допомагають в надзвичайно неврівноважених даних (скажімо, 1: 100 або гірше). Якщо використання зваженого Джині допомагає у вашій ситуації, це неодмінно зробити це. Я можу лише сказати, що раніше не дав нам того результату, якого ми очікували ".


Не могли б ви детальніше зупинитися на підпункті (4), чому аргумент зважування не працює?
Sycorax повідомляє про відновлення Моніки

2
Я розумію, що він належним чином реалізований у коді Fortran ( stat.berkeley.edu/~breiman/RandomForests/cc_software.htm ), але не пакет R. Це обговорюється: ( stat.ethz.ch/pipermail/r-help/2011-September/289769.html ) та центри навколо, які потребують використання ваг на всіх етапах будівництва дерев - не лише розбиття Джині. Тож поточна реалізація R, яка використовує лише зважування при спліт, не працює дуже добре
Чарльз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.