क्या XGBoost मल्टीकोलिनरिटी को खुद से संभालता है?


23

मैं वर्तमान में 21 सुविधाओं (कुछ 150 सुविधाओं की सूची में से चयनित) के साथ डेटा-सेट पर XGBoost का उपयोग कर रहा हूं, फिर ~ 98 सुविधाओं को प्राप्त करने के लिए एक-हॉट ने उन्हें कोडित किया। इन 98 में से कुछ विशेषताएं कुछ हद तक बेमानी हैं, उदाहरण के लिए: एक चर (सुविधा) भी और रूप में प्रकट होता है ।ABACA

मेरे प्रश्न हैं:

  • कैसे ( अगर? ) बूस्टेड निर्णय पेड़ बहुसंख्यात्मकता को संभालते हैं?
  • यदि इसे नहीं संभाला जाता है तो बहुसंस्कृति का अस्तित्व भविष्यवाणी को कैसे प्रभावित करेगा?

जो मैं समझता हूं, वह मॉडल एक से अधिक पेड़ सीख रहा है और अंतिम भविष्यवाणी व्यक्तिगत भविष्यवाणियों की "भारित राशि" जैसी चीज पर आधारित है। इसलिए यदि यह सही है, तो बूस्टेड डिसीजन ट्रीब चर के बीच सह-निर्भरता को संभालने में सक्षम होना चाहिए

इसके अलावा, एक संबंधित नोट पर - XGBoost में चर महत्व की वस्तु कैसे काम करती है?


मैं समझता हूं कि पेड़ बहुसंख्याता को संभाल सकते हैं। लेकिन प्रतिगमन-आधारित XGBoost के बारे में क्या? क्या यह बहु-समरूपता को भी संभाल सकता है? > निर्णय वृक्ष प्रकृति प्रतिरक्षा से बहु-संपुष्टि के लिए हैं। > उदाहरण के लिए, यदि आपके पास 2 सुविधाएँ हैं जो 99% सहसंबद्ध हैं, जब> विभाजन पर निर्णय लेने से पेड़ उनमें से केवल एक का चयन करेगा। अन्य> मॉडल जैसे कि लॉजिस्टिक रिग्रेशन दोनों सुविधाओं का उपयोग करेगा। >> चूंकि बूस्टेड पेड़ व्यक्तिगत निर्णय पेड़ों का उपयोग करते हैं, वे भी हैं> बहु-संपुष्टि द्वारा अप्रभावित। हालाँकि, इसके लिए एक अच्छा अभ्यास> टीआर के लिए इस्तेमाल किए गए किसी भी डेटासेट से किसी भी अनावश्यक सुविधाओं को हटाने के लिए
जे सक्सेना

जवाबों:


27

निर्णय वृक्ष प्रकृति प्रतिरक्षा से बहु-संपुष्टि के लिए हैं। उदाहरण के लिए, यदि आपके पास 2 विशेषताएं हैं जो 99% सहसंबद्ध हैं, तो विभाजित होने पर निर्णय लेने से पेड़ केवल उनमें से एक का चयन करेगा। लॉजिस्टिक रिग्रेशन जैसे अन्य मॉडल दोनों सुविधाओं का उपयोग करेंगे।

चूँकि बढ़े हुए वृक्ष व्यक्तिगत निर्णय वृक्षों का उपयोग करते हैं, वे बहु-संपुष्टि द्वारा अप्रभावित रहते हैं। हालांकि, मॉडल के एल्गोरिदम के बावजूद, प्रशिक्षण के लिए उपयोग किए जाने वाले किसी भी डेटासेट से किसी भी अनावश्यक सुविधाओं को हटाने के लिए यह एक अच्छा अभ्यास है। आपके मामले में जब से आप नई सुविधाएँ प्राप्त कर रहे हैं, आप इस दृष्टिकोण का उपयोग कर सकते हैं, प्रत्येक सुविधा के महत्व का मूल्यांकन कर सकते हैं और अपने अंतिम मॉडल के लिए केवल सर्वोत्तम सुविधाओं को बनाए रख सकते हैं।

