XGBoost จัดการกับความหลากหลายด้วยตัวเองหรือไม่?


23

ขณะนี้ฉันกำลังใช้ XGBoost กับชุดข้อมูลที่มีคุณสมบัติ 21 รายการ (เลือกจากรายการของคุณสมบัติ 150 รายการ) จากนั้นจึงใช้รหัสร้อนเพื่อรับคุณสมบัติ ~ 98 ไม่กี่ของคุณสมบัติเหล่านี้ 98 จะค่อนข้างซ้ำซ้อนตัวอย่างเช่น: ตัวแปร (คุณลักษณะ) กยังปรากฏเป็นและ{A}ABACA

คำถามของฉันคือ:

  • ต้นไม้ตัดสินใจที่ได้รับการส่งเสริมจะจัดการกับความสัมพันธ์แบบหลายทางได้อย่างไร( ถ้า? )
  • การมีอยู่ของความหลากสีจะส่งผลกระทบต่อการทำนายอย่างไรถ้ามันไม่ได้ถูกจัดการ?

จากสิ่งที่ฉันเข้าใจรูปแบบคือการเรียนรู้มากกว่าหนึ่งต้นและการทำนายขั้นสุดท้ายขึ้นอยู่กับบางสิ่งบางอย่างเช่น "ผลรวมถ่วงน้ำหนัก" ของการทำนายรายบุคคล ดังนั้นหากสิ่งนี้ถูกต้องต้นไม้การตัดสินใจที่ถูกกระตุ้นควรจะสามารถจัดการการพึ่งพาระหว่างตัวแปรได้

นอกจากนี้ในบันทึกที่เกี่ยวข้อง - วัตถุที่มีความสำคัญของตัวแปรใน XGBoost ทำงานอย่างไร


ฉันเข้าใจว่าต้นไม้สามารถจัดการกับความหลากหลายทางชีวภาพได้ แต่ XGBoost ที่อิงกับการถดถอยล่ะ มันสามารถรองรับหลาย collinearity เช่นกัน? > ต้นไม้ในการตัดสินใจโดยธรรมชาตินั้นมีภูมิคุ้มกันต่อการมีหลาย collinearity ตัวอย่างเช่น> หากคุณมีคุณสมบัติ 2 อย่างที่มีความสัมพันธ์ 99% เมื่อ> การตัดสินใจแยกต้นไม้ต้นไม้จะเลือกหนึ่งคุณลักษณะเท่านั้น โมเดลอื่น ๆ เช่นการถดถอยแบบลอจิสติกจะใช้ทั้งคุณสมบัติ >> เนื่องจากต้นไม้ที่ได้รับการส่งเสริมใช้ต้นไม้ในการตัดสินใจแต่ละต้นต้นไม้เหล่านั้นจึงไม่ได้รับผลกระทบจากความหลากหลายเชิงซ้อน อย่างไรก็ตามเป็นวิธีปฏิบัติที่ดีในการ> ลบคุณลักษณะที่ซ้ำซ้อนออกจากชุดข้อมูลใด ๆ ที่ใช้สำหรับ tra
Jay Saxena

คำตอบ:


27

ต้นไม้ตัดสินใจโดยธรรมชาติภูมิคุ้มกันต่อหลาย collinearity ตัวอย่างเช่นหากคุณมีคุณสมบัติ 2 อย่างที่มีความสัมพันธ์ 99% เมื่อตัดสินใจแยกต้นไม้ต้นไม้จะเลือกเพียงหนึ่งคุณลักษณะเท่านั้น โมเดลอื่น ๆ เช่น Logistic regression จะใช้ทั้งคุณสมบัติ

เนื่องจากต้นไม้ที่ได้รับการส่งเสริมใช้ต้นไม้ในการตัดสินใจแต่ละต้นต้นไม้เหล่านั้นจึงไม่ได้รับผลกระทบจากความหลากหลายเชิงซ้อน อย่างไรก็ตามเป็นวิธีปฏิบัติที่ดีในการลบคุณลักษณะที่ซ้ำซ้อนออกจากชุดข้อมูลใด ๆ ที่ใช้สำหรับการฝึกอบรมโดยไม่คำนึงถึงอัลกอริทึมของแบบจำลอง ในกรณีของคุณเนื่องจากคุณได้รับคุณสมบัติใหม่คุณสามารถใช้วิธีนี้ประเมินความสำคัญของแต่ละคุณสมบัติและรักษาเฉพาะคุณสมบัติที่ดีที่สุดสำหรับรุ่นสุดท้ายของคุณ

