Xgboost: [рдЖрд░] рдореЙрдбрд▓ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬреЗ рдЬрд╛рдиреЗ рдкрд░ рд╢реБрд░реБрдЖрддреА рд░реЛрдХ рд╕реЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдЬрдире░ 2020  ┬╖  33рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: dmlc/xgboost

рдЗрди рдорд╛рдиреЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди xgboost::xgb.train рдмрд╛рдж рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
247367.2 258693.3 149572.2 201675.8 250493.9 292349.2 414828.0 296503.2 260851.9 190413.3

рдЗрди рдорд╛рдиреЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рдкрд┐рдЫрд▓реЗ рдореЙрдбрд▓ рдХреЗ xgboost::xgb.save рдФрд░ xgboost::xgb.load рдХреЗ рдмрд╛рдж рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
247508.8 258658.2 149252.1 201692.6 250458.1 292313.4 414787.2 296462.5 260879.0 190430.1

рд╡реЗ рдХрд░реАрдм рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВред рдЗрди рджреЛ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ -1317.094 рд▓реЗрдХрд░ 1088.859 рддрдХ 25k рдирдореВрдиреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдкрд░ рд╣реЛрддрд╛ рд╣реИред рд╕рдЪреНрдЪреЗ рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╕рдордп, рдЗрди рджреЛ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпреЛрдВ рдХреЗ рдПрдордПрдИ/рдЖрд░рдПрдордПрд╕рдИ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓реЛрдб/рд╕реЗрд╡ рдХреЗ рджреМрд░рд╛рди рд░рд╛рдЙрдВрдбрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдордПрдИ/рдЖрд░рдПрдордПрд╕рдИ рдЙрддрдирд╛ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рдлрд┐рд░ рднреА, рдореБрдЭреЗ рдпрд╣ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЙрдбрд▓ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рдЗрдирд░реА рдХреЛ рд░рд╛рдЙрдВрдбрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдХреЛрдИ рд╕реБрд░рд╛рдЧ?

рдкреАрдПрд╕ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рдЙрд╕рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдореИрдВ рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдпрд╛ рдмрд┐рдВрджреБ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрдореА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд░рд╣рд╕реНрдп рд╕реБрд▓рдЭ рдЧрдпрд╛ред рдореИрдВрдиреЗ рд╕рд╣реА рдХрд╛рд░рдг рдХреА рдкрд╣рдЪрд╛рди рдХреАред рдЬрдм рдореЙрдбрд▓ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬрд▓реНрджреА рд░реБрдХрдиреЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЫреЛрдбрд╝ рджреА рдЬрд╛рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, XGBoost 6381 рдмреВрд╕реНрдЯрд┐рдВрдЧ рд░рд╛рдЙрдВрдб рдЪрд▓рд╛рддрд╛ рд╣реИ рдФрд░ 6378 рд░рд╛рдЙрдВрдб рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдореЙрдбрд▓ рдвреВрдВрдврддрд╛ рд╣реИред рдореЗрдореЛрд░реА рдореЗрдВ рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ 6381 рдкреЗрдбрд╝ рд╣реИрдВ, рди рдХрд┐ 6378 рдкреЗрдбрд╝, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдкреЗрдбрд╝ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рд╣реИ best_iteration рдЬреЛ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдерд╛:

> fit$best_iteration
[1] 6378

рдЬрдм рд╣рдо рдореЙрдбрд▓ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рдЪреБрдкрдЪрд╛рдк рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИред рддреЛ рдореВрд▓ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде predict() 6378 рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ predict() рдмрд░рд╛рдордж рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде 6381 рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

> x <- predict(fit, newdata = dtrain2, predleaf = TRUE)
> x2 <- predict(fit.loaded, newdata = dtrain2, predleaf = TRUE)
> dim(x)
[1] 5000 6378
> dim(x2)
[1] 5000 6381

рд╕рднреА 33 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдмрд╛рдЗрдирд░реА рдпрд╛ рдЬреЛрдВрд╕ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЧреЛрд▓ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдЖрдк рдбрд╛рд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдирд╣реАрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реВрдБ:

params <- list(objective = 'reg:squarederror',
               max_depth = 10, eta = 0.02, subsammple = 0.5,
               base_score = median(xgboost::getinfo(xgb.train, 'label'))
)

