Как именно модель xgboost усиливается от инициализированных предсказаний? - PullRequest
8 голосов
/ 16 апреля 2020

Предположим, у меня есть следующие тренировочные данные

train <- structure(list(y = c(0.123126546349629, 5.08341738064507, 0.417169757659117, 
                              11.3672537943004, -2.29483328843934), 
                              V1 = c(1.49320744893171, 1.30159237260313, -1.09176081656066, 0.370655592949594, -0.492654216879005
                              ), V2 = c(0.102550648823008, 1.51622697492906, 0.100275457460287, 
                              2.30810553639935, -0.66650031535771), V3 = c(-0.296783627961752, 
                              0.326261056538812, 0.114550707187058, -0.592954740596188, -0.313673257626249
                                        )), row.names = c(NA, 5L), class = "data.frame")
dtrain <- xgb.DMatrix(as.matrix(train[, -1]), label = train[, "y"])
> train
           y         V1         V2         V3
1  0.1231265  1.4932074  0.1025506 -0.2967836
2  5.0834174  1.3015924  1.5162270  0.3262611
3  0.4171698 -1.0917608  0.1002755  0.1145507
4 11.3672538  0.3706556  2.3081055 -0.5929547
5 -2.2948333 -0.4926542 -0.6665003 -0.3136733

и одно тестовое наблюдение:

test <- structure(list(V1 = 1.8145292639671, V2 = -0.6291386853624, V3 = 0.340185971673589), row.names = 1L, class = "data.frame")
dtest <- xgb.DMatrix(as.matrix(test))
> test
        V1         V2       V3
1 1.814529 -0.6291387 0.340186

Я указываю свои параметры, обратите внимание, что здесь установлено base_score до 0.

params <- list(max_depth = 2, eta = 0.1, subsample = 1,
              objective = "reg:squarederror", base_score = 0)

Полученная модель будет

mymod <- xgb.train(params = params, data = dtrain, nrounds = 1)
xgb.plot.tree(model = mymod)

enter image description here

> predict(mymod, dtest)
[1] -0.1147417

Это имеет смысл для меня, потому что с моим наблюдением test я попадаю на верхний лист, который имеет значение -0.1147.

Теперь я хочу использовать base_margin, чтобы указать набор начальных значений, из которых я хочу повысить , Предположим, я установил эти значения на 2 и снова предсказал test.

dtrain2 <- xgb.DMatrix(as.matrix(train[, -1]), label = train[, "y"], base_margin = rep(2, nrow(train)))
mymod2 <- xgb.train(params = params, data = dtrain2, nrounds = 1)
xgb.plot.tree(model = mymod2)
> predict(mymod2, dtest)
[1] -0.1938634

Теперь дерево отличается из-за спецификации base_margin. Предсказание - это просто конечный результат, -0.1938634, но почему это не 2 + (-0.1938634), потому что я думал, что base_margin задает базовые прогнозы для mymod2, из которых нужно повысить? enter image description here

Правильно ли будет указать base_margin = 2 для моего контрольного наблюдения? то есть

dtest2 <- xgb.DMatrix(as.matrix(test), base_margin = 2)
> predict(mymod2, dtest2)
[1] 1.806137

Это дает мне 2 + (-0.1938634) = 1.806137

...