เมทริกซ์ความสำคัญของโมเดล xgboost เป็นจริงวัตถุ data.table ที่มีคอลัมน์แรกที่แสดงชื่อของคุณสมบัติทั้งหมดที่ใช้จริงในต้นไม้ที่ได้รับการปรับปรุง คอลัมน์ที่สองคือตัวชี้วัดกำไรซึ่งแสดงถึงการมีส่วนร่วมที่สัมพันธ์กันของคุณลักษณะที่เกี่ยวข้องกับแบบจำลองที่คำนวณโดยการบริจาคคุณลักษณะของแต่ละต้นสำหรับต้นไม้แต่ละต้นในแบบจำลอง มูลค่าที่สูงขึ้นของตัวชี้วัดนี้เมื่อเปรียบเทียบกับคุณลักษณะอื่นแสดงว่าเป็นสิ่งสำคัญสำหรับการสร้างการทำนาย


7

ฉันอยากรู้เกี่ยวกับเรื่องนี้และทำการทดสอบไม่กี่

ฉันได้ฝึกฝนแบบจำลองบนชุดข้อมูลเพชรและสังเกตว่าตัวแปร“ x” เป็นสิ่งสำคัญที่สุดในการทำนายว่าราคาของเพชรสูงกว่าระดับที่กำหนดหรือไม่ จากนั้นฉันได้เพิ่มหลายคอลัมน์ที่มีความสัมพันธ์สูงกับ x, รันโมเดลเดียวกันและสังเกตค่าเดียวกัน

ดูเหมือนว่าเมื่อความสัมพันธ์ระหว่างสองคอลัมน์คือ 1, xgboost จะลบคอลัมน์พิเศษก่อนที่จะคำนวณรูปแบบดังนั้นความสำคัญจะไม่ได้รับผลกระทบ อย่างไรก็ตามเมื่อคุณเพิ่มคอลัมน์ที่มีความสัมพันธ์บางส่วนกับอีกคอลัมน์หนึ่งดังนั้นด้วยสัมประสิทธิ์ที่ลดลงความสำคัญของตัวแปรต้นฉบับ x จะลดลง

ตัวอย่างเช่นถ้าฉันเพิ่มตัวแปร xy = x + y ความสำคัญของ x และ y ลดลง ในทำนองเดียวกันความสำคัญของ x จะลดลงหากฉันเพิ่มตัวแปรใหม่ด้วย r = 0.4, 0.5 หรือ 0.6 แม้ว่าจะเพิ่มเพียงเล็กน้อย

ฉันคิดว่า collinearity ไม่ใช่ปัญหาสำหรับการเพิ่มเมื่อคุณคำนวณความถูกต้องของแบบจำลองเนื่องจากแผนภูมิการตัดสินใจไม่สนใจว่าจะใช้ตัวแปรตัวใดตัวหนึ่ง อย่างไรก็ตามมันอาจส่งผลกระทบต่อความสำคัญของตัวแปรเนื่องจากการลบหนึ่งในสองของตัวแปรที่มีความสัมพันธ์กันนั้นไม่มีผลกระทบอย่างมากต่อความแม่นยำของแบบจำลอง

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)

โปรดทราบว่า x เป็นตัวแปรที่สำคัญที่สุดโดยมีคะแนนการได้รับความสำคัญเท่ากับ 0.375954

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

รูปแบบการฝึกอบรมในเพชรเพิ่มตัวแปรด้วย r = 1 ถึง x

ที่นี่เราเพิ่มคอลัมน์ใหม่ซึ่งอย่างไรก็ตามไม่ได้เพิ่มข้อมูลใหม่เนื่องจากมันมีความสัมพันธ์อย่างสมบูรณ์กับ 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

รูปแบบการฝึกอบรมเกี่ยวกับ Diamonds เพิ่มคอลัมน์สำหรับ x + y

เราเพิ่มคอลัมน์ใหม่ xy = x + y นี่มีความสัมพันธ์บางส่วนกับทั้ง x และ y

โปรดทราบว่าความสำคัญของ x และ y ลดลงเล็กน้อยจาก 0.3759 เป็น 0.3592 สำหรับ x และจาก 0.116 ถึง 0.079 สำหรับ y

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

มีคำตอบจาก Tianqi Chen (2018)

