XGBoost çoklu bağlantıyı tek başına ele alıyor mu?


23

Şu anda XGBoost'u 21 özellikli bir veri setinde kullanıyorum (yaklaşık 150 özellik listesinden seçildi), sonra ~ 98 özellik elde etmek için bir sıcak kodlu. Bu 98 özellikten birkaçı biraz fazladır, örneğin: değişken (özellik) da B olarak görünürbir veCBbir .Cbir

Sorularım:

  • Nasıl ( varsa? ) Karar Ağaçları kolu çoklu doğrusal Boosted mı?
  • Çoklu doğrusallığın varlığı, ele alınmazsa tahmini nasıl etkiler?

Anladığım kadarıyla, model birden fazla ağaç öğreniyor ve nihai tahmin, bireysel tahminlerin "ağırlıklı toplamı" gibi bir şeye dayanıyor. Bu doğru ise, o zaman Boosted Karar Ağaçları gereken değişkenler arasındaki ortak bağımlılığı işleyebilmelidir.

Ayrıca, ilgili bir notta - XGBoost'taki değişken önemdeki nesne nasıl çalışır?


Ağaçların çoklu doğrusallığı kaldırabileceğini anlıyorum. Peki ya regresyon tabanlı XGBoost? Aynı zamanda çok eşbiçimliğin üstesinden gelebilir mi? > Karar ağaçları, doğaları gereği, çok eşbiçimliğe karşı bağışıktır. Örneğin,% 99 ilişkili 2 özelliğiniz varsa, bir bölmeye karar verirken ağaç bunlardan sadece birini seçer. Lojistik regresyon gibi diğer modeller her iki özelliği de kullanır. >> Güçlendirilmiş ağaçlar bireysel karar ağaçları kullandığından, aynı zamanda çoklu-çarpışmasızlıktan etkilenmezler. Ancak, tra için kullanılan herhangi bir veri kümesinden gereksiz özellikleri kaldırmak iyi bir uygulamadır
Jay Saxena

Yanıtlar:


27

Karar ağaçları, doğaları gereği, çok eşbiçimliğe karşı bağışıktır. Örneğin,% 99 korelasyonlu 2 özelliğiniz varsa, bir bölünmeye karar verirken ağaç bunlardan sadece birini seçecektir. Lojistik regresyon gibi diğer modeller her iki özelliği de kullanır.

Güçlendirilmiş ağaçlar bireysel karar ağaçlarını kullandıkları için, aynı zamanda çoklu-çarpışmasızlıktan etkilenmezler. Bununla birlikte, modelin algoritmasına bakılmaksızın, eğitim için kullanılan herhangi bir veri kümesinden gereksiz özellikleri kaldırmak iyi bir uygulamadır. Sizin durumunuzda yeni özellikler elde ettiğiniz için bu yaklaşımı kullanabilir, her özelliğin önemini değerlendirebilir ve son modeliniz için yalnızca en iyi özellikleri koruyabilirsiniz.

Bir xgboost modelinin önem matrisi aslında güçlendirilmiş ağaçlarda kullanılan tüm özelliklerin adlarını listeleyen ilk sütuna sahip bir data.table nesnesidir. İkinci sütun, her bir özelliğin modeldeki her ağaç için katkısı alınarak hesaplanan ilgili özelliğin modele göreli katkısını ima eden Kazanç metriğidir. Bu metriğin başka bir özelliğe kıyasla daha yüksek bir değeri, bir tahmin oluşturmak için daha önemli olduğunu gösterir.


7

Bunu merak ettim ve birkaç test yaptım.

Elmas veri setinde bir model eğittim ve “x” değişkeninin, bir elmasın fiyatının belirli bir eşikten daha yüksek olup olmadığını tahmin etmek için en önemli olduğunu gözlemledim. Sonra, x ile yüksek düzeyde korelasyona sahip birden çok sütun ekledim, aynı modeli çalıştırdım ve aynı değerleri gözlemledim.

İki sütun arasındaki korelasyon 1 olduğunda, xgboost modeli hesaplamadan önce fazladan sütunu kaldırdığından önem etkilenmez. Bununla birlikte, bir başkasıyla kısmen ilişkili olan ve dolayısıyla daha düşük bir katsayılı bir sütun eklediğinizde, orijinal değişken x'in önemi azalır.

Örneğin, xy = x + y değişkenini eklersem, hem x hem de y'nin önemi azalır. Benzer şekilde, r = 0,4, 0,5 veya 0,6 ile yeni değişkenler eklersem, x'in önemi azalır.

Karar ağacının değişkenlerden hangisinin kullanıldığını umursamaması nedeniyle, kollektifliğin modelin doğruluğunu hesaplarken artırmak için bir sorun olmadığını düşünüyorum. Bununla birlikte, değişkenlerin önemini etkileyebilir, çünkü birbiriyle ilişkili iki değişkenten birinin kaldırılmasının, diğerinin benzer bilgiler içerdiği göz önüne alındığında, modelin doğruluğu üzerinde büyük bir etkisi yoktur.