xgboost::xgb.train(
  params = params, data = xgb.train,
  watchlist = list('train' = xgb.train, 'test' = xgb.test),
  nrounds = 10000, verbose = TRUE, print_every_n = 25,
  eval_metric = 'mae',
  early_stopping_rounds = 3, maximize = FALSE)

рдХреНрдпрд╛ рдЖрдк рд╣рдореЗрдВ рдбрдореА рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИ?

рдпрд╣рд╛рдБ рддреБрдо рдЬрд╛рдУ (рддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджрд╛):

N <- 100000
set.seed(2020)
X <- data.frame('X1' = rnorm(N), 'X2' = runif(N), 'X3' = rpois(N, lambda = 1))
Y <- with(X, X1 + X2 - X3 + X1*X2^2 - ifelse(X1 > 0, 2, X3))

params <- list(objective = 'reg:squarederror',
               max_depth = 5, eta = 0.02, subsammple = 0.5,
               base_score = median(Y)
)

dtrain <- xgboost::xgb.DMatrix(data = data.matrix(X), label = Y)

fit <- xgboost::xgb.train(
  params = params, data = dtrain,
  watchlist = list('train' = dtrain),
  nrounds = 10000, verbose = TRUE, print_every_n = 25,
  eval_metric = 'mae',
  early_stopping_rounds = 3, maximize = FALSE
)

pred <- stats::predict(fit, newdata = dtrain)

xgboost::xgb.save(fit, 'booster.raw')
fit.loaded <- xgboost::xgb.load('booster.raw')

pred.loaded <- stats::predict(fit.loaded, newdata = dtrain)

identical(pred, pred.loaded)
pred[1:10]
pred.loaded[1:10]

sqrt(mean((Y - pred)^2))
sqrt(mean((Y - pred.loaded)^2))

рдореЗрд░реА рдорд╢реАрди рдкрд░, identical(pred, pred.loaded) рдЧрд▓рдд рд╣реИ (рдпрд╛рдиреА рд╕рдЪ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдпрд╣рд╛рдБ рдЕрдВрддрд┐рдо рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:

> identical(pred, pred.loaded)
[1] FALSE
> pred[1:10]
 [1] -4.7971768 -2.5070562 -0.8889422 -4.9199696 -4.4374819 -0.2739395 -0.9825708  0.4579227  1.3667605 -4.3333349
> pred.loaded[1:10]
 [1] -4.7971768 -2.5070562 -0.8889424 -4.9199696 -4.4373770 -0.2739397 -0.9825710  0.4579227  1.3667605 -4.3333349
> 
> sqrt(mean((Y - pred)^2))
[1] 0.02890702
> sqrt(mean((Y - pred.loaded)^2))
[1] 0.02890565

рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпрд╛рдВ рдХрднреА-рдХрднреА рдереЛрдбрд╝реА рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреА рдорд╢реАрди рдкрд░ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдореЗрдВ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ?

R рдФрд░ xgboost рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА:

> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] compiler_3.6.1    magrittr_1.5      Matrix_1.2-17     tools_3.6.1       yaml_2.2.0        xgboost_0.90.0.2  stringi_1.4.3     grid_3.6.1       
 [9] data.table_1.12.4 lattice_0.20-38 

рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐:

> identical(fit$raw, fit.loaded$raw)
[1] TRUE

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдмрд╕ рдПрдХ рдЕрдкрдбреЗрдЯ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЬреЗрд╕рди рдФрд░ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдпрд╛:

xgboost::xgb.save(fit, 'booster.json')
fit.loaded <- xgboost::xgb.load('booster.json')

xgboost::xgb.save(fit.loaded, 'booster-1.json')

booster.json рдФрд░ booster-1.json рд╣реИрд╢ рдорд╛рди (via sha256sum ./booster.json ) рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рдХрд╛рд░рдг рд╡рд┐рд╕рдВрдЧрддрд┐ рд╣реИред

рдмрд┐рдирд╛ рдХрд╛рд░рдг рдЬрд╛рдиреЗ рдорд╛рдорд▓реЗ рдХреЛ рдмрдВрдж рдХреНрдпреЛрдВ рдХрд░реЗрдВ?

