๐ ์ด๋ฒ ํฌ์คํ ์์๋ Boosting ๊ณ์ด์ ์๊ณ ๋ฆฌ์ฆ ์ค์์ GBM(Gradient Boosting Machines) ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ฐํ์ฌ ๋ง๋ค์ด์ง CatBoost ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
CatBoost๋ 2017๋ ๋ ผ๋ฌธ์์ ์๊ฐ๋์์ผ๋ฉฐ ํ์ฌ๊น์ง ํ์ ์์๋ ํ๋ฐํ๊ฒ ์ฌ์ฉ๋๊ณ ์๋ค๊ณ ํฉ๋๋ค. CatBoost์ ๋ํ ๊ฐ๋ ๋ค์ ์ดํด๋ด ์๋ค.
GBM์ ์น๋ช ์ ์ธ ๋ฌธ์ ์ ์ค ํ๋๋ก ๊ณผ์ ํฉ ๋ฌธ์ ๊ฐ ์กด์ฌํฉ๋๋ค. ์ด ๊ณผ์ ํฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด์ ๋์์ ๊ธฐ์กด GBM๊ณ์ด์ ์๊ณ ๋ฆฌ์ฆ์ธ XGBoost, LightGBM ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ํ์ต ์๋๋ฅผ ๊ฐ์ ํ๋ ์ฅ์ ์ ์์ธ์ ๊ฐ๋ฐ๋์์ต๋๋ค.
๋ฒ์ฃผํ ๋ณ์์ ์์ธก๋ชจ๋ธ์ ์ต์ ํ๋ ๋ชจ๋ธ์ ๋๋ค.
๊ธฐ์กด์ ๊ทธ๋๋์ธํธ ๋ถ์คํ ์๊ณ ๋ฆฌ์ฆ์ ์กฐ์ํ์ฌ ํ๊ฒ ๋์(target leakage)๋ฅผ ๊ฐ์ ํฉ๋๋ค.
XGBoost, LightGBM์ด Hyper-parameter์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ๋ฌ๋ผ์ง๋ ๋ฏผ๊ฐํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์๋ ์ด์ ์ ๋ง์ถ์์ต๋๋ค.
CatBoost๋ ๊ธฐ์กด์ ๋ถ์คํ ๊ณผ์ ๊ณผ ์ ์ฒด์ ์ธ ์์์ ๋น์ทํ๋, ์กฐ๊ธ ๋ค๋ฆ ๋๋ค.
๊ธฐ์กด์ ๋ถ์คํ ๋ชจ๋ธ์ด ์ผ๊ด์ ์ผ๋ก ๋ชจ๋ ํ๋ จ ๋ฐ์ดํฐ๋ฅผ ๋์์ผ๋ก ์์ฐจ๊ณ์ฐ์ ํ๋ค๋ฉด, CatBoost๋ ์ผ๋ถ ๋ฐ์ดํฐ๋ง์ ๊ฐ์ง๊ณ ์์ฐจ๊ณ์ฐ์ ํ ๋ค, ๋ชจ๋ธ์ ๋ง๋ค์ด ๋๋จธ์ง ๋ฐ์ดํฐ์ ์์ฐจ๋ ์ด ๋ชจ๋ธ๋ก ์์ธกํ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
๋ฐ์ดํฐ ์ธํธ์ 10๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๊ณ ์๋์ ๊ฐ์ด ์๊ฐ ์์๊ฐ ์ง์ ๋์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
๋ฐ์ดํฐ์ ์๊ฐ์ด ์์ผ๋ฉด CatBoost๋ ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ์ ๋ํด ์ธ๊ณต ์๊ฐ์ ๋ฌด์์๋ก ์์ฑํฉ๋๋ค.
1. ๋จผ์ x1์ ์์ฐจ๋ง ๊ณ์ฐํ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ธ์ ์์ฑํฉ๋๋ค. ์ด ํ, x2์ ์์ฐจ๋ฅผ ์ด ๋ชจ๋ธ๋ก ์์ธกํฉ๋๋ค.
2. x1, x2์ ์์ฐจ๋ฅผ ๊ฐ์ง๊ณ ๋ชจ๋ธ์ ๋ง๋ญ๋๋ค. ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก x3, x4์ ์์ฐจ๋ฅผ ๋ชจ๋ธ๋ก ์์ธกํฉ๋๋ค.
3. x1, x2, x3, x4๋ฅผ ๊ฐ์ง๊ณ ๋ชจ๋ธ์ ๋ง๋ญ๋๋ค. ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก, x5, x6, x7, x8์ ์์ฐจ๋ฅผ ๋ชจ๋ธ๋ก ์์ธกํฉ๋๋ค.
4. ์ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
Ordered Boosting์ ํ ๋, ๋ฐ์ดํฐ ์์๋ฅผ ์์ด์ฃผ์ง ์์ผ๋ฉด ๋งค ๋ฒ ๊ฐ์ ์์๋๋ก ์์ฐจ๋ฅผ ์์ธกํ๋ ๋ชจ๋ธ์ ๋ง๋ค ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์ด ์์๋ ์ฌ์ค ์์๋ก ์ ํ ๊ฒ์์ผ๋ก ์์ ์ญ์ ๋งค ๋ฒ ์์ด์ค์ผ ํฉ๋๋ค.
CatBoost๋ ์ด๋ฌํ ๊ฒ ์ญ์ ๊ฐ์ํด์ ๋ฐ์ดํฐ๋ฅผ ์ ํ๋งํ์ฌ ๋ฝ์๋ ๋๋ค. ๋ฝ์๋ผ ๋๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฝ๋๊ฒ ์๋๋ผ, ๊ทธ ์ค ์ผ๋ถ๋ง ๊ฐ์ ธ์ค๊ฒ ํ ์ ์์ต๋๋ค. ์ด ๋ชจ๋ ๊ธฐ๋ฒ์ด ๋ชจ๋ ์ค๋ฒํผํ ๋ฐฉ์ง๋ฅผ ์ํด ํธ๋ฆฌ๋ฅผ ๋ค๊ฐ์ ์ผ๋ก ๋ง๋ค๋ ค๋ ์๋์ ๋๋ค.
๋ํ K-fold Cross Validation์ฒ๋ผ ์ฃผ์ด์ง ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์์์ ์ผ๋ก N๊ฐ์ Fold๋ก ๋๋์ด์ ๊ฐ Fold์ ์ํ ๋ฐ์ดํฐ์ ๋ค์ Ordered Boosting์ ์ ์ฉํ ์ ์์ต๋๋ค.
cloudy = (15 +14 +20 + 25)/4 = 18.5
์ฆ, cloudy๋ฅผ cloudy์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ค์ class_label์ ๊ฐ์ ํ๊ท ์ผ๋ก ์ธ์ฝ๋ฉ ํ๋ ๊ฒ์ ๋๋ค. ์ด ๋๋ฌธ์ Mean encoding์ด๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์๋ ์ฐ๋ฆฌ๊ฐ ์์ธกํด์ผํ๋ ๊ฐ์ด ํ๋ จ ์ ํผ์ฒ์ ๋ค์ด๊ฐ๋ฒ๋ฆฌ๋ ๋ฌธ์ , ์ฆ target leakage ๋ฌธ์ ๋ฅผ ์ผ์ผํต๋๋ค. ์ด๋ ์ค๋ฒํผํ ์ ์ผ์ผํค๋ ์ฃผ ์์ธ์ด์, Mean encoding ๋ฐฉ๋ฒ ์์ฒด์ ๋ฌธ์ ์ด๊ธฐ๋ ํฉ๋๋ค.
๊ทธ๋์, Catboost๋ ์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ผ๋ก, ํ์ฌ ๋ฐ์ดํฐ์ ์ธ์ฝ๋ฉ์ ํ๊ธฐ ์ํด ์๋์ฒ๋ผ ์ด์ ๋ฐ์ดํฐ๋ค์ ์ธ์ฝ๋ฉ๋ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
- Friday ์๋, cloudy = (15+14)/2
## (tues + wed) / 2
- Saturday ์๋, cloudy = (15+14+20)/3 = 16.3 ๋ก ์ธ์ฝ๋ฉ ๋๋ค.
## (tues + wed + fri) / 3
Tues์ ๊ฒฝ์ฐ Ordered Target Encoding์ ์ ์ฉํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์๋๋๋ก๋ผ๋ฉด 0์ ๋ฃ์ด์ผ ํฉ๋๋ค.(๊ณผ๊ฑฐ์ ๋ฐ์ดํฐ๊ฐ 0๊ฐ์ด๊ธฐ ๋๋ฌธ!) ํ์ง๋ง ์ด ๊ฒฝ์ฐ Laplace Smoothing ์ด๋ผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
์ฆ, ํ์ฌ ๋ฐ์ดํฐ์ target value๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ์ด์ ๋ฐ์ดํฐ๋ค์ target value๋ง์ ์ฌ์ฉํ๋ค๋ณด๋, target leakage๊ฐ ์ผ์ด๋์ง ์๋ ๊ฒ์ ๋๋ค.
๋ฒ์ฃผํ ๋ณ์๋ฅผ ์๋ก ์ธ์ฝ๋ฉํ๋ ํ ๋, ์ค๋ฒํผํ ๋ ๋ง๊ณ ์์น๊ฐ์ ๋ค์์ฑ๋ ๋ง๋ค์ด ์ฃผ๋ ์ฐธ ์๋ฆฌํ ๊ธฐ๋ฒ์ด ์๋ ์ ์์ต๋๋ค.
์ฌ์ค ๋ฒ์ฃผํ ๋ณ์๋ฅผ ํญ์ Target Encodingํ๋ ๊ฒ์ด ์๋๋๋ค.
CatBoost๋ ๋ฎ์ Cardinality๋ฅผ ๊ฐ์ง๋ ๋ฒ์ฃผํ ๋ณ์์ ํํด์, ๊ธฐ๋ณธ์ ์ผ๋ก Onr-hot Encoding์ ์ํํฉ๋๋ค.
์๋ฌด๋๋ Low Cardinality ๋ฅผ ๊ฐ์ง๋ ๋ฒ์ฃผํ ๋ณ์์ ๊ฒฝ์ฐ Target Encoding ๋ณด๋ค One-hot ์ด ๋ ํจ์จ์ ์ด๋ผ ๊ทธ๋ฐ ๋ฏ ํฉ๋๋ค.
Python์์ CatBoost๋ก ๋ชจ๋ธ์ ์์ฑํ ๋, Hyper-parameter๋ก์ one_hot_max_size = N๋ผ๋ ๊ฐ์ ๋ฐ๋ก ์ค์ ํด์ฃผ๋ฉด ๋ฒ์ฃผํ ๋ณ์๋ค ์ค ๊ฐ์ level ๊ฐ์๊ฐ N๊ฐ์๋ณด๋ค ์๋ค๋ฉด ํด๋น ๋ฒ์ฃผํ ๋ณ์๋ฅผ ์๋์ผ๋ก One-Hot Encoding์ผ๋ก ์ฒ๋ฆฌํด์ค๋๋ค.
Catboost ๋ ๊ธฐ๋ณธ ํ๋ผ๋ฏธํฐ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์ ํ๊ฐ ์ ๋์ด์์ด์, ํ๋ผ๋ฏธํฐ ํ๋์ ํฌ๊ฒ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋ฉ๋๋ค. (๋ฐ๋ฉด XGBoost๋ LightGBM์ ํ๋ผ๋ฏธํฐ ํ๋์ ๋งค์ฐ ๋ฏผ๊ฐ)
์ฌ์ค ๋๋ถ๋ถ ๋ถ์คํ ๋ชจ๋ธ๋ค์ด ํ๋ผ๋ฏธํฐ ํ๋ํ๋ ์ด์ ๋, ํธ๋ฆฌ์ ๋คํ์ฑ๊ณผ ์ค๋ฒํผํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํจ์ธ๋ฐ, CatBoost๋ ์ด๋ฅผ ๋ด๋ถ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐํ๊ณ ์์ผ๋, ๊ตณ์ด ํ๋ผ๋ฏธํฐ ํ๋ํ ํ์๊ฐ ์๋ ๊ฒ์ ๋๋ค.
๊ตณ์ด ํ๋ค๋ฉด learning_rate, random_strength, L2_regulariser๊ณผ ๊ฐ์ ํ๋ผ๋ฏธํฐ ํ๋์ธ๋ฐ, ๊ฒฐ๊ณผ๋ ํฐ ์ฐจ์ด๊ฐ ์๋ค๊ณ ํฉ๋๋ค.
๋ค๋ฅธ GBM์ ๋นํด overfitting์ด ์ ๋ค.
๋ฒ์ฃผํ ๋ณ์์ ๋ํด ํน์ ์ธ์ฝ๋ฉ ๋ฐฉ์์ผ๋ก ์ธํ์ฌ ๋ชจ๋ธ์ ์ ํ๋์ ์๋๊ฐ ๋์ต๋๋ค.
One-hot Encoding, Label Encoding ๋ฑ encoding ์์ ์ ํ์ง ์๊ณ ๋ ๊ทธ๋๋ก ๋ชจ๋ธ์ input์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
missing data๋ฅผ ์ฒ๋ฆฌํด์ฃผ์ง ์์ต๋๋ค.
Sparse Matrix ์ฆ, ๊ฒฐ์ธก์น๊ฐ ๋งค์ฐ ๋ง์ ๋ฐ์ดํฐ์ ์๋ ๋ถ์ ํฉํ ๋ชจ๋ธ์ ๋๋ค.
๋ฐ์ดํฐ ๋๋ถ๋ถ์ด ์์นํ ๋ณ์์ธ ๊ฒฝ์ฐ, LightGBM๋ณด๋ค ํ์ต ์๋๊ฐ ๋๋ฆฝ๋๋ค. (์ฆ ๋๋ถ๋ถ์ด ๋ฒ์ฃผํ ๋ณ์์ธ ๊ฒฝ์ฐ ์ฌ์ฉ)
> # [์ฌ์ ์์
]
> #install.packages('devtools')
> library(devtools)
> devtools::install_url('https://github.com/catboost/catboost/releases/download/v0.20/catboost-R-Windows-0.20.tgz', INSTALL_opts = c("--no-multiarch", "--no-test-load"))
> library(catboost)
> library(caret)
> credit <- read.csv('D:\\ADP\\credit_final.csv')
> class(credit$credit.rating)
> credit$credit.rating <- as.factor(credit$credit.rating)
> levels(credit$credit.rating) <- c("pos", "neg")
> class(credit$credit.rating)
> credit$foreign.worker <- as.factor(credit$foreign.worker)
> credit$telephone <- as.factor(credit$telephone)
> credit$other.credits <- as.factor(credit$other.credits)
> credit$bank.credits <- as.factor(credit$bank.credits)
> credit$account.balance <- as.factor(credit$account.balance)
# [๋ฐ์ดํฐ ๋ถํ ]
> idx <- createDataPartition(y = credit$credit.rating,
+ time = 1, p = 0.7, list = FALSE)
> train <- credit[idx,]
> test <- credit[-idx,]
> table(train$credit.rating)
pos neg
210 490
> # [train set ์
์ํ๋ง]
> train <- upSample(subset(train, select = -credit.rating), train$credit.rating)
> train <- train %>% rename('credit.rating' = 'Class')
> table(train$credit.rating)
pos neg
490 490
> # [k-fold ์์ฑ ๋ฐ ๋๋ค ๊ทธ๋ฆฌ๋์์น ์ค์ ]
> cv_folds <- createMultiFolds(train$credit.rating, k = 3, times = 3)
> fit_ctrl <- trainControl(method = "repeatedcv",
+ number = 3,
+ repeats = 3,
+ index = cv_folds,
+ search = 'random',
+ verboseIter = TRUE)
> # [๋ชจ๋ธ ํ์ต]
> train_x <- subset(train, select = c(-credit.rating))
> train_y <- train$credit.rating
> catboost_model <- train(x = train_x, y = train_y,
+ method = catboost.caret,
+ metric = 'Accuracy',
+ preProcess = c("zv", "center", "scale", "spatialSign"),
+ #tuneGrid = grid,
+ trControl = fit_ctrl,
+ maximize = TRUE,
+ tuneLength = 10)
...
92: learn: 0.0003169 total: 430ms remaining: 32.4ms
93: learn: 0.0003046 total: 439ms remaining: 28ms
94: learn: 0.0002871 total: 449ms remaining: 23.6ms
95: learn: 0.0002675 total: 455ms remaining: 19ms
96: learn: 0.0002578 total: 461ms remaining: 14.3ms
97: learn: 0.0002528 total: 466ms remaining: 9.51ms
98: learn: 0.0002379 total: 470ms remaining: 4.75ms
99: learn: 0.0002233 total: 476ms remaining: 0us
> # [์ต์ ๋ชจ๋ธ ํ์ธ]
> catboost_model
Catboost
980 samples
20 predictor
2 classes: 'pos', 'neg'
Pre-processing: centered (15), scaled (15), spatial sign
transformation (15), ignore (5)
Resampling: Cross-Validated (3 fold, repeated 3 times)
Summary of sample sizes: 654, 652, 654, 654, 654, 652, ...
Resampling results across tuning parameters:
depth learning_rate l2_leaf_reg rsm border_count Accuracy
2 0.1158270 1e-06 0.8 168 0.7721021
2 0.3318660 1e-06 0.8 88 0.7881399
2 0.7353266 1e-06 0.8 252 0.8054600
4 0.0971376 1e-06 0.9 79 0.8173620
5 0.4965535 1e-06 0.7 214 0.8064741
5 0.6898669 1e-06 0.7 186 0.7969703
8 0.1959387 1e-01 1.0 39 0.8418541
8 0.4183411 1e-01 0.8 151 0.8238254
9 0.5728624 1e-06 0.8 59 0.8139413
9 0.7598337 1e-06 0.7 143 0.8115949
Kappa
0.5442042
0.5762798
0.6109199
0.6347241
0.6129483
0.5939407
0.6837082
0.6476508
0.6278825
0.6231899
Tuning parameter 'iterations' was held constant at a value of 100
Accuracy was used to select the optimal model using the largest value.
The final values used for the model were depth = 8, learning_rate
= 0.1959387, iterations = 100, l2_leaf_reg = 0.1, rsm = 1
and border_count = 39.
> catboost_model$bestTune
depth learning_rate iterations l2_leaf_reg rsm border_count
7 8 0.1959387 100 0.1 1 39
> ## border_count : ์์นํ ๋ณ์ ๋ถํ ์
> ## rsm : ๋ณ์๊ฐ ๋ฌด์์๋ก ๋ค์ ์ ํ๋ ๋ ๊ฐ ๋ถํ ์ ํ์์ ์ฌ์ฉํ ๋ณ์์ ๋ฐฑ๋ถ์จ
> # [๋ณ์ ์ค์๋ ํ์ธ]
> plot(varImp(catboost_model))
> # [์์ธก๊ฐ์ ๋ํ ํผ๋ํ๋ ฌ]
> confusionMatrix(test$credit.rating, predict(catboost_model, test, type = 'raw'))
Confusion Matrix and Statistics
Reference
Prediction pos neg
pos 44 46
neg 24 186
Accuracy : 0.7667
95% CI : (0.7146, 0.8134)
No Information Rate : 0.7733
P-Value [Acc > NIR] : 0.63898
Kappa : 0.4027
Mcnemar's Test P-Value : 0.01207
Sensitivity : 0.6471
Specificity : 0.8017
Pos Pred Value : 0.4889
Neg Pred Value : 0.8857
Prevalence : 0.2267
Detection Rate : 0.1467
Detection Prevalence : 0.3000
Balanced Accuracy : 0.7244
'Positive' Class : pos