library(tidyverse)
library(xgboost)

evaluate_model = function(dataset) {
    print("Correlation matrix")
    dataset %>% select(-cut, -color, -clarity, -price) %>% cor %>% print

    print("running model")
    diamond.model = xgboost(
        data=dataset %>% select(-cut, -color, -clarity, -price) %>% as.matrix, 
        label=dataset$price > 400, 
        max.depth=15, nrounds=30, nthread=2, objective = "binary:logistic",
        verbose=F
        )

    print("Importance matrix")
    importance_matrix <- xgb.importance(model = diamond.model)
    importance_matrix %>% print
    xgb.plot.importance(importance_matrix)
    }

> diamonds %>% head
carat   cut color   clarity depth   table   price   x   y   z
0.23    Ideal   E   SI2 61.5    55  326 3.95    3.98    2.43
0.21    Premium E   SI1 59.8    61  326 3.89    3.84    2.31
0.23    Good    E   VS1 56.9    65  327 4.05    4.07    2.31
0.29    Premium I   VS2 62.4    58  334 4.20    4.23    2.63
0.31    Good    J   SI2 63.3    58  335 4.34    4.35    2.75
0.24    Very Good   J   VVS2    62.8    57  336 3.94    3.96    2.48

Elmas verilerindeki bir modeli değerlendirin

Mevcut tüm sayısal değişkenler (karat, derinlik, tablo, x, y, x) göz önüne alındığında, fiyatın 400'den yüksek olup olmadığını tahmin ediyoruz.

X'in 0.375954 önem kazanma puanı ile en önemli değişken olduğunu unutmayın.

evaluate_model(diamonds)
    [1] "Correlation matrix"
               carat       depth      table           x           y          z
    carat 1.00000000  0.02822431  0.1816175  0.97509423  0.95172220 0.95338738
    depth 0.02822431  1.00000000 -0.2957785 -0.02528925 -0.02934067 0.09492388
    table 0.18161755 -0.29577852  1.0000000  0.19534428  0.18376015 0.15092869
    x     0.97509423 -0.02528925  0.1953443  1.00000000  0.97470148 0.97077180
    y     0.95172220 -0.02934067  0.1837601  0.97470148  1.00000000 0.95200572
    z     0.95338738  0.09492388  0.1509287  0.97077180  0.95200572 1.00000000
    [1] "running model"
    [1] "Importance matrix"
       Feature       Gain      Cover  Frequency
    1:       x 0.37595419 0.54788335 0.19607102
    2:   carat 0.19699839 0.18015576 0.04873442
    3:   depth 0.15358261 0.08780079 0.27767284
    4:       y 0.11645929 0.06527969 0.18813751
    5:   table 0.09447853 0.05037063 0.17151492
    6:       z 0.06252699 0.06850978 0.11786929

Diamonds üzerinde eğitilmiş model, r = 1'den x'e bir değişken ekleyerek

Burada, x ile mükemmel bir şekilde ilişkilendirildiği için yeni bir bilgi eklemeyen yeni bir sütun ekliyoruz.

Bu yeni değişkenin çıktıda mevcut olmadığını unutmayın. Görünüşe göre xgboost, hesaplamaya başlamadan önce mükemmel bir şekilde ilişkili değişkenleri otomatik olarak kaldırır. X'in önem kazancı aynıdır, 0.3759.

diamonds_xx = diamonds %>%
    mutate(xx = x + runif(1, -1, 1))
evaluate_model(diamonds_xx)
[1] "Correlation matrix"
           carat       depth      table           x           y          z
carat 1.00000000  0.02822431  0.1816175  0.97509423  0.95172220 0.95338738
depth 0.02822431  1.00000000 -0.2957785 -0.02528925 -0.02934067 0.09492388
table 0.18161755 -0.29577852  1.0000000  0.19534428  0.18376015 0.15092869
x     0.97509423 -0.02528925  0.1953443  1.00000000  0.97470148 0.97077180
y     0.95172220 -0.02934067  0.1837601  0.97470148  1.00000000 0.95200572
z     0.95338738  0.09492388  0.1509287  0.97077180  0.95200572 1.00000000
xx    0.97509423 -0.02528925  0.1953443  1.00000000  0.97470148 0.97077180
               xx
carat  0.97509423
depth -0.02528925
table  0.19534428
x      1.00000000
y      0.97470148
z      0.97077180
xx     1.00000000
[1] "running model"
[1] "Importance matrix"
   Feature       Gain      Cover  Frequency
