XGBoost có tự xử lý đa cộng đồng không?


23

Tôi hiện đang sử dụng XGBoost trên bộ dữ liệu với 21 tính năng (được chọn từ danh sách 150 tính năng), sau đó mã hóa một lần để nhận được ~ 98 tính năng. Một vài trong số 98 tính năng này có phần dư thừa, ví dụ: một biến (tính năng) cũng xuất hiện dưới dạng BMộtCBMột .CMột

Câu hỏi của tôi là:

  • Làm thế nào ( Nếu? ) Làm cây quyết định tăng cường xử lý đa cộng đồng?
  • Làm thế nào sự tồn tại của đa cộng đồng sẽ ảnh hưởng đến dự đoán nếu nó không được xử lý?

Theo những gì tôi hiểu, mô hình đang học nhiều hơn một cây và dự đoán cuối cùng dựa trên một cái gì đó giống như "tổng trọng số" của các dự đoán riêng lẻ. Vì vậy, nếu điều này là chính xác, thì Cây quyết định tăng cường sẽ có thể xử lý sự phụ thuộc giữa các biến.

Ngoài ra, trên một lưu ý liên quan - làm thế nào để đối tượng quan trọng thay đổi trong XGBoost hoạt động?


Tôi hiểu rằng cây có thể xử lý đa cộng đồng. Nhưng những gì về XGBoost dựa trên hồi quy? Nó có thể xử lý đa cộng đồng là tốt? > Cây quyết định về bản chất là miễn dịch với đa cộng tuyến. Ví dụ: nếu bạn có 2 tính năng tương quan 99%, khi> quyết định chia tách, cây sẽ chỉ chọn một trong số chúng. Các mô hình khác như hồi quy Logistic sẽ sử dụng cả hai tính năng. >> Vì các cây được tăng cường sử dụng các cây quyết định riêng lẻ, chúng cũng> không bị ảnh hưởng bởi đa cộng tuyến. Tuy nhiên, cách tốt nhất là loại bỏ mọi tính năng dư thừa khỏi mọi dữ liệu được sử dụng cho tra
Jay Saxena

Câu trả lời:


27

Cây quyết định về bản chất là miễn dịch với đa cộng tuyến. Ví dụ: nếu bạn có 2 tính năng tương quan 99%, khi quyết định chia tách, cây sẽ chỉ chọn một trong số chúng. Các mô hình khác như hồi quy Logistic sẽ sử dụng cả hai tính năng.

Vì các cây được tăng cường sử dụng các cây quyết định riêng lẻ, chúng cũng không bị ảnh hưởng bởi đa cộng tuyến. Tuy nhiên, cách tốt nhất là loại bỏ mọi tính năng dư thừa khỏi mọi tập dữ liệu được sử dụng cho đào tạo, bất kể thuật toán của mô hình. Trong trường hợp của bạn kể từ khi bạn nhận được các tính năng mới, bạn có thể sử dụng phương pháp này, đánh giá tầm quan trọng của từng tính năng và chỉ giữ lại các tính năng tốt nhất cho mô hình cuối cùng của bạn.

Ma trận quan trọng của mô hình xgboost thực sự là một đối tượng data.table với cột đầu tiên liệt kê tên của tất cả các tính năng thực sự được sử dụng trong các cây được tăng cường. Cột thứ hai là số liệu Gain bao hàm sự đóng góp tương đối của tính năng tương ứng cho mô hình được tính bằng cách lấy từng đóng góp của từng tính năng cho từng cây trong mô hình. Giá trị cao hơn của số liệu này khi so sánh với tính năng khác ngụ ý nó quan trọng hơn để tạo dự đoán.


7

Tôi tò mò về điều này và thực hiện một vài thử nghiệm.

Tôi đã đào tạo một mô hình về bộ dữ liệu kim cương và nhận thấy rằng biến xx là biến quan trọng nhất để dự đoán liệu giá của một viên kim cương có cao hơn một ngưỡng nhất định hay không. Sau đó, tôi đã thêm nhiều cột có tương quan cao với x, chạy cùng một mô hình và quan sát các giá trị giống nhau.

Có vẻ như khi tương quan giữa hai cột là 1, xgboost sẽ loại bỏ cột phụ trước khi tính toán mô hình, do đó tầm quan trọng không bị ảnh hưởng. Tuy nhiên, khi bạn thêm một cột có tương quan một phần với cột khác, do đó với hệ số thấp hơn, tầm quan trọng của biến ban đầu x bị giảm xuống.

Ví dụ: nếu tôi thêm một biến xy = x + y, tầm quan trọng của cả x và y sẽ giảm. Tương tự, tầm quan trọng của x giảm nếu tôi thêm các biến mới với r = 0,4, 0,5 hoặc 0,6, mặc dù chỉ một chút.

Tôi nghĩ rằng cộng tuyến không phải là vấn đề để tăng khi bạn tính toán độ chính xác của mô hình, bởi vì cây quyết định không quan tâm đến một trong các biến được sử dụng. Tuy nhiên, nó có thể ảnh hưởng đến tầm quan trọng của các biến, bởi vì việc loại bỏ một trong hai biến tương quan không ảnh hưởng lớn đến độ chính xác của mô hình, do cái kia chứa thông tin tương tự.

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