@рдЯреНрд░рд┐рд╡рд┐рдпрд▓рдлрд┐рд╕ рдХреНрдпрд╛ рдЖрдкрдХреЛ identical(pred, pred.loaded) рд▓рд┐рдП рд╕рд╣реА рдорд┐рд▓рд╛? рдУрдкреА рдкреВрдЫ рд░рд╣рд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпрд╛рдВ рдХреНрдпреЛрдВ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреАрдВ, рднрд▓реЗ рд╣реА рджреЛ рдореЙрдбрд▓реЛрдВ рдореЗрдВ рд╕рдорд╛рди рдмрд╛рдЗрдирд░реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реЛрдВред

рдореИрдВ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред

рдореБрдЭреЗ рдорд╛рдл рдХрд░реЗрдВред рдореБрдЭреЗ рдЬреЛ рдХрд╛рд░рдг рдорд┐рд▓рд╛ рд╡рд╣ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреИрд╢ рд╣реИред рдореЙрдбрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХреИрд╢реНрдб рд╡реИрд▓реНрдпреВ рдХреЗ рдмрдЬрд╛рдп рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдорд╛рди рд╕рд╣реА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рд╕реЗ рдЖрддреЗ рд╣реИрдВ:

рддреЛ рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рдХрд╛рд░рдг рд╡рд┐рд╕рдВрдЧрддрд┐ рд╣реИред

рддреЛ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреИрд╢ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд╕рд╛рде рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рддрд░реАрдХреЗ рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИ?