1:       x 0.37595419 0.54788335 0.19607102
2:   carat 0.19699839 0.18015576 0.04873442
3:   depth 0.15358261 0.08780079 0.27767284
4:       y 0.11645929 0.06527969 0.18813751
5:   table 0.09447853 0.05037063 0.17151492
6:       z 0.06252699 0.06850978 0.11786929

X + y için bir sütun ekleyerek Diamonds üzerinde eğitilmiş model

Yeni bir sütun xy = x + y ekliyoruz. Bu kısmen hem x hem de y ile ilişkilidir.

X ve y'nin öneminin, x için 0,3759'dan 0,3592'ye ve y için 0,116'dan 0,079'a hafifçe azaldığını unutmayın.

diamonds_xy = diamonds %>%
    mutate(xy=x+y)
evaluate_model(diamonds_xy)

[1] "Correlation matrix"
           carat       depth      table           x           y          z
carat 1.00000000  0.02822431  0.1816175  0.97509423  0.95172220 0.95338738
depth 0.02822431  1.00000000 -0.2957785 -0.02528925 -0.02934067 0.09492388
table 0.18161755 -0.29577852  1.0000000  0.19534428  0.18376015 0.15092869
x     0.97509423 -0.02528925  0.1953443  1.00000000  0.97470148 0.97077180
y     0.95172220 -0.02934067  0.1837601  0.97470148  1.00000000 0.95200572
z     0.95338738  0.09492388  0.1509287  0.97077180  0.95200572 1.00000000
xy    0.96945349 -0.02750770  0.1907100  0.99354016  0.99376929 0.96744200
              xy
carat  0.9694535
depth -0.0275077
table  0.1907100
x      0.9935402
y      0.9937693
z      0.9674420
xy     1.0000000
[1] "running model"
[1] "Importance matrix"
   Feature       Gain      Cover  Frequency
1:       x 0.35927767 0.52924339 0.15952849
2:   carat 0.17881931 0.18472506 0.04793713
3:   depth 0.14353540 0.07482622 0.24990177
4:   table 0.09202059 0.04714548 0.16267191
5:      xy 0.08203819 0.04706267 0.13555992
6:       y 0.07956856 0.05284980 0.13595285
7:       z 0.06474029 0.06414738 0.10844794

Gereksiz sütunlar eklenerek değiştirilen Elmas verileri üzerinde eğitilmiş model

X (r = 0.4, 0.5 ve 0.6) ile ilişkili üç yeni sütun ekliyoruz ve ne olduğunu görüyoruz.

X'in öneminin 0.3759'dan 0.279'a düştüğünü unutmayın.

#' given a vector of values (e.g. diamonds$x), calculate three new vectors correlated to it
#' 
#' Source: https://stat.ethz.ch/pipermail/r-help/2007-April/128938.html
calculate_correlated_vars = function(x1) {

    # create the initial x variable
    #x1 <- diamonds$x

    # x2, x3, and x4 in a matrix, these will be modified to meet the criteria
    x234 <- scale(matrix( rnorm(nrow(diamonds) * 3), ncol=3 ))

    # put all into 1 matrix for simplicity
    x1234 <- cbind(scale(x1),x234)

    # find the current correlation matrix
    c1 <- var(x1234)

    # cholesky decomposition to get independence
    chol1 <- solve(chol(c1))

    newx <-  x1234 %*% chol1 

    # check that we have independence and x1 unchanged
    zapsmall(cor(newx))
    all.equal( x1234[,1], newx[,1] )

    # create new correlation structure (zeros can be replaced with other r vals)
    newc <- matrix( 
    c(1  , 0.4, 0.5, 0.6, 
      0.4, 1  , 0  , 0  ,
      0.5, 0  , 1  , 0  ,
      0.6, 0  , 0  , 1  ), ncol=4 )

    # check that it is positive definite
    eigen(newc)

    chol2 <- chol(newc)

    finalx <- newx %*% chol2 * sd(x1) + mean(x1)

    # verify success
    mean(x1)
    colMeans(finalx)

    sd(x1)
    apply(finalx, 2, sd)

    zapsmall(cor(finalx))
    #pairs(finalx)

    all.equal(x1, finalx[,1])
    finalx
}
finalx = calculate_correlated_vars(diamonds$x)
diamonds_cor = diamonds
diamonds_cor$x5 = finalx[,2]
diamonds_cor$x6 = finalx[,3]
diamonds_cor$x7 = finalx[,4]
evaluate_model(diamonds_cor)
[1] "Correlation matrix"
           carat        depth       table           x           y          z
