๋ค์ ๊ฐ์ 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
๊ทธ๋ค์ ๊ฐ๊น์ง๋ง ๋์ผํ์ง๋ ์์ต๋๋ค. ์ด ๋ ์์ธก์ ์ฐจ์ด๋ 25,000๊ฐ ์ํ ์ธํธ์์ -1317.094
์์ 1088.859
์
๋๋ค. ์ค์ ๋ ์ด๋ธ๊ณผ ๋น๊ตํ ๋ ์ด ๋ ์์ธก์ MAE/RMSE๋ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค.
๋ฐ๋ผ์ MAE/RMSE๊ฐ ํฌ๊ฒ ๋ค๋ฅด์ง ์๊ธฐ ๋๋ฌธ์ ๋ก๋/์ ์ฅ ์ค ๋ฐ์ฌ๋ฆผ ์ค๋ฅ์ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋๋ ๋ชจ๋ธ์ ์ ์ฅํ๋ ๋ฐ์ด๋๋ฆฌ๊ฐ ๋ฐ์ฌ๋ฆผ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค์ง ์์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ด์ํ๋ค๊ณ ์๊ฐํฉ๋๊น?
๋๊ตฐ๊ฐ ๋จ์?
PS ์ฌ๊ธฐ์์๋ ๊ต์ก ๊ณผ์ ์ ์ ๋ก๋ํ๊ณ ๋ฌธ์ํํ๋ ๊ฒ์ด ์ค์ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ฑฐ๋ ์์ ์ ์ฆ๋ช ํ๊ธฐ ์ํด ๋๋ฏธ ๋ฐ์ดํฐ๋ก ์๋ฎฌ๋ ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
๋ฐ์ด๋๋ฆฌ ๋๋ json ๋ชจ๋์ ๋ํด ๋ฐ์ฌ๋ฆผ ์ค๋ฅ๊ฐ ์์ด์ผ ํฉ๋๋ค. ๋คํธ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
์๋ ๋๋ ์๋:
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)
์ด ํ์์ด ๋ฐ์ํ๋ ๋๋ฏธ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น?
์ฌ๊ธฐ ์์ต๋๋ค(Quick & Dirty):
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)
๋ FALSE์
๋๋ค(์ฆ, TRUE์ฌ์ผ ํจ). ๋ค์์ ๋ง์ง๋ง ๋ช
๋ น์ ์ถ๋ ฅ์
๋๋ค.
> 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
์คํฌ๋ฆฝํธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๋ฅ ์ ๋ฐ์ดํธ, ๋๋ ๋ค์์ ์ฌ์ฉํ์ฌ json๊ณผ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ์ ์ฅํ์ฌ ์คํํ์ต๋๋ค.
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
)์ ์ ํํ ๋์ผํ๋ฏ๋ก ๋ถ๋ ์์์ ์ฐ์ฐ์ผ๋ก ์ธํด ์ด๋๊ฐ์ ๋ถ์ผ์น๊ฐ ์๋ ๊ฒ์ผ๋ก ์ถ์ธก๋ฉ๋๋ค.
์์ธ์ ๋ชจ๋ฅธ ์ฑ ์ด์๋ฅผ ์ข ๋ฃํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@trivialfis identical(pred, pred.loaded)
๋ํด True๋ฅผ ์ป์ ์ต๋๊น? OP๋ ๋ ๋ชจ๋ธ์ด ๋์ผํ ์ด์ง ์๋ช
์ ๊ฐ์ง๊ณ ์์์๋ ๋ถ๊ตฌํ๊ณ ์์ธก์ด ์ผ์นํ์ง ์๋ ์ด์ ๋ฅผ ๋ฌป์ต๋๋ค.
์ง์ ์ฌํํด ๋ณด๊ฒ ์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ๋ด๊ฐ ์ฐพ์ ์์ธ์ ์์ธก ์บ์์ ๋๋ค. ๋ชจ๋ธ์ ๋ก๋ํ ํ ์์ธก ๊ฐ์ ์บ์๋ ๊ฐ ๋์ ์ค์ ์์ธก์์ ๊ฐ์ ธ์ต๋๋ค.
๊ทธ๋์ ๋ด ์ถ์ธก์ ๋ถ๋ ์์์ ์ฐ์ ๋ก ์ธํ ๋ถ์ผ์น๊ฐ ์ด๋๊ฐ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์์ธก ์บ์๋ ํ๊ดด์ ์ธ ๋ฐฉ์์ผ๋ก ๋ถ๋ ์์์ ์ฐ์ ๊ณผ ์ํธ ์์ฉํฉ๋๊น?
@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). ํ์ง๋ง ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์๋ ๋นํธ ๋จ์๋ก ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํด์ผ ํฉ๋๊น?
๋ถ๋ ์์์ ํฉ๊ณ๋ ์ฐ๊ด๋์ง ์์ผ๋ฏ๋ก ์ํ๋ ๊ฒฝ์ฐ ๊ณ์ฐ ์์๋ฅผ ๊ฐ๋ ฅํ๊ฒ ๋ณด์ฅํ๊ธฐ ์ํด ํ ์ผ ํญ๋ชฉ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
์ค์ ๋ก ์ฃผ๋ฌธ์ ๊ฐ๋ ฅํ๊ฒ ๋ณด์ฅํ๋ ๊ฒ์ ํจ๊ณผ๊ฐ ์์ ๊ฒ์ ๋๋ค(๋ง์ ๋์์ด ๋ ๊ฒ์ด์ง๋ง ์ฌ์ ํ ๋ถ์ผ์น๊ฐ ์์ ๊ฒ์ ๋๋ค). CPU FPU ๋ ์ง์คํฐ์ ๋ถ๋ ์์์ ์ ๋ ๋์ ์ ๋ฐ๋๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ค์ ์ ์ฅ๋ ์ ์์ต๋๋ค. (ํ๋์จ์ด ๊ตฌํ์ ์ค๊ฐ ๊ฐ์ ๋ ๋์ ์ ๋ฐ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. https://en.wikipedia.org/wiki/Extended_precision). ๋ด ์์ ์ 1000๊ฐ์ ํธ๋ฆฌ์ ๋ํ ๊ฒฐ๊ณผ๊ฐ 32๋นํธ ๋ถ๋ ์์์ ๋ด์์ ์ ํํ ์ฌํ๋ ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฒ๊ทธ๊ฐ ์๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ถ๋ ์์์ ํฉ๊ณ๊ฐ ์ฐ๊ด๋์ง ์๋๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ ์คํํ๊ณ ๊ทธ ์ฐจ์ด๊ฐ ๋ถ๋ ์์์ ์ฐ์ ์ ๊ธฐ์ธํ ๋งํผ ์ถฉ๋ถํ ์์์ง ํ์ธํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ ๊ฐ์ float ๋ฐฐ์ด์ด ์๋ก ๊ฑฐ์ ๊ฐ์์ง ํ
์คํธํ๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก np.testing.assert_almost_equal
๋ฅผ decimal=5
์ ํจ๊ป ์ฌ์ฉํฉ๋๋ค.
์. ์์ธํ ์ค๋ช ์์ด ์ข ๋ฃ๋ ์ ์ฌ๊ณผ๋๋ฆฝ๋๋ค.
@hcho3 ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
์์ง ํด๊ฒฐํ์ง ๋ชปํ์ต๋๋ค. ์ด๋ฒ ์ฃผ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
@trivialfis ๋ฒ๊ทธ๋ฅผ ์ฌํํ ์ ์์์ต๋๋ค. ์ ๊ณต๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ณ FALSE
๋ํด identical(pred, pred.loaded)
FALSE
๋ฅผ) ๋ฐ์์ต๋๋ค. ๋๋ ๋น์ ์ด ์ ์ํ๋๋ก ์๋ก์ด 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๊ฐ์ ๋ผ์ด๋์์ ์ต์์ ๋ชจ๋ธ์ ์ฐพ์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ์ ๋ชจ๋ธ ๊ฐ์ฒด์๋ ์ ๊ฑฐ๋ ํธ๋ฆฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ 6378๊ฐ์ ํธ๋ฆฌ๊ฐ ์๋๋ผ 6381๊ฐ์ ํธ๋ฆฌ๊ฐ ์์ต๋๋ค. ์ด๋ค ๋ฐ๋ณต์ด ๊ฐ์ฅ ์ข์๋์ง ๊ธฐ์ตํ๋ ์ถ๊ฐ ํ๋ best_iteration
๊ฐ ์์ต๋๋ค.
> fit$best_iteration
[1] 6378
์ด ์ถ๊ฐ ํ๋๋ ๋ชจ๋ธ์ ๋์คํฌ์ ์ ์ฅํ ๋ ์๋์ผ๋ก ์ญ์ ๋ฉ๋๋ค. ๊ทธ๋์ predict()
์๋ ๋ชจ๋ธ์ ๋ฐ๋ฉด, 6378 ๊ทธ๋ฃจ์ ๋๋ฌด๋ฅผ ์ฌ์ฉํ์ฌ predict()
(๊ฐ) ๋ชจ๋ธ์ด 6,381 ๊ทธ๋ฃจ์ ๋๋ฌด๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต๊ตฌ์ ํจ๊ป.
> 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
@trivialfis ๋๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋๋ฌด๋ฅผ ์ ๊ฑฐํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ํ๋ จ์ด 6381 ๋ผ์ด๋์์ ์ค์ง๋๊ณ ์ต์์ ๋ฐ๋ณต์ด 6378 ๋ผ์ด๋์์ ์ค๋จ๋ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ์ต์ข ๋ชจ๋ธ์ 6378 ํธ๋ฆฌ๊ฐ ์์ ๊ฒ์ผ๋ก ์์ํ ๊ฒ์ ๋๋ค.
@ hcho3 https://github.com/dmlc/xgboost/issues/4052 ์์ ๋น์ทํ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
bset_iteration
๋ xgboost::xgb.attr
ํตํด ์ก์ธ์คํ ์ ์๋ Learner::attributes_
์ ์ฅํด์ผ ํฉ๋๋ค.
@hcho3 , ์ข์ ๋ฐ๊ฒฌ!
xgboost:::predict.xgb.Booster()
๋ฌธ์๋ ์ฐธ๊ณ ํ์ญ์์ค.
๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ๋ฌธ์๊ฐ ์์ ํ ์ ํํ์ง ์์ต๋๊น? ๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ธก์ด ์ด๋ฏธ ๋ชจ๋ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์์ํ์ต๋๋ค. ๋ถํํ๋ ๋๋ ์ด๊ฒ์ ํ์ธํ์ง ๋ชปํ์ต๋๋ค.
@DavorJ ์กฐ๊ธฐ ์ ์ง๊ฐ ํ์ฑํ๋๋ฉด predict()
๋ best_iteration
ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ธก์ ์ป์ต๋๋ค.
@trivialfis ์ํฉ์ Python ์ธก์์ ๋ ๋์ฉ๋๋ค. 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
์ฌ์ฉ์๋ predict()
ํธ์ถํ ๋ bst.best_iteration
๋ฅผ ๊ฐ์ ธ์ ntree_limit
์ธ์๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ๊ณ ๋ถ์พํ ๋๋ผ์์ ์ค๋๋ค.
์์ ์ ์ํ ๋ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค.
best_iteration
์ง๋ ๋๋ฌด๋ฅผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ญ์ ํฉ๋๋ค.best_iteration
์ ๋ณด๋ฅผ ์ ์งํ๊ณ predict()
ํจ์์์ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค.@hcho3 process_type = update
์ต์
๋ฐ ํฌ๋ฆฌ์คํธ์ ๊ด๋ จํ์ฌ ์ด์ ๋ํด ๋ฐ์ฏค ๊ตฌ์ด ์์ด๋์ด๊ฐ ์์ต๋๋ค.
๋ฌธ์ ์ ์งง์ ์์ ์ ๋ํ์ด ์ํด ์ฐ๋ฆฌ์ ํจ๊ป์ด update
๊ฒฝ์ฐ, num_boost_round
์ฌ์ฉ update
์ด๋ฏธ ์กด์ฌํ๋ ๋๋ฌด์ ์๋ณด๋ค ์ ์์ด๋ค, ์
๋ฐ์ดํธ๋์ง ์์ต๋๋ค ๊ทธ ๋๋ฌด๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค .
ํฌ๋ฆฌ์คํธ ๊ด๋ จ ๋ฌธ์ ์ ๋ํ ๊ฐ๋ตํ ์๊ฐ๋ฅผ ์ํด predict
ํจ์๋ ๋ฐ๋ณต ๋์ ํน์ ์์ ํธ๋ฆฌ๊ฐ ํ์ํ๋ฏ๋ก best_iteration
๋ ํฌ๋ฆฌ์คํธ์ ์ ์ฉ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ Python์๋ best_ntree_limit
๋ผ๋ ๊ฒ์ด ์์ต๋๋ค. , ๊ทธ๊ฒ์ ๋์๊ฒ ๋งค์ฐ ํผ๋ ์ค๋ฝ์ต๋๋ค. ๋๋ ๋ช
์ ์ ์ผ๋ก ๋์ฒด ntree_limit
์ inplace_predict
์ iteration_range
์ด ์์ฑ์ ํผํ๊ธฐ ์ํด.
slice
๋ฐ concat
๋ฉ์๋๋ฅผ booster
์ ์ถ๊ฐํ๊ณ ์ถ์ต๋๋ค. ์ด ๋ฉ์๋๋ ๋๋ฌด๋ฅผ 2๊ฐ์ ๋ชจ๋ธ๋ก ์ถ์ถํ๊ณ 2๊ฐ์ ๋ชจ๋ธ์์ 1๊ฐ์ ๋๋ฌด๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค. ์ด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด :
base_margin_
๋ ๋ ์ด์ ํ์ํ์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ๋ ์ง๊ด์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.ntree_limit
๋ ๋ ์ด์ ํ์ํ์ง ์์ต๋๋ค. ๋ชจ๋ธ์ ์ฌ๋ผ์ด์คํ๊ณ ์ฌ๋ผ์ด์ค์์ ์์ธก์ ์คํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.update
ํ๋ก์ธ์ค๋ ๋
๋ฆฝ์ ์ด๋ฉฐ num_boost_rounds
์์ด ํ ๋ฒ์ ์กฐ๊ฐ์ผ๋ก ํธ๋ฆฌ๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.๋ํ ์ด๊ฒ์ด ์ด๋ป๊ฒ ๋ ๋ค์ค ๋์ ๋๋ฌด์ ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฏธ๋์ ๋ค์ค ํด๋์ค ๋ค์ค ๋์ ํธ๋ฆฌ๋ฅผ ์ง์ํ ์ ์๋ ๊ฒ์ฒ๋ผ ๊ฐ ํด๋์ค ๋๋ ๊ฐ ๋์์ ๋ํด output_groups
๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ ๋ฐ ๋ฒกํฐ ์๊ณผ ์์ ์ด๋ฃจ๋ ๋ฑ ํธ๋ฆฌ๋ฅผ ์ ๋ ฌํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ์
๋๋ค. ntree_limit
๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
๋ํ #5531 .
๊ทธ๋ฌ๋ ์์ด๋์ด๋ ๋งค์ฐ ์ด๊ธฐ์ ์์ด์ ๊ณต์ ํ ์์ ์ด ์์์ต๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ ์ด ๋ฌธ์ ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ์๋ง๋ ์ด์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ ๊ฒ์ ๋๋ค.
1.1 ํ์๋ผ์ธ์ด ์ฃผ์ด์ง๋ฉด ์ฌ์ฉ์๊ฐ ์์ธก์์ ์ด ์ต์์ ๋ฐ๋ณต์ ์๋์ผ๋ก ์บก์ฒํ๊ณ ์ฌ์ฉํด์ผ ํ๋ ๋ฐฉ๋ฒ์ ๋ช
ํํ ํ๊ธฐ ์ํด ๋ฌธ์๋ฅผ ํ์ฅํ ์ ์์ต๋๊น?
๋ฆด๋ฆฌ์ค ์ ๋ณด์ ์๋ ค์ง ๋ฌธ์ ์ ์ถ๊ฐํ์๊ฒ ์ต๋๊น?
@trivialfis ๋ ์ด๋ ๊ฒ ํ์ฌ ๊ตฌ์ฑ ๋ฌธ์ ๋ฅผ ๋ ์ด์ ๋ณต์กํ๊ฒ ๋ง๋ค์ง ์๋ ํ ํฅ๋ฏธ๋กญ๊ฒ ๋ค๋ฆฝ๋๋ค.
@hcho3 ์ด ์ ์ํ ๋๋ก ๋ชจ๋ธ์์ ์ถ๊ฐ ํธ๋ฆฌ๋ฅผ ์ญ์ ํ๋ ๊ฒ์ ์ค์ ๋ชจ๋ธ ๊ธธ์ด์ ์ด๋ก ์ ์ธ ๋ชจ๋ธ ๊ธธ์ด๋ฅผ ๋์์ ๊ฐ์ง ๋ ๋ถ์ผ์น๋ฅผ ์ฒ๋ฆฌํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋งค๋ ฅ์ ์ ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์์๊ป๋ผ๊ฐ ํ๋ ธ์ต๋๋ค. ์ง์ง ์์ธ์ ์์๋์ต๋๋ค. ๋ชจ๋ธ์ด ๋์คํฌ์ ์ ์ฅ๋๋ฉด ์กฐ๊ธฐ ์ค์ง์ ๋ํ ์ ๋ณด๊ฐ ์ญ์ ๋ฉ๋๋ค. ์์ ์์ XGBoost๋ 6381๊ฐ์ ๋ถ์คํ ๋ผ์ด๋๋ฅผ ์คํํ๊ณ 6378๊ฐ์ ๋ผ์ด๋์์ ์ต์์ ๋ชจ๋ธ์ ์ฐพ์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ์ ๋ชจ๋ธ ๊ฐ์ฒด์๋ ์ ๊ฑฐ๋ ํธ๋ฆฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ 6378๊ฐ์ ํธ๋ฆฌ๊ฐ ์๋๋ผ 6381๊ฐ์ ํธ๋ฆฌ๊ฐ ์์ต๋๋ค. ์ด๋ค ๋ฐ๋ณต์ด ๊ฐ์ฅ ์ข์๋์ง ๊ธฐ์ตํ๋ ์ถ๊ฐ ํ๋
best_iteration
๊ฐ ์์ต๋๋ค.์ด ์ถ๊ฐ ํ๋๋ ๋ชจ๋ธ์ ๋์คํฌ์ ์ ์ฅํ ๋ ์๋์ผ๋ก ์ญ์ ๋ฉ๋๋ค. ๊ทธ๋์
predict()
์๋ ๋ชจ๋ธ์ ๋ฐ๋ฉด, 6378 ๊ทธ๋ฃจ์ ๋๋ฌด๋ฅผ ์ฌ์ฉํ์ฌpredict()
(๊ฐ) ๋ชจ๋ธ์ด 6,381 ๊ทธ๋ฃจ์ ๋๋ฌด๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต๊ตฌ์ ํจ๊ป.