Gerçekten kategorik, sıra dışı bir değişkeni sürekli olarak ele almanın bazen mantıklı olabileceği iddiasını getireceğim.
Büyük veri kümelerine dayanan karar ağaçları oluşturuyorsanız, kategorik değişkenleri yapay değişkenlere dönüştürmek işlem gücü ve bellek açısından maliyetli olabilir. Ayrıca, bazı modeller (örneğin randomForest
R), kategorik değişkenleri pek çok düzeyde işlemez.
Bu durumlarda, ağaç tabanlı bir model, sürekli değişken olarak kodlanmışsa, EVEN IF son derece önemli kategorileri tanımlayabilmelidir. Kararlı bir örnek:
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 sürekli bir değişkendir, a sürekli bir değişkendir ve b kategorik bir değişkendir. Bununla birlikte, dat1
b'de sürekli olarak kabul edilir.
Bu 2 veri setine bir karar ağacı koyarak, bunun dat1
aşağıdakilerden biraz daha kötü olduğunu bulduk 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
2 modele bakarsanız, bunların çok benzer olduğunu göreceksiniz, ancak model1 b == 42'nin önemini özlüyor:
> 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 *
Bununla birlikte, model1, model2'nin yaklaşık 1 / 10'unda çalışır:
> model1$times$everything
user system elapsed
4.881 0.169 5.058
> model2$times$everything
user system elapsed
45.060 3.016 48.066
Elbette, problemin parametrelerini daha iyi veya biraz daha iyi performans dat2
gösterdiği durumları bulmak için ayarlayabilirsiniz .dat1
dat1
dat2
Genelde kategorik değişkenleri sürekli olarak ele almayı savunmuyorum, ancak bunun tahmin edilme doğruluğunu düşürmeden modelime uyması için gereken süreyi büyük ölçüde azalttığı durumlar buldum.