एक xgboost मॉडल का महत्व मैट्रिक्स वास्तव में एक डेटाटेबल ऑब्जेक्ट है जिसमें पहले कॉलम में उन सभी विशेषताओं के नामों को सूचीबद्ध किया गया है जो वास्तव में बढ़े हुए पेड़ों में उपयोग किए जाते हैं। दूसरा स्तंभ गेन मीट्रिक है जो मॉडल में प्रत्येक पेड़ के लिए प्रत्येक सुविधा के योगदान को लेते हुए गणना की गई मॉडल के संबंधित योगदान के बारे में बताता है। एक अन्य विशेषता की तुलना में इस मीट्रिक का एक उच्च मूल्य का तात्पर्य यह है कि यह भविष्यवाणी पैदा करने के लिए अधिक महत्वपूर्ण है।


7

मैं इस बारे में उत्सुक था और कुछ परीक्षण किए।

मैंने हीरे के डाटासेट पर एक मॉडल को प्रशिक्षित किया है, और देखा है कि चर "x" यह अनुमान लगाने के लिए सबसे महत्वपूर्ण है कि क्या हीरे की कीमत एक निश्चित सीमा से अधिक है। फिर, मैंने एक्स के लिए सहसंबद्ध कई कॉलम जोड़े हैं, एक ही मॉडल चलाया है, और समान मानों का अवलोकन किया है।

ऐसा लगता है कि जब दो स्तंभों के बीच सहसंबंध 1 होता है, तो xgboost मॉडल की गणना करने से पहले अतिरिक्त स्तंभ को हटा देता है, इसलिए महत्व प्रभावित नहीं होता है। हालाँकि, जब आप एक स्तंभ जोड़ते हैं जो आंशिक रूप से दूसरे से संबंधित होता है, इस प्रकार एक कम गुणांक के साथ, मूल चर x का महत्व कम हो जाता है।

उदाहरण के लिए यदि मैं एक चर xy = x + y जोड़ता हूं, तो x और y दोनों का महत्व घटता है। इसी तरह, अगर मैं r = 0.4, 0.5 या 0.6 के साथ नए चर जोड़ता हूं, तो x का महत्व कम हो जाता है।

मुझे लगता है कि जब आप मॉडल की सटीकता की गणना करते हैं, तो कोलीनियरिटी को बढ़ावा देने के लिए कोई समस्या नहीं होती है, क्योंकि निर्णय का पेड़ परवाह नहीं करता है कि किस चर का उपयोग किया जाता है। हालांकि यह चर के महत्व को प्रभावित कर सकता है, क्योंकि दो सहसंबद्ध चर में से एक को हटाने से मॉडल की सटीकता पर बड़ा प्रभाव नहीं पड़ता है, यह देखते हुए कि अन्य में समान जानकारी शामिल है।

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

हीरे के डेटा पर एक मॉडल का मूल्यांकन करें

हम अनुमान लगाते हैं कि क्या मूल्य 400 से अधिक है, सभी संख्यात्मक चर उपलब्ध हैं (कैरेट, गहराई, तालिका, x, y, x)

ध्यान दें कि 0.375954 के महत्वपूर्ण लाभ स्कोर के साथ x सबसे महत्वपूर्ण चर है।

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

मॉडल डायमंड्स पर प्रशिक्षित, आर = 1 से एक्स के साथ एक चर जोड़ने

यहां हम एक नया कॉलम जोड़ते हैं, जो हालांकि कोई नई जानकारी नहीं जोड़ता है, क्योंकि यह पूरी तरह से x से संबंधित है।

ध्यान दें कि यह नया चर आउटपुट में मौजूद नहीं है। ऐसा लगता है कि गणना शुरू करने से पहले xgboost स्वचालित रूप से पूरी तरह से सहसंबद्ध चर को हटा देता है। X का महत्व लाभ समान है, 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 के लिए एक स्तंभ जोड़ने

हम एक नया कॉलम xy = x + y जोड़ते हैं। यह आंशिक रूप से x और y दोनों से संबंधित है।

ध्यान दें कि x और y का महत्व थोड़ा कम हो गया है, x के लिए 0.3759 से 0.3592 और y के लिए 0.116 से 0.079 तक जा रहा है।

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

मॉडल डायमंड्स डेटा पर प्रशिक्षित, निरर्थक स्तंभों को जोड़ने संशोधित

हम तीन नए कॉलम जोड़ते हैं जो x (r = 0.4, 0.5 और 0.6) से संबंधित हैं और देखें कि क्या होता है।

