web-dev-qa-db-fra.com

Erreur dans ConfusionMatrix, les données et les facteurs de référence doivent avoir le même nombre de niveaux.

J'ai formé un modèle d'arbre avec R. caret. J'essaie maintenant de générer une matrice de confusion et de recevoir l'erreur suivante:

Erreur dans confusionMatrix.default (predictionsTree, testdata $ catgeory) : les données et les facteurs de référence doivent avoir le même nombre de niveaux

prob <- 0.5 #Specify class split
singleSplit <- createDataPartition(modellingData2$category, p=prob,
                                   times=1, list=FALSE)
cvControl <- trainControl(method="repeatedcv", number=10, repeats=5)
traindata <- modellingData2[singleSplit,]
testdata <- modellingData2[-singleSplit,]
treeFit <- train(traindata$category~., data=traindata,
                 trControl=cvControl, method="rpart", tuneLength=10)
predictionsTree <- predict(treeFit, testdata)
confusionMatrix(predictionsTree, testdata$catgeory)

L'erreur se produit lors de la génération de la matrice de confusion. Les niveaux sont les mêmes sur les deux objets. Je ne peux pas comprendre quel est le problème. Leur structure et leurs niveaux sont donnés ci-dessous . Ils devraient être les mêmes. Toute aide serait grandement appréciée car elle me faisait craquer !!

> str(predictionsTree)
 Factor w/ 30 levels "16-Merchant Service Charge",..: 28 22 22 22 22 6 6 6 6 6 ...
> str(testdata$category)
 Factor w/ 30 levels "16-Merchant Service Charge",..: 30 30 7 7 7 7 7 30 7 7 ...

> levels(predictionsTree)
 [1] "16-Merchant Service Charge"   "17-Unpaid Cheque Fee"         "18-Gov. Stamp Duty"           "Misc"                         "26-Standard Transfer Charge" 
 [6] "29-Bank Giro Credit"          "3-Cheques Debit"              "32-Standing Order - Debit"    "33-Inter Branch Payment"      "34-International"            
[11] "35-Point of Sale"             "39-Direct Debits Received"    "4-Notified Bank Fees"         "40-Cash Lodged"               "42-International Receipts"   
[16] "46-Direct Debits Paid"        "56-Credit Card Receipts"      "57-Inter Branch"              "58-Unpaid Items"              "59-Inter Company Transfers"  
[21] "6-Notified Interest Credited" "61-Domestic"                  "64-Charge Refund"             "66-Inter Company Transfers"   "67-Suppliers"                
[26] "68-Payroll"                   "69-Domestic"                  "73-Credit Card Payments"      "82-CHAPS Fee"                 "Uncategorised"   

> levels(testdata$category)
 [1] "16-Merchant Service Charge"   "17-Unpaid Cheque Fee"         "18-Gov. Stamp Duty"           "Misc"                         "26-Standard Transfer Charge" 
 [6] "29-Bank Giro Credit"          "3-Cheques Debit"              "32-Standing Order - Debit"    "33-Inter Branch Payment"      "34-International"            
[11] "35-Point of Sale"             "39-Direct Debits Received"    "4-Notified Bank Fees"         "40-Cash Lodged"               "42-International Receipts"   
[16] "46-Direct Debits Paid"        "56-Credit Card Receipts"      "57-Inter Branch"              "58-Unpaid Items"              "59-Inter Company Transfers"  
[21] "6-Notified Interest Credited" "61-Domestic"                  "64-Charge Refund"             "66-Inter Company Transfers"   "67-Suppliers"                
[26] "68-Payroll"                   "69-Domestic"                  "73-Credit Card Payments"      "82-CHAPS Fee"                 "Uncategorised"       
17
user2987739

Essayez d'utiliser: 

confusionMatrix(table(Argument 1, Argument 2)) 

Cela a fonctionné pour moi.

9
Mayk Tulio

Peut-être que votre modèle ne prédit pas un certain facteur… .. Utilisez la fonction table() au lieu de confusionMatrix() pour voir si c'est le problème.

4
Red

Essayez de spécifier na.pass pour l'option na.action:

predictionsTree <- predict(treeFit, testdata,na.action = na.pass)
2
aristotll

Il se peut qu'il y ait des valeurs manquantes dans les données test. Ajoutez la ligne suivante avant "predictionsTree <- predict (treeFit, testdata)" pour supprimer les NA. J'ai eu la même erreur et maintenant cela fonctionne pour moi.

testdata <- testdata[complete.cases(testdata),]
0
EaswerC

Le problème de longueur que vous rencontrez est probablement dû à la présence d'AN dans l'ensemble de formation: supprimez les cas incomplets ou imputez-les pour ne pas avoir de valeurs manquantes. 

0
orange1

Transformez-les en un bloc de données puis utilisez-les dans la fonction confusionMatrix:

pridicted <- factor(predict(treeFit, testdata))
real <- factor(testdata$catgeory)

my_data1 <- data.frame(data = pridicted, type = "prediction")
my_data2 <- data.frame(data = real, type = "real")
my_data3 <- rbind(my_data1,my_data2)

# Check if the levels are identical
identical(levels(my_data3[my_data3$type == "prediction",1]) , levels(my_data3[my_data3$type == "real",1]))

confusionMatrix(my_data3[my_data3$type == "prediction",1], my_data3[my_data3$type == "real",1],  dnn = c("Prediction", "Reference"))
0
S. Think