Rpart vs. accento circonflesso rpart "Errore: valori mancanti nelle misure di rendimento ricampionate"

Aug 23 2020

Uso il pacchetto caret e ho provato a utilizzare il metodo rpart. È interessante notare che posso adattare un modello con il pacchetto rpart generale, ma non appena uso il pacchetto caret, non funziona più. Ciò che più mi lascia perplesso è che ho visto su vari siti web che rpart all'interno del cursore è stato utilizzato ad esempio per i dati di Boston.

Sono confuso se ho implementato il modello in modo errato o se ho perso un punto qui. Per rpart_tree2 (sotto) ricevo il seguente messaggio di errore: "In nominalTrainWorkflow (x = x, y = y, wts = weights, info = trainInfo,: C'erano valori mancanti nelle misure di prestazioni ricampionate."

So che potrei anche specificare, ad esempio, repeatcv, ma ciò non fa differenza per quanto riguarda il messaggio di errore.

Di seguito troverai un MWE (ho cercato di mantenerlo il più semplice possibile):

library(caret)
library(rpart)

data("Boston")

index <- sample(nrow(Boston),nrow(Boston)*0.75)
Boston.train <- Boston[index,]
Boston.test <- Boston[-index,]

rpart_tree1 <- rpart(medv ~ ., data = Boston.train)

rpart_tree2 <- train(medv ~., data = Boston.train, method = "rpart")

Risposte

3 missuse Aug 23 2020 at 12:56

L'avviso non è un problema.

Con cpvalori maggiori in alcuni ricampionamenti l'albero prodotto non ha divisioni. Quando un albero non ha suddivisioni, il valore previsto è la media dei valori di risultato del treno. Poiché i valori previsti non hanno varianza, la corfunzione genera un avviso e il risultato è NA. Questa funzione viene utilizzata per calcolare RSquared - quindi per questi ricampionamenti RSquared è NA- in altre parole manca - ciò che l'avviso implica.

Esempio:

library(caret)
library(rpart)
library(MASS)
data(Boston)

set.seed(1)
index <- sample(nrow(Boston),nrow(Boston)*0.75)
Boston.train <- Boston[index,]
Boston.test <- Boston[-index,]

inferiori cpnon producono avvisi:

rpart_tree2 <- train(medv ~., data = Boston.train, method = "rpart",
                     tuneGrid = data.frame(cp = c(0.01, 0.05, 0.1)))

quando specifico un cp più alto e un seme specifico:

set.seed(111)
rpart_tree3 <- train(medv ~., data = Boston.train, method = "rpart",
                     tuneGrid = data.frame(cp = c(0.4)),
                     trControl = trainControl(savePredictions = TRUE))

Warning message:
In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo,  :
  There were missing values in resampled performance measures.

Per esaminare il problema:

rpart_tree3$resample
        RMSE  Rsquared      MAE   Resample
1   7.530482 0.4361392 5.708437 Resample01
2   7.334995 0.2350619 5.392867 Resample02
3   7.178178 0.3971089 5.511530 Resample03
4   6.369189 0.2798907 4.851146 Resample04
5   7.550175 0.3344412 5.566677 Resample05
6   7.019099 0.4270561 5.160572 Resample06
7   7.197384 0.4530680 5.665177 Resample07
8   7.206760 0.3447690 5.290300 Resample08
9   7.408748 0.4553087 5.513998 Resample09
10  7.241468 0.4119979 5.452725 Resample10
11  7.562511 0.3967082 5.768643 Resample11
12  7.347378 0.3861702 5.225532 Resample12
13  7.124039 0.4039857 5.599800 Resample13
14  7.151013 0.3301835 5.490676 Resample14
15  6.518536 0.3835073 4.938662 Resample15
16 10.008008        NA 7.174290 Resample16
17  7.018742 0.4431380 5.379823 Resample17
18  7.454669 0.3888220 6.000062 Resample18
19  6.745457 0.3772237 5.175481 Resample19
20  6.864304 0.4179276 5.089924 Resample20
21  7.238874 0.2378432 5.234752 Resample21
22  7.581736 0.3707839 5.543641 Resample22
23  7.236317 0.3431725 5.278693 Resample23
24  7.232241 0.4196955 5.518907 Resample24
25  6.641846 0.3664023 4.683834 Resample25

Possiamo vedere il problema si è verificato in Resample16

library(tidyverse)
rpart_tree3$pred %>%
  filter(Resample == "Resample16") -> for_cor
head(for_cor)
      pred  obs rowIndex  cp   Resample
1 21.87018 15.6        1 0.4 Resample16
2 21.87018 22.3        3 0.4 Resample16
3 21.87018 13.4        6 0.4 Resample16
4 21.87018 12.7       10 0.4 Resample16
5 21.87018 18.6       11 0.4 Resample16
6 21.87018 19.0       13 0.4 Resample16

Possiamo vedere che pred è lo stesso per ogni riga di Resample16

 cor(for_cor$pred, for_cor$obs, use = "pairwise.complete.obs")
[1] NA
Warning message:
In cor(for_cor$pred, for_cor$obs, use = "pairwise.complete.obs") :
  the standard deviation is zero

Per vedere come viene calcolato RSquared nel cursore, controlla la fonte per postResample. Fondamentalmentecor(pred, obs)^2