Ho intenzione di fare la tesi che il trattamento di una variabile veramente categorica, non ordinali come può continuo a volte ha senso.
Se si stanno costruendo alberi decisionali basati su grandi set di dati, potrebbe essere costoso in termini di potenza di elaborazione e memoria convertire le variabili categoriali in variabili fittizie. Inoltre, alcuni modelli (ad es. randomForest
In R) non sono in grado di gestire variabili categoriali con molti livelli.
In questi casi, un modello basato su alberi dovrebbe essere in grado di identificare categorie estremamente importanti, ANCHE SE sono codificate come variabili continue. Un esempio inventato:
set.seed(42)
library(caret)
n <- 10000
a <- sample(1:100, n, replace=TRUE)
b <- sample(1:100, n, replace=TRUE)
e <- runif(n)
y <- 2*a + 1000*(b==7) + 500*(b==42) + 1000*e
dat1 <- data.frame(y, a, b)
dat2 <- data.frame(y, a, b=factor(b))
y è una variabile continua, a è una variabile continua e b è una variabile categoriale. Tuttavia, in dat1
b è trattato come continuo.
Adattando un albero decisionale a questi 2 set di dati, troviamo che dat1
è leggermente peggio di dat2
:
model1 <- train(y~., dat1, method='rpart')
model2 <- train(y~., dat2, method='rpart')
> min(model1$results$RMSE)
[1] 302.0428
> min(model2$results$RMSE)
[1] 294.1411
Se guardi i 2 modelli, scoprirai che sono molto simili, ma model1 perde l'importanza di b == 42:
> model1$finalModel
n= 10000
node), split, n, deviance, yval
* denotes terminal node
1) root 10000 988408000 614.0377
2) a< 42.5 4206 407731400 553.5374 *
3) a>=42.5 5794 554105700 657.9563
6) b>=7.5 5376 468539000 649.2613 *
7) b< 7.5 418 79932820 769.7852
14) b< 6.5 365 29980450 644.6897 *
15) b>=6.5 53 4904253 1631.2920 *
> model2$finalModel
n= 10000
node), split, n, deviance, yval
* denotes terminal node
1) root 10000 988408000 614.0377
2) b7< 0.5 9906 889387900 604.7904
4) a< 42.5 4165 364209500 543.8927 *
5) a>=42.5 5741 498526600 648.9707
10) b42< 0.5 5679 478456300 643.7210 *
11) b42>=0.5 62 5578230 1129.8230 *
3) b7>=0.5 94 8903490 1588.5500 *
Tuttavia, model1 viene eseguito in circa 1/10 del tempo di model2:
> model1$times$everything
user system elapsed
4.881 0.169 5.058
> model2$times$everything
user system elapsed
45.060 3.016 48.066
Ovviamente puoi modificare i parametri del problema per trovare situazioni in cui le dat2
prestazioni sono di gran lunga superiori dat1
o dat1
leggermente superiori dat2
.
Non sto sostenendo in generale il trattamento di variabili categoriche come continue, ma ho riscontrato situazioni in cui ciò ha notevolmente ridotto il tempo necessario per adattarsi ai miei modelli, senza ridurne la precisione predittiva.