簡體   English   中英

使用插入符號堆疊的混淆矩陣中的錯誤

[英]Error in the confusion matrix for Stacking using Caret

我是 Caret 和 R 的新手,並且對堆疊有疑問。 我收到以下有關混淆矩陣的錯誤消息:

“表中的錯誤(數據,參考,dnn = dnn,...):所有 arguments 必須具有相同的長度”

能否請您提供有關如何解決此問題的意見,謝謝。 提供以下詳細信息。


步驟1。 我將數據分為訓練集、驗證集和測試集。 使用火車 function,我使用 3 種方法(rf、gbm、lda)從訓練集中創建了對象。

trCtrl <- trainControl(method = 'cv', number = 3); 
rfObj <- train(diagnosis~., data = training, method = "rf", trControl = trCtrl); gbmObj <- train(diagnosis~., data = training, method = "gbm", trControl = trCtrl, verbose = F); ldaObj <- train(diagnosis~., data = training, method = "lda")

第2步。 使用驗證集中的上述對象,我對驗證集進行了預測,並在數據框中收集了這些信息。 所以這個數據框有 4 列,3 列來自預測,1 列來自驗證$y。

rfPred <- predict(rfObj, newdata = validation); gbmPred <- predict(gbmObj, newdata = validation); ldaPred <- predict(ldaObj, newdata = validation);

metaTrain <- data.frame(rfPred, gbmPred, ldaPred, diagnosis = validation$diagnosis)

在這個數據幀上使用隨機森林訓練 function,我創建了最終的 object。

metaObj <- train(diagnosis~., data = metaTrain, method = "rf", trControl = trCtrl)

第三步。 最后,使用測試集,我使用從 Step1 創建的對象得到預測。 我將這些預測組合成一個數據框(有 3 列)。 接下來,使用從 Step2 創建的 object,我預測剛剛創建的這個數據幀。

rfPredTest <- predict(rfObj, newdata = testing); gbmPredTest <- predict(gbmObj, newdata = testing); ldaPredTest <- predict(ldaObj, newdata = testing); finalDF <- data.frame(rfPredTest, gbmPredTest, ldaPredTest); finalPred <- predict(metaObj, newdata = finalDF)

我在這里收到以下消息:“'newdata' 有 82 行,但找到的變量有 44 行。”

接着 -

confusionMatrix(finalPred, testing$diagnosis)

我收到以下錯誤:

表中的錯誤(數據,參考,dnn = dnn,...):所有 arguments 必須具有相同的長度

你能告訴我我做錯了什么嗎? 感謝您對此的幫助。

制作一個可重現的示例,以幫助社區幫助您。 我假設您正在調整分類 model (由於使用method="lda" )。 如果您是caret的新手,請閱讀寫得非常好的 package 小插圖( package 小插圖

library(caret)

df <- iris
#split data into train, validation and test
ind <- createFolds(df$Species,k=3)
train <- df[ind$Fold1,]
val <- df[ind$Fold2,]
test <- df[ind$Fold3,]

由於train算法中使用的程序,驗證集並不是必需的,但訓練和測試集就足夠了。 但是,在這里我繼續您的代碼行

#set the resampling method (3-fold cross-validation)
trCtrl <- trainControl(method = 'cv', number = 3)

rfObj <-
train(Species ~ .,
    data = train,
    method = "rf",
    trControl = trCtrl)

bgbmObj <-
train(
Species ~ .,
data = train,
method = "gbm",
trControl = trCtrl,
verbose = F
)
ldaObj <- train(Species ~ ., data = train, method = "lda", trControl = trCtrl)

默認情況下, train測試每個調整參數的 3 個不同值(即隨機randomforests mtry 3 個值; interaction.depthn.trees的 3 個值,用於Stochastic Gradient Boosting ecc 的總共 3^2=9 個組合...)。 現在我們已經擬合了模型,我們可以比較它們:

resamps <- resamples(list(RF = rfObj,
                      GBM = gbmObj,
                      LDA = ldaObj))
summary(resamps)
bwplot(resamps, layout = c(2, 1))

Note that for every model object the best model has already been built with all the training data, regardless of the chosen resampling method, based on the best tuning parameters set obtained from the resampling technique (you can access the final model with ldaObj$finalModel .默認情況下,當您將predict與插入符號 model 一起使用時,使用$finalModel )。

您的以下分析步驟對我來說非常不尋常。 但是,如上所述,我繼續您的代碼行。 錯誤在finalPred <- predict(metaObj, newdata = finalDF)因為您使用metaObj中的變量構建了metaTrain (即rfPred, gbmPred, ldaPred ,所以metaObj model 需要相同的變量名。您可以使用colnames設置它們

rfPred <-
predict(rfObj, newdata = val)
gbmPred <-
predict(gbmObj, newdata = val)
ldaPred <- predict(ldaObj, newdata = val)

metaTrain <-
data.frame(rfPred, gbmPred, ldaPred, Species = val$Species)

metaObj <- train(Species~., data = metaTrain, method = "rf", trControl = trCtrl)

rfPredTest <-
predict(rfObj, newdata = test)
gbmPredTest <-
predict(gbmObj, newdata = test)
ldaPredTest <-
predict(ldaObj, newdata = test)
finalDF <-
data.frame(rfPredTest, gbmPredTest, ldaPredTest)
#here we set the same colnames of the metaTrain object
colnames(finalDF) <- colnames(metaTrain[,1:3])

finalPred <- predict(metaObj, newdata = finalDF)

confusionMatrix(finalPred, test$Species)

現在一切都像一個魅力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM