Как изменить порог для классификации в 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, используя параметр отсечки? Что именно делает параметр отсечки? Меняет ли это итоговое голосование? (в настоящее время говорит, что это «большинство»). Как мне использовать этот параметр отсечки? Я не понимаю документацию! Спасибо!


2
Я бы сказал, что это может относиться к следующему: вопрос (1) вероятностных оценок из РФ, (2) можете ли вы наложить на модель функцию стоимости или нужно встроить ее в модель, и (3) как реализовать функции стоимости В РФ постоянно возникают проблемы, которые не просто связаны с программированием.
Чарльз

Ответы:


7

# установить порог или значение отсечки до 0,7

cutoff=0.7

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

RFpred[RFpred<cutoff]=0

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

 RFpred[RFpred>=cutoff]=1

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

2
FWIW, я думаю, что это вполне достаточно.
Sycorax говорит восстановить Monica

Этот ответ отлично звучит. Согласен.
Seanosapien

7

Извините, что вы не получили и попыток ответов. Рекомендую книгу Макса Куна для освещения этой проблемы. Это довольно широкий вопрос. Просто добавьте несколько битов:

  1. Кривые ROC популярны, но имеют смысл только в том случае, если вы пытаетесь понять компромисс между ценовыми результатами False Negative и False Positive. Если CostFN = CostFP, то не уверен, что они имеют смысл. С-статистика и другие производные показатели все еще используются. Если вы хотите максимизировать точность - просто настройте свою модель для этого (с помощью пакета карет это легко), не делайте кривую ROC.
  2. Каждый использует вероятности, полученные из моделей RF. Я думаю, что нужно подумать об этом - это не вероятностные модели, они не созданы для этого. Это часто работает. Как минимум, я бы подготовил график проверки вероятностей РФ на новых данных, если бы меня действительно интересовали вероятности
  3. Простейшим способом было бы использовать «просто реклассифицировать те, у которых присутствуют значения больше 0,7, а те, что отсутствуют <0,7».
  4. Если стоимость (FN) не равна стоимости (FP), то необходимо сделать RF чувствительным к стоимости. R не делает это легко. Весовая функция в пакете RandomForest не работает. Наилучший вариант - поэкспериментировать с выборкой, в случае большинства выборок, чтобы получить требуемую функцию стоимости. Но связь между соотношением выборки и стоимостью не является прямой. Так что вы можете придерживаться (3)

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


Не могли бы вы подробнее остановиться на подпункте (4), почему весовой аргумент не работает?
Sycorax говорит восстановить Monica

2
Насколько я понимаю, он соответствующим образом реализован в коде Фортрана ( 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.