Đánh giá một mô hình trên dữ liệu kim cương

Chúng tôi dự đoán liệu giá có cao hơn 400 hay không, với tất cả các biến số có sẵn (carat, độ sâu, bảng, x, y, x)

Lưu ý rằng x là biến quan trọng nhất, với điểm tăng quan trọng là 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

Mô hình được đào tạo về Kim cương, thêm một biến có r = 1 đến x

Ở đây chúng tôi thêm một cột mới, tuy nhiên không thêm bất kỳ thông tin mới nào, vì nó hoàn toàn tương quan với x.

Lưu ý rằng biến mới này không có trong đầu ra. Có vẻ như xgboost tự động loại bỏ các biến tương quan hoàn hảo trước khi bắt đầu tính toán. Mức tăng tầm quan trọng của x là như nhau, 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

Mô hình được đào tạo về Kim cương, thêm một cột cho x + y

Chúng tôi thêm một cột mới xy = x + y. Điều này là một phần tương quan với cả x và y.

Lưu ý rằng tầm quan trọng của x và y giảm đi một chút, đi từ 0,3759 đến 0,3952 cho x và từ 0,16 đến 0,079 cho 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

Mô hình được đào tạo về dữ liệu Kim cương, sửa đổi thêm các cột dự phòng

Chúng tôi thêm ba cột mới tương quan với x (r = 0,4, 0,5 và 0,6) và xem điều gì sẽ xảy ra.

Lưu ý rằng tầm quan trọng của x bị giảm, giảm từ 0,3759 xuống 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

Có một câu trả lời từ Tianqi Chen (2018).

Sự khác biệt này có tác động đến một trường hợp góc trong phân tích tầm quan trọng của tính năng: các tính năng tương quan. Tưởng tượng hai tính năng tương quan hoàn hảo, tính năng A và tính năng B. Đối với một cây cụ thể, nếu thuật toán cần một trong số chúng, nó sẽ chọn ngẫu nhiên (đúng trong cả tăng tốc và Rừng ngẫu nhiên ™).

Tuy nhiên, trong Random Forests ™, lựa chọn ngẫu nhiên này sẽ được thực hiện cho từng cây, vì mỗi cây độc lập với các cây khác. Do đó, gần đúng, tùy thuộc vào tham số của bạn, 50% số cây sẽ chọn tính năng A và 50% còn lại sẽ chọn tính năng B. Vì vậy, tầm quan trọng của thông tin có trong A và B (giống nhau, vì chúng tương quan hoàn hảo ) được pha loãng trong A và B. Vì vậy, bạn sẽ không dễ dàng biết thông tin này rất quan trọng để dự đoán những gì bạn muốn dự đoán! Thậm chí còn tệ hơn khi bạn có 10 tính năng tương quan

Để tăng cường, khi thuật toán đã liên kết cụ thể giữa tính năng và kết quả, nó sẽ cố gắng không tập trung vào nó (về lý thuyết nó là những gì xảy ra, thực tế không phải lúc nào cũng đơn giản). Do đó, tất cả tầm quan trọng sẽ thuộc về tính năng A hoặc tính năng B (nhưng không phải cả hai). Bạn sẽ biết rằng một tính năng có vai trò quan trọng trong liên kết giữa các quan sát và nhãn. Bạn vẫn có thể tìm kiếm các tính năng tương quan với tính năng được phát hiện là quan trọng nếu bạn cần biết tất cả các tính năng đó.

Tóm lại, Xgboost không sử dụng ngẫu nhiên các tính năng tương quan trong mỗi cây, mà mô hình rừng ngẫu nhiên phải chịu một tình huống như vậy.

Tham khảo :

Tianqi Chen, Michaël Benesty, Tong He. 2018. V Hiểu về bộ dữ liệu của bạn với Xgboost., Cv https://cran.r-project.org/web/packages/xgboost/vignettes/discoverYourData.html#numeric-vs-c sortical-biến .


2

Một nhận xét về câu trả lời của Sandeep: Giả sử 2 tính năng của bạn có tính phổ biến cao (giả sử bằng 99% thời gian) Thực sự chỉ có 1 tính năng được chọn ở mỗi lần phân tách, nhưng đối với lần phân chia tiếp theo, xgb có thể chọn tính năng khác. Do đó, xếp hạng tính năng xgb có thể sẽ xếp hạng 2 tính năng colinear như nhau. Không có một số kiến ​​thức trước hoặc xử lý tính năng khác, bạn gần như không có phương tiện nào từ bảng xếp hạng được cung cấp này để phát hiện ra rằng 2 tính năng này là colinear.

Bây giờ, đối với tầm quan trọng tương đối tạo ra xgboost, nó sẽ rất giống (hoặc có thể chính xác tương tự) với xếp hạng cây tăng cường độ dốc sklearn. Xem ở đây để giải thích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.