ความแตกต่างนี้มีผลกระทบต่อกรณีมุมในการวิเคราะห์ความสำคัญของคุณลักษณะ: คุณลักษณะที่สัมพันธ์กัน ลองนึกภาพสองคุณสมบัติที่มีความสัมพันธ์อย่างสมบูรณ์แบบคุณสมบัติ A และคุณสมบัติ B สำหรับต้นไม้หนึ่งต้นหากอัลกอริทึมต้องการหนึ่งในนั้นมันจะเลือกแบบสุ่ม (จริงทั้งในการเร่งและการสุ่มป่า)

อย่างไรก็ตามใน Random Forests ™ตัวเลือกแบบสุ่มนี้จะทำกับต้นไม้แต่ละต้นเพราะต้นไม้แต่ละต้นนั้นเป็นอิสระจากต้นอื่น ๆ ดังนั้นโดยประมาณขึ้นอยู่กับพารามิเตอร์ของคุณ 50% ของต้นไม้จะเลือกคุณสมบัติ A และอีก 50% จะเลือกคุณสมบัติ B ดังนั้นความสำคัญของข้อมูลที่มีอยู่ใน A และ B (ซึ่งเหมือนกันเพราะมีความสัมพันธ์กันอย่างสมบูรณ์ ) ถูกเจือจางใน A และ B ดังนั้นคุณจะไม่ทราบได้ง่ายว่าข้อมูลนี้มีความสำคัญต่อการทำนายสิ่งที่คุณต้องการคาดการณ์! มันยิ่งแย่กว่าเดิมเมื่อคุณมีคุณสมบัติ 10 อย่างที่สัมพันธ์กัน ...

ในการเพิ่มประสิทธิภาพเมื่อการเชื่อมโยงระหว่างคุณลักษณะและผลลัพธ์ได้รับการเรียนรู้โดยอัลกอริทึมมันจะพยายามไม่ให้ความสำคัญกับมัน (ในทางทฤษฎีแล้วมันคือสิ่งที่เกิดขึ้น ดังนั้นความสำคัญทั้งหมดจะอยู่ที่ฟีเจอร์ A หรือฟีเจอร์ B (แต่ไม่ใช่ทั้งคู่) คุณจะรู้ว่าคุณสมบัติหนึ่งมีบทบาทสำคัญในการเชื่อมโยงระหว่างการสังเกตและฉลาก ยังขึ้นอยู่กับคุณที่จะค้นหาฟีเจอร์ที่สัมพันธ์กับคุณสมบัติที่ตรวจพบว่ามีความสำคัญหากคุณจำเป็นต้องรู้ทั้งหมด

เพื่อสรุป Xgboost ไม่ได้ใช้คุณสมบัติที่สัมพันธ์กันแบบสุ่มในต้นไม้แต่ละต้นซึ่งโมเดลป่าไม้แบบสุ่มได้รับความทุกข์จากสถานการณ์เช่นนี้

เอกสารอ้างอิง :

Tianqi Chen, Michaël Benesty, Tong He 2018“ทำความเข้าใจกับชุดข้อมูลของคุณกับ Xgboost.” https://cran.r-project.org/web/packages/xgboost/vignettes/discoverYourData.html#numeric-vs-categorical-variables


2

ข้อสังเกตสำหรับคำตอบของ Sandeep: สมมติว่า 2 คุณสมบัติของคุณนั้นมีความละเอียดสูง (พูดได้ 99% ของเวลา) แน่นอนว่ามีเพียง 1 ฟีเจอร์เท่านั้นที่ถูกเลือกในแต่ละการแบ่ง แต่สำหรับการแยกในครั้งถัดไป ดังนั้นการจัดอันดับคุณลักษณะ xgb อาจจัดอันดับคุณสมบัติ 2 colinear เท่า ๆ กัน หากไม่มีความรู้มาก่อนหรือประมวลผลคุณสมบัติอื่น ๆ คุณแทบจะไม่มีวิธีการใด ๆ จากการจัดอันดับที่ระบุไว้นี้เพื่อตรวจจับว่าคุณลักษณะทั้งสองนั้นเป็นแบบ colinear

ตอนนี้สำหรับความสำคัญสัมพัทธ์ที่ส่งออก xgboost มันควรจะคล้ายกันมาก (หรืออาจจะคล้ายกันมาก) กับการไล่ระดับสีที่เพิ่มขึ้นของ sklearn gradient ดูที่นี่สำหรับคำอธิบาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.