Предположим, у меня есть следующие тренировочные данные
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)
> 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
, из которых нужно повысить?
Правильно ли будет указать base_margin = 2
для моего контрольного наблюдения? то есть
dtest2 <- xgb.DMatrix(as.matrix(test), base_margin = 2)
> predict(mymod2, dtest2)
[1] 1.806137
Это дает мне 2 + (-0.1938634) = 1.806137