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"
Essayez d'utiliser:
confusionMatrix(table(Argument 1, Argument 2))
Cela a fonctionné pour moi.
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.
Essayez de spécifier na.pass
pour l'option na.action
:
predictionsTree <- predict(treeFit, testdata,na.action = na.pass)
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),]
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.
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"))