ध्यान दें कि x का महत्व कम हो जाता है, 0.3759 से 0.279 तक गिरता है।

#' 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

तियानकी चेन (2018) से एक जवाब है।

इस अंतर का फीचर महत्व विश्लेषण में एक कोने के मामले पर प्रभाव पड़ता है: सहसंबद्ध विशेषताएं। पूरी तरह से सहसंबद्ध दो सुविधाओं की कल्पना करें, ए और फीचर बी। एक विशिष्ट पेड़ के लिए, यदि एल्गोरिथ्म को उनमें से एक की आवश्यकता है, तो यह यादृच्छिक रूप से (दोनों बूस्टिंग और रैंडम फॉरेस्ट ™ में सच है) का चयन करेगा।

हालाँकि, रैंडम फ़ॉरेस्ट्स ™ में यह यादृच्छिक विकल्प प्रत्येक पेड़ के लिए किया जाएगा, क्योंकि प्रत्येक पेड़ दूसरों से स्वतंत्र है। इसलिए, अनुमानित रूप से, आपके मापदंडों के आधार पर, 50% पेड़ ए का चयन करेंगे और अन्य 50% फीचर बी का चयन करेंगे। इसलिए ए और बी में निहित जानकारी का महत्व (जो एक ही है, क्योंकि वे पूरी तरह से सहसंबद्ध हैं। ) A और B में पतला है इसलिए आपको आसानी से पता नहीं चलेगा कि यह जानकारी आपको बता देना महत्वपूर्ण है कि आप क्या भविष्यवाणी करना चाहते हैं! यह तब और भी बुरा है जब आपके पास 10 सहसंबद्ध विशेषताएं हैं ...

बूस्टिंग में, जब एल्गोरिथम द्वारा फीचर और परिणाम के बीच एक विशिष्ट लिंक सीखा गया है, तो वह उस पर रिफोकस नहीं करने की कोशिश करेगा (सिद्धांत रूप में ऐसा ही होता है, वास्तविकता हमेशा इतनी सरल नहीं होती है)। इसलिए, सभी महत्व फीचर ए या ऑन बी (लेकिन दोनों नहीं) पर होगा। आपको पता चल जाएगा कि टिप्पणियों और लेबल के बीच की कड़ी में एक विशेषता की महत्वपूर्ण भूमिका है। यदि आप उन सभी को जानना चाहते हैं, तो यह महत्वपूर्ण है कि आप जिन लोगों के बारे में जानना चाहते हैं, उनके लिए सहसंबद्ध सुविधाओं को खोजना महत्वपूर्ण है।

संक्षेप में, Xgboost बेतरतीब ढंग से प्रत्येक पेड़ में सहसंबद्ध सुविधाओं का उपयोग नहीं करता है, जो यादृच्छिक वन मॉडल ऐसी स्थिति से ग्रस्त है।

संदर्भ :

तियानकी चेन, मिशैल बैंजीन, टोंग ही। 2018. "Xgboost के साथ अपने डेटासेट को समझें।" https://cran.r-project.org/web/packages/xgboost/vignettes/discoverYourData.html#numeric-vs-categorical-variables


2

संदीप के जवाब पर एक टिप्पणी: मान लें कि आपकी 2 सुविधाएँ अत्यधिक कॉलिनियर हैं (समय के बराबर 99% कहते हैं) वास्तव में प्रत्येक विभाजन पर केवल 1 सुविधा का चयन किया जाता है, लेकिन अगले विभाजन के लिए, xgb अन्य सुविधा का चयन कर सकता है। इसलिए, xgb सुविधा रैंकिंग संभवतः 2 कॉलिनियर सुविधाओं को समान रूप से रैंक करेगी। कुछ पूर्व ज्ञान या अन्य सुविधा प्रसंस्करण के बिना, आपके पास इस प्रदान की गई रैंकिंग से यह पता लगाने के लिए लगभग कोई साधन नहीं है कि 2 सुविधाएँ कॉलिनियर हैं।

अब, रिश्तेदार महत्व के लिए जो कि xgboost को आउटपुट करता है, यह स्केलेर ग्रेडिएंट बूस्टेड ट्री रैंकिंग के समान (या शायद बिल्कुल समान) होना चाहिए। स्पष्टीकरण के लिए यहां देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.