Я пытаюсь вычислить RO C Curve и AU C, используя рейнджер для биномиальной классификации (0 и 1), где переменная ответа определяется как BiClass.
Предположим, я произнес Фрейм данных к Train_Set и Test_Set (75% и 25% соответственно) и вычислить вероятности двоичного класса, используя:
library(ranger)
library(ROCR)
library(mlr)
library(pROC)
library(tidyverse)
Biclass.ranger <- ranger(BiClass ~ ., ,data=Train_Set, num.trees = 500, importance="impurity", save.memory = TRUE, probability=TRUE)
pred <- predict(BiClass.ranger, data = Test_Set, num.trees = 500, type='response', verbose = TRUE)
Мое намерение теперь состоит в том, чтобы вычислить кривую RO C (и AU C). Я попробовал следующий код, с помощью которого я получаю кривую RO C (используя пакеты ROCR и mlr):
pred_object <- prediction(pred$predictions[,2], Test_Set$BiClass)
per_measure <- performance(pred_object, "tnr", "fnr")
plot(per_measure, col="red", lwd=1)
abline(a=0,b=1,lwd=1,lty=1,col="gray")
Или, наоборот, используя пакет pRO C:
probabilities <- as.data.frame(predict(Biclass.ranger, data = Test_Set, num.trees = 500, type='response', verbose = TRUE)$predictions)
probabilities$predic <- colnames(probabilities)[max.col(probabilities,ties.method="first")] # For each row, return the column name of the largest value from 0 and 1 columns (prediction column). This will be a character type
probabilities$prednum <- as.numeric(as.character(probabilities$predic)) # create prednum as a numeric data type in probabilities
probabilities <- dplyr::mutate_if(probabilities, is.character, as.factor) # convert character to factor
probabilities <- cbind(probabilities,BiClass=Test_Set$BiClass) # append BiClass. This data frame contains the response variable from the Test_Data, along with prediction (prednum) and probability classes (0 and 1)
ROC_ranger <- pROC::roc(Table$BiClass, pred$predictions[,2])
plot(ROC_ranger, col = "blue", main = "ROC - Ranger")
paste("Accuracy % of ranger: ", mean(Test_Set$BiClass == round(pred$predictions[,2], digits = 0))) # print the performance of each model
Полученная кривая RO C приведена ниже: ![enter image description here](https://i.stack.imgur.com/1bOpd.jpg)
У меня есть следующие вопросы:
1) Как установить пороговое значение и построить график матрица путаницы для установленного порога?
Я вычисляю матрицу путаницы в настоящее время, используя:
probabilities <- as.data.frame(predict(Biclass.ranger, data = Test_Set, num.trees = 500, type='response', verbose = TRUE)$predictions)
max.col(probabilities) - 1
confusionMatrix(table(Test_Set$BiClass, max.col(probabilities)-1))
2) Как рассчитать оптимальное значение страховки (глобальное значение, при котором у меня больше истинных положительных сторон или истинные негативы) через оптимизацию?
Опять же, ссылаясь на pRO C и рекомендации, предложенные его автором с использованием:
myroc <- pROC::roc(probabilities$BiClass, probabilities$`1`)
mycoords <- pROC::coords(myroc, "all", transpose = FALSE)
plot(mycoords$threshold, mycoords$specificity, type="l", col="red", xlab="Cutoff", ylab="Performance")
lines(mycoords$threshold, mycoords$sensitivity, type="l", col="blue")
legend(0.23,0.2, c("Specificity", "Sensitivity"), col=c("red", "blue"), lty=1)
best.coords <- coords(myroc, "best", best.method="youden", transpose = FALSE)
abline(v=best.coords$threshold, lty=2, col="grey")
abline(h=best.coords$specificity, lty=2, col="red")
abline(h=best.coords$sensitivity, lty=2, col="blue")
Я смог нарисовать эту кривую, используя индекс Юдена :
] 2
Означает ли это, что у вас не так много свободы для изменения порога, чтобы играть со специфичностью и чувствительностью, так как пунктирная синяя и красные линии не далеко друг от друга?
3) Как ЭАУЛЯЦИЯ АС C?
Я рассчитал AU C, снова используя pRO C, следуя указаниям его автора. См. Ниже:
ROC_ranger <- pROC::roc(probabilities$BiClass, probabilities$`1`)
ROC_ranger_auc <- pROC::auc(ROC_ranger)
paste("Area under curve of random forest: ", ROC_ranger_auc) # AUC of the model
Наконец, цель состоит в том, чтобы увеличить истинные отрицательные значения, которые в настоящее время определены 1 в BiClass и, конечно, истинные положительные значения (определенные 0 в BiClass) в матрице путаницы. В настоящее время точность моего алгоритма классификации составляет 0,74, а AU C составляет 0,81 соответственно.