Подтвердить что ты не робот

Ошибка в ConfusionMatrix, данные и ссылочные факторы должны иметь одинаковое количество уровней

Я подготовил древовидную модель с R-кареткой. Теперь я пытаюсь создать матрицу путаницы и продолжаю получать следующую ошибку:

Ошибка в confusionMatrix.default(предсказанияTree, testdata $catgeory): данные и ссылочные факторы должны иметь одинаковое количество уровней

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)

Ошибка при создании матрицы путаницы. Уровни одинаковы для обоих объектов. Я не могу понять, в чем проблема. Их структура и уровни приведены ниже. Они должны быть одинаковыми. Любая помощь будет принята с благодарностью за то, что она меня расколола!

> 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"       
4b9b3361

Ответ 1

Попробуйте использовать:

confusionMatrix(table(Argument 1, Argument 2)) 

Это сработало для меня.

Ответ 2

Возможно, ваша модель не предсказывает определенный фактор. Используйте функцию table() вместо confusionMatrix() чтобы увидеть, в этом ли проблема.

Ответ 3

Попробуйте указать na.pass для параметра na.action:

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

Ответ 4

Измените их на фрейм данных, а затем используйте их в функции 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"))

Ответ 5

Возможно, в тестовых данных отсутствуют значения, добавьте следующую строку перед "предсказаниямиTree < - pred (treeFit, testdata)", чтобы удалить NA. У меня была такая же ошибка, и теперь она работает для меня.

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

Ответ 6

Проблема длины, с которой вы сталкиваетесь, вероятно, связана с наличием NA в наборе тренировок - либо отбрасывать случаи, которые не являются завершенными, либо навязывать, чтобы у вас не было отсутствующих значений.

Ответ 7

У меня была такая же проблема, но я пошел дальше и изменил ее после прочтения файла данных так.

data = na.omit(data)

Спасибо всем за указатель!

Ответ 8

убедитесь, что вы установили пакет со всеми его зависимостями:

install.packages('caret', dependencies = TRUE)

confusionMatrix( table(prediction, true_value) )

Ответ 9

Если ваши данные содержат NA, то иногда они будут рассматриваться как факторный уровень, поэтому сначала пропустите эти NA

DF = na.omit(DF)

Затем, если ваша модель соответствует неверному уровню, лучше использовать таблицы

confusionMatrix(table(Arg1, Arg2))

Ответ 10

confusionMatrix(test_pred, testData$replace_median_aliveat1 )

Ошибка: data и reference должны быть факторами с одинаковыми уровнями.

levels(test_pred)

NULL

как убрать эту ошибку, так как уровни NULL