Как извлечь векторы прогнозов и фактических значений из матрицы, чтобы использовать их с confusionMatrix () в R?

#r #r-caret #confusion-matrix

#r #r-каретка #путаница-матрица

Вопрос:

Допустим, у меня есть матрица

 > a <- matrix(c(1,2,3,4,5,6,7,8,9),nrow=3)
> rownames(a)=c('A','B','C')
> colnames(a)=c('A','B','C')
> a
  A B C
A 1 4 7
B 2 5 8
C 3 6 9
  

Учитывая, что столбцы будут представлять фактический класс, а строки — прогнозируемый класс, как я могу извлечь векторы прогнозов и фактических значений, чтобы использовать их в confusionMatrix()?.

Ответ №1:

Я предполагаю, что вы имеете в виду confusionMatrix() from caret . Это уже матрица путаницы, и вы можете просто передать прогнозы в функцию, используя as.table() , см. Пример, где мы настраиваем модель и обучаем / тестируем данные:

 library(caret)
set.seed(111)
idx = sample(1:nrow(iris),100)
trainData = iris[idx,]
testData = iris[-idx,]

mdl = train(Species ~ .,data=trainData,
method="rf",trControl=trainControl(method="cv"))
pred = predict(mdl,testData)
actual = testData$Species
  

Матрица путаницы с метками:

 confusionMatrix(pred,actual)
Confusion Matrix and Statistics

            Reference
Prediction   setosa versicolor virginica
  setosa         20          0         0
  versicolor      0         11         2
  virginica       0          0        17
  

Матрица путаницы с таблицей или матрицей :

 a = matrix(table(pred,actual),nrow=3)
colnames(a) = levels(testData$Species)
rownames(a) = levels(testData$Species)

           setosa versicolor virginica
setosa         20          0         0
versicolor      0         11         2
virginica       0          0        17

confusionMatrix(as.table(a))

Confusion Matrix and Statistics

           setosa versicolor virginica
setosa         20          0         0
versicolor      0         11         2
virginica       0          0        17

Overall Statistics
                                          
               Accuracy : 0.96            
                 95% CI : (0.8629, 0.9951)
    No Information Rate : 0.4             
    P-Value [Acc > NIR] : < 2.2e-16  
  

Если они вам действительно нужны в векторе (для меня это звучит очень странно), используя:

 actual_vector = rep(colnames(a),colSums(a))
pred_vector = rep(rownames(a),rowSums(a))

table(actual_vector) == table(actual)
actual_vector
    setosa versicolor  virginica 
      TRUE       TRUE       TRUE 

table(pred_vector) == table(pred)
pred_vector
    setosa versicolor  virginica 
      TRUE       TRUE       TRUE 
  

Комментарии:

1. Я имел в виду пакет caret, и он отлично работает для функции confusionMatrix, спасибо. Я на самом деле спросил о получении векторов из матрицы, потому что я мог бы также использовать их для других функций в пакете, которые не могут принимать объект matrix(table (a)), так что вы знаете, как / если это можно сделать относительно простым способом?