Я нашел ответ на свой вопрос и хотел опубликовать его на случай, если он принесет пользу кому-нибудь в будущем.
Вот воспроизводимый пример с использованием 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, скажем, специфичность, для каждой складки и усредните его, вы также получите специфичность из приведенной выше строки. Еще одна проверка, чтобы убедиться, что вы все делаете правильно, если вам нужно подтверждение.