@ hcho3 рдирдИ рдЕрдЪрд╛рд░ рдмрдирд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдореБрдЭреЗ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реАред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдВ рдПрдХ рдкреНрд░рдореБрдЦ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рдкреЗрдбрд╝реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдШрдЯрд╛рдХрд░ 1000 рдХрд░ рджреЗрдВ (рдЬреЛ рдЕрднреА рднреА рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ рдФрд░ рдбреЗрдореЛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдХреИрд╢ рдХреЛ рд░рд╛рд╕реНрддреЗ рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рд╕реЗ рдкрд╣рд▓реЗ DMatrix рдХрд╛ рдкреБрди: рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ:

dtrain_2 <- xgboost::xgb.DMatrix(data = data.matrix(X), label = Y)

pred <- stats::predict(fit, newdata = dtrain_2)

рдпрд╣ identical рдкрд░реАрдХреНрд╖рд╛ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛ред рдЕрдиреНрдпрдерд╛ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдзрд┐рдХ рдкреЗрдбрд╝реЛрдВ рдореЗрдВ рд╕рдорд╛рди рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЕрднреА рднреА рдЫреЛрдЯреЗ рдЕрдВрддрд░ рд╣реИрдВ (2000 рдкреЗрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП 1e-7)ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдореЗрдВ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рднреА рдереЛрдбрд╝рд╛ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдЪреВрдВрдХрд┐ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдпреЛрдЧ рд╕рд╣рдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рд╣рдо рдЧрдгрдирд╛ рдХреЗ рдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдордЬрдмреВрдд рдЧрд╛рд░рдВрдЯреА рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЗрдЯрдо рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрдд рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ (рдмрд╣реБрдд рдорджрдж рдорд┐рд▓реЗрдЧреА рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╡рд┐рд╕рдВрдЧрддрд┐ рд╣реЛрдЧреА)ред рд╕реАрдкреАрдпреВ рдПрдлрдкреАрдпреВ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдореЗрдВ рдЙрдЪреНрдЪ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред (рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрдВрдЯрд░рдореАрдбрд┐рдпрд╛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, https://en.wikipedia.org/wiki/Extended_precision)ред рдореЗрд░рд╛ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм 32 рдмрд┐рдЯ рдлреНрд▓реЛрдЯ рдХреЗ рднреАрддрд░ 1000 рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдмрд┐рд▓реНрдХреБрд▓ рдкреБрди: рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдмрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдпреЛрдЧ рд╕рд╣рдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╕реНрд╡рдпрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдКрдВрдЧрд╛ рдФрд░ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЕрдВрддрд░ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реИред

рдЖрдо рддреМрд░ рдкрд░, рдореИрдВ рдЖрдорддреМрд░ рдкрд░ np.testing.assert_almost_equal рд╕рд╛рде decimal=5 рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рджреЛ рдлреНрд▓реЛрдЯ рд╕рд░рдгреА рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред

рд╣рд╛рдБред рд╡рд┐рд╕реНрддреГрдд рдиреЛрдЯреНрд╕ рдХреЗ рдмрд┐рдирд╛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛ред

@ hcho3 рдХреЛрдИ рдЕрдкрдбреЗрдЯ?

рдореИрдВ рдЕрднреА рддрдХ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реВрдВред рдореБрдЭреЗ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреЗ рджреЛред

@рдЯреНрд░рд┐рд╡рд┐рдпрд▓рдлрд┐рд╕ рдореИрдВ рдмрдЧ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рдореИрдВрдиреЗ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдпрд╛ рдФрд░ FALSE рд▓рд┐рдП identical(pred, pred.loaded) ред рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдирдпрд╛ DMatrix dtrain_2 рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдФрд░ рдЕрднреА рднреА рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП FALSE рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ред

@DavorJ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ:

[1] FALSE     # identical(pred, pred.loaded)
 [1] -4.7760534 -2.5083885 -0.8860036 -4.9163256 -4.4455137 -0.2548684
 [7] -0.9745615  0.4646015  1.3602829 -4.3288369     # pred[1:10]
 [1] -4.7760534 -2.5083888 -0.8860038 -4.9163256 -4.4454765 -0.2548686
 [7] -0.9745617  0.4646015  1.3602829 -4.3288369     # pred.loaded[1:10]
[1] 0.02456085   # MSE on pred
[1] 0.02455945   # MSE on pred.loaded

dtrain_2 <- xgboost::xgb.DMatrix(data = data.matrix(X), label = Y) рд╕рд╛рде рд╕рдВрд╢реЛрдзрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ:

[1] FALSE     # identical(pred, pred.loaded)
 [1] -4.7760534 -2.5083885 -0.8860036 -4.9163256 -4.4455137 -0.2548684
 [7] -0.9745615  0.4646015  1.3602829 -4.3288369     # pred[1:10]
 [1] -4.7760534 -2.5083888 -0.8860038 -4.9163256 -4.4454765 -0.2548686
 [7] -0.9745617  0.4646015  1.3602829 -4.3288369     # pred.loaded[1:10]
[1] 0.02456085   # MSE on pred
[1] 0.02455945   # MSE on pred.loaded

рддреЛ рдХреБрдЫ рдФрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред

рдореИрдВрдиреЗ рд░рд╛рдЙрдВрдб-рдЯреНрд░рд┐рдк рдЯреЗрд╕реНрдЯ рдЪрд▓рд╛рдиреЗ рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреА:

xgboost::xgb.save(fit, 'booster.raw')
fit.loaded <- xgboost::xgb.load('booster.raw')
xgboost::xgb.save(fit.loaded, 'booster.raw.roundtrip')

рдФрд░ рджреЛ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓реЗрдВ booster.raw рдФрд░ booster.raw.roundtrip рд╕рдорд╛рди рдереАрдВред

pred рдФрд░ pred.loaded рдмреАрдЪ рдЕрдзрд┐рдХрддрдо рдЕрдВрддрд░ 0.0008370876 рд╣реИред

рдПрдХ рдЫреЛрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рддреЗрдЬреА рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ:

library(xgboost)

N <- 5000
set.seed(2020)
X <- data.frame('X1' = rnorm(N), 'X2' = runif(N), 'X3' = rpois(N, lambda = 1))
Y <- with(X, X1 + X2 - X3 + X1*X2^2 - ifelse(X1 > 0, 2, X3))

params <- list(objective = 'reg:squarederror',
               max_depth = 5, eta = 0.02, subsammple = 0.5,
               base_score = median(Y)
)

dtrain <- xgboost::xgb.DMatrix(data = data.matrix(X), label = Y)

fit <- xgboost::xgb.train(
  params = params, data = dtrain,
  watchlist = list('train' = dtrain),
  nrounds = 10000, verbose = TRUE, print_every_n = 25,
  eval_metric = 'mae',
  early_stopping_rounds = 3, maximize = FALSE
)

pred <- stats::predict(fit, newdata = dtrain)

invisible(xgboost::xgb.save(fit, 'booster.raw'))
fit.loaded <- xgboost::xgb.load('booster.raw')
invisible(xgboost::xgb.save(fit.loaded, 'booster.raw.roundtrip'))

pred.loaded <- stats::predict(fit.loaded, newdata = dtrain)

identical(pred, pred.loaded)
pred[1:10]
pred.loaded[1:10]
max(abs(pred - pred.loaded))

sqrt(mean((Y - pred)^2))
sqrt(mean((Y - pred.loaded)^2))

рдЖрдЙрдЯрдкреБрдЯ:

[1] FALSE
 [1] -2.4875379 -0.9452241 -6.9658904 -2.9985323 -4.2192593 -0.8505422
 [7] -0.3928839 -1.6886091 -1.3611379 -3.1278882
 [1] -2.4875379 -0.9452239 -6.9658904 -2.9985323 -4.2192593 -0.8505420
 [7] -0.3928837 -1.6886090 -1.3611377 -3.1278882
[1] 0.0001592636
[1] 0.01370754
[1] 0.01370706

рдмрд╕ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд╛рдЙрдВрдб-рдЯреНрд░рд┐рдк рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдЕрдм рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпрд╛рдВ рдФрд░ рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИрдВред

library(xgboost)

N <- 5000
set.seed(2020)
X <- data.frame('X1' = rnorm(N), 'X2' = runif(N), 'X3' = rpois(N, lambda = 1))
Y <- with(X, X1 + X2 - X3 + X1*X2^2 - ifelse(X1 > 0, 2, X3))

params <- list(objective = 'reg:squarederror',
               max_depth = 5, eta = 0.02, subsammple = 0.5,
               base_score = median(Y)
)

dtrain <- xgboost::xgb.DMatrix(data = data.matrix(X), label = Y)

fit <- xgboost::xgb.train(
  params = params, data = dtrain,
  watchlist = list('train' = dtrain),
  nrounds = 10000, verbose = TRUE, print_every_n = 25,
  eval_metric = 'mae',
  early_stopping_rounds = 3, maximize = FALSE
)

pred <- stats::predict(fit, newdata = dtrain)

invisible(xgboost::xgb.save(fit, 'booster.raw'))
fit.loaded <- xgboost::xgb.load('booster.raw')
invisible(xgboost::xgb.save(fit.loaded, 'booster.raw.roundtrip'))
fit.loaded2 <- xgboost::xgb.load('booster.raw.roundtrip')

pred.loaded <- stats::predict(fit.loaded, newdata = dtrain)
pred.loaded2 <- stats::predict(fit.loaded2, newdata = dtrain)

identical(pred, pred.loaded)
identical(pred.loaded, pred.loaded2)
pred[1:10]
pred.loaded[1:10]
pred.loaded2[1:10]
max(abs(pred - pred.loaded))
max(abs(pred.loaded - pred.loaded2))

sqrt(mean((Y - pred)^2))
sqrt(mean((Y - pred.loaded)^2))
sqrt(mean((Y - pred.loaded2)^2))

рдирддреАрдЬрд╛:

[1] FALSE
[1] TRUE
 [1] -2.4875379 -0.9452241 -6.9658904 -2.9985323 -4.2192593 -0.8505422
 [7] -0.3928839 -1.6886091 -1.3611379 -3.1278882
 [1] -2.4875379 -0.9452239 -6.9658904 -2.9985323 -4.2192593 -0.8505420
 [7] -0.3928837 -1.6886090 -1.3611377 -3.1278882
 [1] -2.4875379 -0.9452239 -6.9658904 -2.9985323 -4.2192593 -0.8505420
 [7] -0.3928837 -1.6886090 -1.3611377 -3.1278882
[1] 0.0001592636
[1] 0
[1] 0.01370754
[1] 0.01370706
[1] 0.01370706

рддреЛ рд╢рд╛рдпрдж рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреИрд╢ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдореИрдВрдиреЗ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреИрд╢рд┐рдВрдЧ рдЕрдХреНрд╖рдо рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдпрд╛:

diff --git a/src/predictor/cpu_predictor.cc b/src/predictor/cpu_predictor.cc
index ebc15128..c40309bc 100644
--- a/src/predictor/cpu_predictor.cc
+++ b/src/predictor/cpu_predictor.cc
@@ -259,7 +259,7 @@ class CPUPredictor : public Predictor {
     // delta means {size of forest} * {number of newly accumulated layers}
     uint32_t delta = end_version - beg_version;
     CHECK_LE(delta, model.trees.size());
-    predts->Update(delta);
+    //predts->Update(delta);

     CHECK(out_preds->Size() == output_groups * dmat->Info().num_row_ ||
           out_preds->Size() == dmat->Info().num_row_);

(рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдХреИрд╢рд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред)

рдЖрдЙрдЯрдкреБрдЯ:

[1] FALSE
[1] TRUE
 [1] -2.4908853 -0.9507379 -6.9615889 -2.9935317 -4.2165089 -0.8543566
 [7] -0.3940181 -1.6930715 -1.3572118 -3.1403396
 [1] -2.4908853 -0.9507380 -6.9615889 -2.9935317 -4.2165089 -0.8543567
 [7] -0.3940183 -1.6930716 -1.3572119 -3.1403399
 [1] -2.4908853 -0.9507380 -6.9615889 -2.9935317 -4.2165089 -0.8543567
 [7] -0.3940183 -1.6930716 -1.3572119 -3.1403399
[1] 0.0001471043
[1] 0
[1] 0.01284297
[1] 0.01284252
[1] 0.01284252

рддреЛ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреИрд╢ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдмрдЧ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред

рдкрддреНрддрд╛ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпрд╛рдВ рднреА рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИрдВ:

invisible(xgboost::xgb.save(fit, 'booster.raw'))
fit.loaded <- xgboost::xgb.load('booster.raw')
invisible(xgboost::xgb.save(fit.loaded, 'booster.raw.roundtrip'))
fit.loaded2 <- xgboost::xgb.load('booster.raw.roundtrip')

x <- predict(fit, newdata = dtrain2, predleaf = TRUE)
x2 <- predict(fit.loaded, newdata = dtrain2, predleaf = TRUE)
x3 <- predict(fit.loaded2, newdata = dtrain2, predleaf = TRUE)

identical(x, x2)
identical(x2, x3)

рдЖрдЙрдЯрдкреБрдЯ:

[1] FALSE
[1] TRUE

рд░рд╣рд╕реНрдп рд╕реБрд▓рдЭ рдЧрдпрд╛ред рдореИрдВрдиреЗ рд╕рд╣реА рдХрд╛рд░рдг рдХреА рдкрд╣рдЪрд╛рди рдХреАред рдЬрдм рдореЙрдбрд▓ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬрд▓реНрджреА рд░реБрдХрдиреЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЫреЛрдбрд╝ рджреА рдЬрд╛рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, XGBoost 6381 рдмреВрд╕реНрдЯрд┐рдВрдЧ рд░рд╛рдЙрдВрдб рдЪрд▓рд╛рддрд╛ рд╣реИ рдФрд░ 6378 рд░рд╛рдЙрдВрдб рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдореЙрдбрд▓ рдвреВрдВрдврддрд╛ рд╣реИред рдореЗрдореЛрд░реА рдореЗрдВ рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ 6381 рдкреЗрдбрд╝ рд╣реИрдВ, рди рдХрд┐ 6378 рдкреЗрдбрд╝, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдкреЗрдбрд╝ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рд╣реИ best_iteration рдЬреЛ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдерд╛:

> fit$best_iteration
[1] 6378

рдЬрдм рд╣рдо рдореЙрдбрд▓ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рдЪреБрдкрдЪрд╛рдк рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИред рддреЛ рдореВрд▓ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде predict() 6378 рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ predict() рдмрд░рд╛рдордж рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде 6381 рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

> x <- predict(fit, newdata = dtrain2, predleaf = TRUE)
> x2 <- predict(fit.loaded, newdata = dtrain2, predleaf = TRUE)
> dim(x)
[1] 5000 6378
> dim(x2)
[1] 5000 6381

@рдЯреНрд░рд┐рд╡рд┐рдпрд▓рдлрд┐рд╕ рдореИрдВ рдкреЗрдбрд╝реЛрдВ рдХреЛ рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫреБрдХ рд╣реВрдВред рдпрджрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг 6381 рд░рд╛рдЙрдВрдб рдкрд░ рд░реБрдХ рдЧрдпрд╛ рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ 6378 рд░рд╛рдЙрдВрдб рдкрд░ рдерд╛, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЕрдВрддрд┐рдо рдореЙрдбрд▓ рдореЗрдВ 6378 рдкреЗрдбрд╝ рд╣реЛрдВрдЧреЗред

@ hcho3 рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ https://github.com/dmlc/xgboost/issues/4052 рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рд╣реИред

bset_iteration рдХреЛ Learner::attributes_ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ xgboost::xgb.attr рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@ hcho3 , рдЕрдЪреНрдЫрд╛ рдЦреЛрдЬ!

xgboost:::predict.xgb.Booster() рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдВ:

image

рдЕрдЧрд░ рдореИрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭреВрдВ, рддреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ? рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдкреЗрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реА рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ред

@DavorJ рдЬрдм рдЕрд░реНрд▓реА рд╕реНрдЯреЙрдкрд┐рдВрдЧ рд╕рдХреНрд░рд┐рдп рд╣реЛрддреА рд╣реИ, рддреЛ predict() рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП best_iteration рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

рдкрд╛рдпрдерди рдкрдХреНрд╖ рдкрд░ @ рдЯреНрд░рд┐рд╡рд┐рдпрд▓рдлрд┐рд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ xgb.predict() рдЬрд▓реНрджреА рд░реБрдХрдиреЗ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:

import xgboost as xgb
import numpy as np
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split

X, y = load_boston(return_X_y=True)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

params = {'objective': 'reg:squarederror'}

bst = xgb.train(params, dtrain, 100, [(dtrain, 'train'), (dtest, 'test')],
                early_stopping_rounds=5)

x = bst.predict(dtrain, pred_leaf=True)
x2 = bst.predict(dtrain, pred_leaf=True, ntree_limit=bst.best_iteration)
print(x.shape)
print(x2.shape)

pred = bst.predict(dtrain)
pred2 = bst.predict(dtrain, ntree_limit=bst.best_iteration)

print(np.max(np.abs(pred - pred2)))

рдЖрдЙрдЯрдкреБрдЯ:

Will train until test-rmse hasn't improved in 5 rounds.
[1]     train-rmse:12.50316     test-rmse:11.92709
...
[25]    train-rmse:0.56720      test-rmse:2.56874
[26]    train-rmse:0.54151      test-rmse:2.56722
[27]    train-rmse:0.51842      test-rmse:2.56124
[28]    train-rmse:0.47489      test-rmse:2.56640
[29]    train-rmse:0.45489      test-rmse:2.58780
[30]    train-rmse:0.43093      test-rmse:2.59385
[31]    train-rmse:0.41865      test-rmse:2.59364
[32]    train-rmse:0.40823      test-rmse:2.59465
Stopping. Best iteration:
[27]    train-rmse:0.51842      test-rmse:2.56124
(404, 33)
(404, 27)
0.81269073

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд▓рд╛рдиреЗ рдХреА рдпрд╛рдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ bst.best_iteration рдФрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд ntree_limit рдЬрдм рдмреБрд▓рд╛ рддрд░реНрдХ predict() ред рдпрд╣ рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рд╣реИ рдФрд░ рдПрдХ рдЕрдкреНрд░рд┐рдп рдЖрд╢реНрдЪрд░реНрдп рдмрдирд╛рддрд╛ рд╣реИред

рдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

  1. best_iteration рдкрд╣рд▓реЗ рдХреЗ рдкреЗрдбрд╝реЛрдВ рдХреЛ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рджреЗрдВред
  2. рдореЙрдбрд▓ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╕рдордп best_iteration рдЬрд╛рдирдХрд╛рд░реА рдмрдирд╛рдП рд░рдЦреЗрдВ, рдФрд░ predict() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

@ hcho3 рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЖрдзрд╛ рдмреЗрдХ рдХрд┐рдпрд╛ рд╣реБрдЖ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ process_type = update рд╡рд┐рдХрд▓реНрдк, рдФрд░ рд╡рди рд╕реЗ рднреА рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

рдкреГрд╖реНрдарднреВрдорд┐

update рд╕рд╛рде рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореМрдЬреВрдж рдореБрджреНрджреЛрдВ рдХреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкреБрдирд░реНрдХрдерди рдХреЗ рд▓рд┐рдП, рдпрджрд┐ num_boost_round рд╕рд╛рде update рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдкреЗрдбрд╝реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдХрдо рд╣реИ, рддреЛ рд╡реЗ рдкреЗрдбрд╝ рдЬреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ .

рдлрд╝реЙрд░реЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп рдХреЗ рд▓рд┐рдП, best_iteration рдлрд╝реЙрд░реЗрд╕реНрдЯ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ predict рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреЗрдбрд╝реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╛рдпрдерди рдкрд░ best_ntree_limit рдирд╛рдордХ рдХреБрдЫ рд╣реИ , рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ ntree_limit рдХреЛ inplace_predict рдореЗрдВ iteration_range рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ред

рд╡рд┐рдЪрд╛рд░

рдореИрдВ slice рдФрд░ concat рд╡рд┐рдзрд┐ рдХреЛ booster рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдкреЗрдбрд╝реЛрдВ рдХреЛ 2 рдореЙрдбрд▓реЛрдВ рдореЗрдВ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ 2 рдореЙрдбрд▓реЛрдВ рд╕реЗ рдкреЗрдбрд╝реЛрдВ рдХреЛ 1 рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпреЗ 2 рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ :

  • base_margin_ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рд╣рдЬ рд╣реИред
  • рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЗрдВ ntree_limit рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдХреЗрд╡рд▓ рдореЙрдбрд▓ рдХреЛ рд╕реНрд▓рд╛рдЗрд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрд▓рд╛рдЗрд╕ рдкрд░ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдЪрд▓рд╛рддреЗ рд╣реИрдВред
  • update рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдпрдВ рдирд┐рд╣рд┐рдд рд╣реИ, рдмрд╕ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдкреЗрдбрд╝реЛрдВ рдХреЛ рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, num_boost_rounds ред

рдЖрдЧреЗ

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рддрд░рд╣ рдмрд╣реБ рд▓рдХреНрд╖реНрдп рдкреЗрдбрд╝реЛрдВ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИред рдЬреИрд╕реЗ рдХрд┐ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдорд▓реНрдЯреА-рдХреНрд▓рд╛рд╕ рдорд▓реНрдЯреА-рдЯрд╛рд░рдЧреЗрдЯ рдЯреНрд░реА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкреЗрдбрд╝реЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реЛрдВрдЧреЗ, рдЬреИрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП output_groups рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рд▓рдХреНрд╖реНрдп, рдлреЙрд░реЗрд╕реНрдЯ рдФрд░ рд╡реЗрдХреНрдЯрд░ рд▓реАрдл рдХреЗ рд╕рд╛рде рдкреЗрдпрд░ рдХрд░рдирд╛ред ntree_limit рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рд╕рд╛рде рд╣реА #5531.

рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рдЬрд▓реНрджреА рд╣реИ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдерд╛, рдЕрдм рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╣реИрдВ, рд╢рд╛рдпрдж рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓ рд╕рдХрддреА рд╣реИред

1.1 рд╕рдордпрд░реЗрдЦрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдХреНрдпрд╛ рд╣рдо рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЗрдВ рдЗрд╕ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреИрд╕реЗ рд╣реИ?
рдФрд░ рдЗрд╕реЗ рдЬрд╛рд░реА рдиреЛрдЯреЛрдВ рдореЗрдВ рдЬреНрдЮрд╛рдд рдореБрджреНрджреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ?

@ рдЯреНрд░рд┐рд╡рд┐рдпрд▓рдлрд┐рд╕ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддрд╛ рд╣реИ, рдЬрдм рддрдХ рд╣рдо рдРрд╕рд╛ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдФрд░ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@ hcho3 рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдореЙрдбрд▓ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреЗрдбрд╝реЛрдВ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЖрдХрд░реНрд╖рдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЙрдбрд▓ рд▓рдВрдмрд╛рдИ рдФрд░ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдореЙрдбрд▓ рд▓рдВрдмрд╛рдИ рд╣реЛрдиреЗ рд╕реЗ рдХрд┐рд╕реА рднреА рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

trivialfis picture trivialfis  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wenbo5565 picture wenbo5565  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

RanaivosonHerimanitra picture RanaivosonHerimanitra  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ivannz picture ivannz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nnorton24 picture nnorton24  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