Производительность по складкам в случайном лесу - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь получить чувствительность, специфичность, ppv и npv (или матрица путаницы также может работать) для всех моих складок, когда я обучаю случайный лес, используя caret, но особенно если я изменяю порог. Я знаю, что обычно с порогом по умолчанию вы можете использовать model$resample, чтобы дать вам метрики для всех складок, но как мне это сделать при новом пороге?

Вот моя модель:

ctrl <- trainControl(method = "cv",
                 number = 5,
                 savePredictions = TRUE,
                 summaryFunction = TwoClassSummary,
                 classProbs = TRUE)

model <- train(outcome ~ ., data=df, 
  trControl = ctrl, method= "rf", preProc=c("center","scale"), metric="ROC",importance=TRUE)

Вот как сгенерировать матрицу путаницы на новом пороге:

 label <- ifelse(model$pred$affirmatory > 0.75, 'affirmatory', 'negatory')
 confusionMatrix(label, model$pred$obs, positive = 'affirmatory')

Но это дает мне только средние значения по всем складкам. Как посмотреть показатели для всех складок?

1 Ответ

0 голосов
/ 29 мая 2020

Я нашел ответ на свой вопрос и хотел опубликовать его на случай, если он принесет пользу кому-нибудь в будущем.

Вот воспроизводимый пример с использованием iris. Предположим, вас интересует производительность в каждом сгибе, где threshold=0.2.

set.seed(3949)
attach(iris)
#create a binary outcome on Sepal.Length
iris <- iris %>% mutate(Sepal.Length=ifelse(Sepal.Length>5.0,"aff","neg")) 


practice <- train(Sepal.Length ~ ., data = iris, trControl = ctrl, method= 
"rf", preProc=c("center","scale"), metric="ROC",importance=TRUE, tuneGrid = 
data.frame(mtry = 2)) #must specify a single mtry

#examine outcome at every fold
print(practice$pred) 

. Вы можете видеть, что порог по умолчанию равен 0,5. Если threshold>0.5, то pred будет aff и наоборот. Если я хочу threshold=0.2, то получу aff, когда threshold>0.2. Итак, теперь вам просто нужно создать новый столбец с новым прогнозом, основанным на этом пороге, а затем вы можете сгенерировать из него матрицу путаницы.

f1 <- practice$pred %>% filter(Resample=="Fold1")
f1 <- f1 %>% mutate(new_pred=ifelse(aff>0.2,"positive","negative"))
f1 %>% group_by(obs, new_pred) %>% summarize(n=n())

Повторите вышеуказанное для каждой из складок. Последняя строка дает вам разбитую матрицу путаницы. Используя это, вы можете вручную определить sen / spec / ppv / npv. Если вы хотите подтвердить, действительно ли этот метод работает, вы можете сгенерировать матрицу путаницы для всей модели, оцененной с новым порогом, используя:

label <- ifelse(practice$pred$aff > 0.2, 'aff', 'neg')
confusionMatrix(label, practice$pred$obs, positive = 'aff')

Подсчитайте отдельные комбинации в каждом сгибе, и в сумме сумма в приведенной выше матрице путаницы. Кроме того, если вы возьмете какой-либо показатель производительности c, скажем, специфичность, для каждой складки и усредните его, вы также получите специфичность из приведенной выше строки. Еще одна проверка, чтобы убедиться, что вы все делаете правильно, если вам нужно подтверждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...