Кривая TPR и FPR для разных классификаторов - kNN, NaiveBayes, деревья принятия решений в R

Я пытаюсь понять и построить TPR/FPR для разных типов классификаторов. Я использую kNN, NaiveBayes и Decision Trees в R. С kNN я делаю следующее:

clnum <- as.vector(diabetes.trainingLabels[,1], mode = "numeric")
dpknn <- knn(train = diabetes.training, test = diabetes.testing, cl = clnum, k=11, prob = TRUE)
prob <- attr(dpknn, "prob")
tstnum <- as.vector(diabetes.testingLabels[,1], mode = "numeric")
pred_knn <- prediction(prob, tstnum)
pred_knn <- performance(pred_knn, "tpr", "fpr")
plot(pred_knn, avg= "threshold", colorize=TRUE, lwd=3, main="ROC curve for Knn=11")

где diabetes.trainingLabels [, 1] - это вектор меток (класс), которые я хочу предсказать, диабет. Обучение - это данные обучения и диабет .testing - это test.data.

Сюжет выглядит следующим образом: введите описание изображения здесь

Значения, хранящиеся в атрибуте prob, представляют собой числовой вектор (десятичный от 0 до 1). Я преобразовываю фактор меток классов в числа, а затем я могу использовать его с функцией prediciton/performance из библиотеки ROCR. Не 100% уверен, что я делаю это правильно, но, по крайней мере, это работает.

Для NaiveBayes и Decision Trees, с параметром prob/raw, определенным в функции прогнозирования, я не получаю ни одного числового вектора, а вектор списков или матрицы, где определенная вероятность для каждого класса (я думаю), например:

diabetes.model <- naiveBayes(class ~ ., data = diabetesTrainset)
diabetes.predicted <- predict(diabetes.model, diabetesTestset, type="raw")

и диабет. Предполагается:

     tested_negative tested_positive
     [1,]    5.787252e-03       0.9942127
     [2,]    8.433584e-01       0.1566416
     [3,]    7.880800e-09       1.0000000
     [4,]    7.568920e-01       0.2431080
     [5,]    4.663958e-01       0.5336042

Вопрос заключается в том, как использовать его для построения кривой ROC и почему в kNN я получаю один вектор и для других классификаторов, я получаю их отдельно для обоих классов?

Ответ 1

Кривая ROC

Откроется ROC-кривая, которую вы предоставили для классификатора knn11 - она ​​находится ниже диагонали, указывая, что ваш классификатор правильно назначает метки классов менее 50% времени. Скорее всего, произошло то, что вы предоставили неверные метки классов или неправильные вероятности. Если в обучении вы использовали метки классов 0 и 1 - те же метки классов должны быть переданы на кривую ROC в том же порядке (без 0 и одного листания).

Другая менее вероятная возможность заключается в том, что у вас очень странный набор данных.

Вероятности для других классификаторов

Кривая ROC была разработана для вызова событий из радара. Технически это тесно связано с предсказанием события - вероятность того, что вы правильно угадаете четность плоскости, приближающейся к радару. Поэтому он использует одну вероятность. Это может сбивать с толку, когда кто-то делает классификацию на двух классах, где вероятность "попадания" не очевидна, например, в вашем случае, когда у вас есть случаи и элементы управления.

Однако любые две классификации классов можно охарактеризовать как "хиты" и "промахи" - вам просто нужно выбрать класс, который вы назовете "событием". В вашем случае диабет можно назвать событием.

Итак, из этой таблицы:

 tested_negative tested_positive
 [1,]    5.787252e-03       0.9942127
 [2,]    8.433584e-01       0.1566416
 [3,]    7.880800e-09       1.0000000
 [4,]    7.568920e-01       0.2431080
 [5,]    4.663958e-01       0.5336042

Вам нужно будет выбрать только одну вероятность - событие события - возможно, "checked_positive". Еще один "проверенный_отрицательный" - это всего лишь 1-tested_positive, потому что, когда у классификатора вещи, которые у конкретного человека имеют диабет с вероятностью 79%, он в то же время "думает" о том, что у этого человека нет диабета 21%. Но вам нужно только одно число, чтобы выразить эту идею, поэтому knn возвращает только один, тогда как другой классификатор может вернуть два.

Я не знаю, какую библиотеку вы использовали для деревьев решений, поэтому не может помочь с выходом этого классификатора.