carat 1.00000000  0.028224314  0.18161755  0.97509423  0.95172220 0.95338738
depth 0.02822431  1.000000000 -0.29577852 -0.02528925 -0.02934067 0.09492388
table 0.18161755 -0.295778522  1.00000000  0.19534428  0.18376015 0.15092869
x     0.97509423 -0.025289247  0.19534428  1.00000000  0.97470148 0.97077180
y     0.95172220 -0.029340671  0.18376015  0.97470148  1.00000000 0.95200572
z     0.95338738  0.094923882  0.15092869  0.97077180  0.95200572 1.00000000
x5    0.39031255 -0.007507604  0.07338484  0.40000000  0.38959178 0.38734145
x6    0.48879000 -0.016481580  0.09931705  0.50000000  0.48835896 0.48487442
x7    0.58412252 -0.013772440  0.11822089  0.60000000  0.58408881 0.58297414
                 x5            x6            x7
carat  3.903125e-01  4.887900e-01  5.841225e-01
depth -7.507604e-03 -1.648158e-02 -1.377244e-02
table  7.338484e-02  9.931705e-02  1.182209e-01
x      4.000000e-01  5.000000e-01  6.000000e-01
y      3.895918e-01  4.883590e-01  5.840888e-01
z      3.873415e-01  4.848744e-01  5.829741e-01
x5     1.000000e+00  5.925447e-17  8.529781e-17
x6     5.925447e-17  1.000000e+00  6.683397e-17
x7     8.529781e-17  6.683397e-17  1.000000e+00
[1] "running model"
[1] "Importance matrix"
   Feature       Gain      Cover  Frequency
1:       x 0.27947762 0.51343709 0.09748172
2:   carat 0.13556427 0.17401365 0.02680747
3:      x5 0.13369515 0.05267688 0.18155971
4:      x6 0.12968400 0.04804315 0.19821284
5:      x7 0.10600238 0.05148826 0.16450041
6:   depth 0.07087679 0.04485760 0.11251015
7:       y 0.06050565 0.03896716 0.08245329
8:   table 0.04577057 0.03135677 0.07554833
9:       z 0.03842355 0.04515944 0.06092608

6

Tianqi Chen'den (2018) bir cevap var.

Bu farkın özellik önem analizinde bir köşe durumu üzerinde etkisi vardır: ilişkili özellikler. İki özellik arasında mükemmel bir korelasyon olduğunu düşünün, özellik A ve özellik B.

Bununla birlikte, Random Forests ™ 'da bu rastgele seçim her ağaç için yapılacaktır, çünkü her ağaç diğerlerinden bağımsızdır. Bu nedenle, parametrelerinize bağlı olarak, ağaçların% 50'si A özelliğini, diğer% 50'si B özelliğini seçecektir. Dolayısıyla A ve B'de yer alan bilgilerin önemi (aynıdır, çünkü bunlar mükemmel şekilde ilişkilidir) ) A ve B'de seyreltilir. Böylece, bu bilginin tahmin etmek istediğinizi tahmin etmek için önemli olduğunu kolayca bilemezsiniz! 10 bağlantılı özelliğiniz olduğunda daha da kötüsü…

Artırmada, özellik ve sonuç arasındaki belirli bir bağlantı algoritma tarafından öğrenildiğinde, ona odaklanmamaya çalışacaktır (teoride ne olduğu, gerçeklik her zaman bu kadar basit değildir). Bu nedenle, tüm önem A özelliğinde veya B özelliğinde olacaktır (her ikisinde birden olmayacaktır). Gözlemler ile etiket arasındaki bağlantıda bir özelliğin önemli bir rolü olduğunu bileceksiniz. Hepsini bilmeniz gerekiyorsa, önemli olarak tespit edilen özelliklerle ilgili özellikleri aramak hala size bağlıdır.

Özetlemek gerekirse, Xgboost rasgele orman modelinin böyle bir durumdan muzdarip olduğu her ağaçtaki ilişkili özellikleri rastgele kullanmaz.

Referans :

Tianqi Chen, Michaël Benesty, Tong He. 2018. “Veri Kümenizi Xgboost ile Anlayın.” Https://cran.r-project.org/web/packages/xgboost/vignettes/discoverYourData.html#numeric-vs-categorical-variables .


2

Sandeep'in cevabına ilişkin bir açıklama: Özelliklerinizin 2'sinin yüksek oranda doğrusal olduğunu varsayarsak (zamanın% 99'una eşittir) Aslında her bir bölmede yalnızca 1 özellik seçilir, ancak bir sonraki bölme için xgb diğer özelliği seçebilir. Bu nedenle, xgb özellik sıralaması muhtemelen 2 colinear özelliği eşit olarak sıralayacaktır. Önceden bilgi veya başka bir özellik işleme olmadan, bu 2 özelliklerin doğrusal olduğunu saptamak için sağlanan bu sıralamadan neredeyse hiçbir yolunuz yoktur.

Şimdi, xgboost çıktısının göreli önemine gelince, sklearn gradyanı artırılmış ağaç sıralamasına çok benzer (veya belki de tam olarak benzer) olmalıdır. Açıklamalar için buraya bakın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.