Класс предсказания рейнджера Вероятность каждой строки в кадре данных - PullRequest
1 голос
/ 31 марта 2020

Что касается этой ссылки Прогнозируемые вероятности в пакете R ranger , у меня есть вопрос.

Представьте, что у меня смешанный фрейм данных, df (состоящий из фактора и цифры c переменные) и я хочу сделать классификацию с помощью рейнджера. Я разделяю этот фрейм данных на наборы тестов и поездов, такие как Train_Set и Test_Set. BiClass - это моя переменная коэффициента прогнозирования, состоящая из 0 и 1 (2 уровня)

Я хочу вычислить и присоединить вероятности класса к фрейму данных с помощью устройства для проверки, используя следующие команды:

Biclass.ranger <- ranger(BiClass ~ ., ,data=Train_Set, num.trees = 500, importance="impurity", save.memory = TRUE, probability=TRUE)

probabilities <- as.data.frame(predict(Biclass.ranger, data = Test_Set, num.trees = 200, type='response', verbose = TRUE)$predictions)

Вероятности фрейма данных - это фрейм данных, состоящий из 2 столбцов (0 и 1) с количеством строк, равным количеству строк в Test_Set.

Означает ли это, что если я добавляю или присоединяю этот фрейм данных, а именно вероятности к Test_Set в качестве двух последних столбцов, он показывает вероятность того, что каждая строка равна 0 или 1? Верно ли мое понимание?

Мой второй вопрос, когда я пытаюсь вычислить матрицу путаницы с помощью

pred = predict(Biclass.ranger, data=Test_Set, num.trees = 500, type='response', verbose = TRUE)
table(Test_Set$BiClass, pred$predictions)

Я получаю следующую ошибку: Ошибка в таблице (Test_Set $ ​​BiClass, pred $ предсказания) : все аргументы должны иметь одинаковую длину

Что я делаю не так?

1 Ответ

1 голос
/ 31 марта 2020

Для вашего первого вопроса да, он показывает вероятность того, что каждая строка равна 0 или 1. Используя приведенный ниже пример:

library(ranger)
idx = sample(nrow(iris),100)
data = iris
data$Species = factor(ifelse(data$Species=="versicolor",1,0))
Train_Set = data[idx,]
Test_Set = data[-idx,]

mdl <- ranger(Species ~ ., ,data=Train_Set,importance="impurity", save.memory = TRUE, probability=TRUE)
probabilities <- as.data.frame(predict(mdl, data = Test_Set,type='response', verbose = TRUE)$predictions)

Мы всегда можем проверить, согласны ли они:

par(mfrow=c(1,2))
boxplot(probabilities[,"0"] ~ Test_Set$Species,ylab="Prob 0",xlab="Actual label")
boxplot(probabilities[,"1"] ~ Test_Set$Species,ylab="Prob 1",xlab="Actual label")

enter image description here

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

max.col(probabilities) - 1
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 0
[39] 0 0 0 0 0 0 0 0 0 0 0 0

Это проходит через каждый ряд вероятностей, возвращает 1 или 2 в зависимости от того, какой столбец имеет максимальную вероятность, и мы просто вычтите 1 из него, чтобы получить 0,1. Для матрицы путаницы:

caret::confusionMatrix(table(max.col(probabilities) - 1,Test_Set$Species))
Confusion Matrix and Statistics


     0  1
  0 31  2
  1  0 17

               Accuracy : 0.96            
                 95% CI : (0.8629, 0.9951)
    No Information Rate : 0.62            
    P-Value [Acc > NIR] : 2.048e-08 

В вашем случае вы можете просто сделать:

confusionMatrix(table(max.col(probabilities)-1,Test_Set$BiClass))
...