๐ Boosting
- ์ฌ๋ฌ ๊ฐ์ ์ฝํ Decision Tree๋ฅผ ์กฐํฉํด์ ์ฌ์ฉํ๋ Ensemble ๊ธฐ๋ฒ ์ค ํ๋
- ์ฝํ ์์ธก ๋ชจํ๋ค์ ํ์ต ์๋ฌ์ ๊ฐ์ค์น๋ฅผ ๋๊ณ , ์์ฐจ์ ์ผ๋ก ๋ค์ ํ์ต ๋ชจ๋ธ์ ๋ฐ์ํ์ฌ ๊ฐํ ์์ธก๋ชจํ์ ๋ง๋๋ ๊ฒ
๐Gradient Boosting
- ๊ฒฝ์ฌ ํ๊ฐ๋ฒ(gradient descent)์ ์ฌ์ฉํด ์์ฌ ์ค์ฐจ๋ฅผ ์ต์ํํ๋ ๊ฒ
- ์๋ชป๋ ์์ธก์ ๊ธฐ๋ฐ์ผ๋ก ์กฐ์ ํ์ฌ ์๋ก์ด ํธ๋ฆฌ๋ฅผ ๋ง๋ฆ (๋๋ค ํฌ๋ ์คํธ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฐ์ ์ ๋ณด์ํ๋ ๋งค๋ ฅ์ ์ธ ๋์)
- ์๋ก์ด ํธ๋ฆฌ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์์ธก๋ ๊ฐ์๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค
- ์ค์ฐจ์๋ง ์ด์ ์ ๋ง์ถ๋ ML ์๊ณ ๋ฆฌ์ฆ ๋ง๋๋ ค๋ฉด ์ ํํ ์ต์ข ์์ธก์ ๋ง๋ค๊ธฐ ์ํด ์ค์ฐจ๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ ํ์
๋ฐ๋ผ์, ๋ชจ๋ธ์ ์์ธก๊ณผ ์ค์ ๊ฐ ์ฌ์ด์ ์ฐจ์ด์ธ ์์ฐจ(residual)๋ฅผ ํ์ฉ
- ๊ฐ ํธ๋ฆฌ ์์ธก ๊ฐ์ ๋ํด ๋ชจ๋ธ ํ๊ฐ์ ์ฌ์ฉํ๋ค.
โ XGBoost (Extreme Gradient Boosting)
- Extreme : '์ ํ๋', '์๋' ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ๊ณ์ฐ๋์ ๊ทน๋ํํ๋ ๊ฒ
- XGBoost : Gradient Boosting์ ํฌ๊ฒ ์ ๊ทธ๋ ์ด๋ ํ ๋ชจ๋ธ
๋ฐ๋ผ์, XGBoost ์ ์ฅ์ ์ ์ดํดํ๋ ค๋ฉด Gradient Boosting์ ์๋ ๋ฐฉ์์ ์์์ผ ํจ.
- ์์ฐจ๋ก๋ถํฐ ํ๋ จํ ํธ๋ฆฌ๋ฅผ ์ถ๊ฐํ์ฌ ์ฝํ ํ์ต๊ธฐ๋ฅผ ๊ฐ๋ ฅํ ํ์ต๊ธฐ๋ก ๋ฐ๊พผ๋ค
๐ก GBM ๋๋น ๋น ๋ฅธ ์ํ์๊ฐ - ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ก ํ์ต, ๋ถ๋ฅ ์๋๊ฐ ๋น ๋ฅด๋ค
๐ก ๊ณผ์ ํฉ ๊ท์ (Regularization)
- ํ์ค GBM์ ๊ฒฝ์ฐ ๊ณผ์ ํฉ ๊ท์ ๊ธฐ๋ฅ์ด ์์ผ๋, XGBoost๋ ์์ฒด์ ๊ณผ์ ํฉ ๊ท์ ๊ธฐ๋ฅ์ผ๋ก ๊ฐํ ๋ด๊ตฌ์ฑ ์ง๋๋ค
๐ก ๋ถ๋ฅ์ ํ๊ท์์ญ์์ ๋ฐ์ด๋ ์์ธก ์ฑ๋ฅ ๋ฐํ
- CART (Classification And Regression Tree) ์์๋ธ ๋ชจ๋ธ ์ฌ์ฉ
๐ก ์กฐ๊ธฐ ์ข ๋ฃ (Early Stopping) ๊ธฐ๋ฅ ์์
๐ก ๋ค์ํ ์ต์ ์ ์ ๊ณต, Customizing์ด ์ฉ์ด
โ XGBRegressor ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋ ์์
XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,
colsample_bynode=1, colsample_bytree=1, gamma=0, gpu_id=-1,
importance_type='gain', interaction_constraints='',
learning_rate=0.1, max_delta_step=0, max_depth=5,
min_child_weight=1, missing=nan, monotone_constraints='()',
n_estimators=100, n_jobs=0, num_parallel_tree=1, random_state=0,
reg_alpha=0, reg_lambda=1, scale_pos_weight=1, subsample=1,
tree_method='exact', validate_parameters=1, verbosity=None)
โ XGBoost Parameter
๐ ์ผ๋ฐ ํ๋ผ๋ฏธํฐ
- Boosting ์ํํ ๋ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ง, ์ ํ ๋ชจ๋ธ์ ์ฌ์ฉํ ์ง ๋ฑ์ ๊ณ ๋ฆ
๐ booster [๊ธฐ๋ณธ๊ฐ = gbtree]
- ์ด๋ค ๋ถ์คํฐ ๊ตฌ์กฐ๋ฅผ ์ธ์ง ๊ฒฐ์ ํ๋ค.
- ์์ฌ๊ฒฐ์ ๊ธฐ๋ฐ๋ชจํ(gbtree), ์ ํ๋ชจํ(gblinear), dart
๐ n_jobs
- XGBoost๋ฅผ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ณ๋ ฌ ์ค๋ ๋ ์
๐ verbosity [๊ธฐ๋ณธ๊ฐ = 1]
- ์ ํจํ ๊ฐ์ 0 (๋ฌด์), 1 (๊ฒฝ๊ณ ), 2 (์ ๋ณด), 3 (๋๋ฒ๊ทธ)
๐ ๋ถ์คํฐ ํ๋ผ๋ฏธํฐ
- ์ ํํ Booster์ ๋ฐ๋ผ ์ ์ฉํ ์ ์๋ ํ๋ผ๋ฏธํฐ ์ข ๋ฅ๊ฐ ๋ค๋ฅด๋ค
๐ learning_rate [ ๊ธฐ๋ณธ๊ฐ : 0.3 ]
- learning rate ๊ฐ ๋์์๋ก ๊ณผ์ ํฉ ํ๊ธฐ ์ฝ๋ค
๐ n_estimators [ ๊ธฐ๋ณธ๊ฐ : 100 ]
- ์์ฑํ weak learner ์ ์
- learning_rate ๊ฐ ๋ฎ์ ๋, n_estimators ๋ฅผ ๋์ฌ์ผ ๊ณผ์ ํฉ์ด ๋ฐฉ์ง
๐ max_depth [ ๊ธฐ๋ณธ๊ฐ : 6 ]
- ํธ๋ฆฌ์ maximum depth
- ์ ์ ํ ๊ฐ์ด ์ ์๋์ด์ผ ํจ (๋ณดํต 3 ~ 10 ์ฌ์ด์ ๊ฐ์ด ์ ์ฉ)
- max_depth ๊ฐ ๋์์๋ก ๋ชจ๋ธ์ ๋ณต์ก๋๊ฐ ์ปค์ ธ ๊ณผ์ ํฉ ํ๊ธฐ ์ฝ๋ค
๐ min_child_weight [ ๊ธฐ๋ณธ๊ฐ : 1 ]
- ๊ด์ธก์น์ ๋ํ ๊ฐ์ค์น ํฉ์ ์ต์
- ๊ฐ์ด ๋์์๋ก ๊ณผ์ ํฉ์ด ๋ฐฉ์ง
๐ gamma [ ๊ธฐ๋ณธ๊ฐ : 0 ]
- leaf node์ ์ถ๊ฐ ๋ถํ ์ ๊ฒฐ์ ํ ์ต์์์ค ๊ฐ์๊ฐ
- ํด๋น๊ฐ๋ณด๋ค ์์ค์ด ํฌ๊ฒ ๊ฐ์ํ ๋ ๋ถ๋ฆฌ
- ๊ฐ์ด ๋์์๋ก ๊ณผ์ ํฉ์ด ๋ฐฉ์ง
๐ subsample [ ๊ธฐ๋ณธ๊ฐ : 1 ]
- weak learner ๊ฐ ํ์ต์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ์ํ๋ง ๋น์จ
- ๋ณดํต 0.5 ~ 1 ์ฌ์ฉ
- ๊ฐ์ด ๋ฎ์์๋ก ๊ณผ์ ํฉ์ด ๋ฐฉ์ง
๐ colsample_bytree [ ๊ธฐ๋ณธ๊ฐ : 1 ]
- ๊ฐ tree ๋ณ ์ฌ์ฉ๋ feature percentage
- ๋ณดํต 0.5 ~ 1 ์ฌ์ฉ
- ๊ฐ์ด ๋ฎ์์๋ก ๊ณผ์ ํฉ์ด ๋ฐฉ์ง
๐ lambda [ ๊ธฐ๋ณธ๊ฐ : 1, ๋ณ์นญ : reg_lambda ]
- ๊ฐ์ค์น์ ๋ํ L2 Regularization ์ ์ฉ ๊ฐ
- feature ๊ฐ์๊ฐ ๋ง์ ๋ ์ ์ฉ ๊ฒํ
- ๊ฐ์ด ํด์๋ก ๊ณผ์ ํฉ ๊ฐ์
๐ alpha [ ๊ธฐ๋ณธ๊ฐ : 0, ๋ณ์นญ : reg_alpha ]
- ๊ฐ์ค์น์ ๋ํ L1 Regularization ์ ์ฉ ๊ฐ
- feature ๊ฐ์๊ฐ ๋ง์ ๋ ์ ์ฉ ๊ฒํ
- ๊ฐ์ด ํด์๋ก ๊ณผ์ ํฉ ๊ฐ์
๐ ํ์ต ๊ณผ์ ํ๋ผ๋ฏธํฐ
- ํ์ต ์๋๋ฆฌ์ค๋ฅผ ๊ฒฐ์
๐ objective [ ๊ธฐ๋ณธ๊ฐ : reg = squarederror ]
- reg : squarederror
โ ์ ๊ณฑ ์์ค์ด ์๋ ํ๊ท
- binary : logistic (binary-logistic classification)
โ ์ดํญ ๋ถ๋ฅ ๋ฌธ์ ๋ก์ง์คํฑ ํ๊ท ๋ชจํ์ผ๋ก ๋ฐํ๊ฐ์ด ํด๋์ค๊ฐ ์๋๋ผ ์์ธก ํ๋ฅ
- multi : softmax
โ ๋คํญ ๋ถ๋ฅ ๋ฌธ์ ์ ๊ฒฝ์ฐ ์ํํธ๋งฅ์ค(softmax)๋ฅผ ์ฌ์ฉํด์ ๋ถ๋ฅ
โ ๋ฐํ๋๋ ๊ฐ์ด ์์ธกํ๋ฅ ์ด ์๋๋ผ ํด๋์ค, num_class๋ ์ง์ ํด์ผ ํจ
๐ eval_metric
- ๋ชจ๋ธ์ ํ๊ฐ ํจ์๋ฅผ ์กฐ์ ํ๋ ํจ์
- ์ค์ ํ objective ๋ณ๋ก ๊ธฐ๋ณธ ์ค์ ๊ฐ์ด ์ง์ ๋์ด ์์
- ํด๋น ๋ฐ์ดํฐ์ ํน์ฑ์ ๋ง๊ฒ ํ๊ฐ ํจ์๋ฅผ ์กฐ์
โ rmse : root mean square error
โ mae : mean absolute error
โ logloss : negative log-likelihood
โ error : Binary classification error rate (0.5 threshold)
โ merror : Multiclass classification error rate
โ mlogloss : Multiclass logloss
โ auc : Area under the curve
โ map : mean average precision
๐ seed [ ๊ธฐ๋ณธ๊ฐ : 0 ]
- ์ฌํ ๊ฐ๋ฅํ๋๋ก ๋์๋ฅผ ๊ณ ์
๐ข ๋ฏผ๊ฐํ๊ฒ ์กฐ์ ํด์ผ ํ๋ ๊ฒ
โ Booster ๋ชจ์
โ eval_metric (ํ๊ฐํจ์) / objective (๋ชฉ์ ํจ์)
โ eta
โ L1 form (L1 regulariztion form ์ด L2 ๋ณด๋ค outlier ์ ๋ฏผ๊ฐ)
โ L2 form
๐ข ๊ณผ์ ํฉ ๋ฐฉ์ง๋ฅผ ์ํด ์กฐ์ ํด์ผ ํ๋ ๊ฒ
โ learning rate ๋ฎ์ถ๊ธฐ → n_estimators ๋ ๋์ฌ์ผ ํจ
โ max_depth ๋ฎ์ถ๊ธฐ
โ min_child_weight ๋์ด๊ธฐ
โ gamma ๋์ด๊ธฐ
โ subsample, colsample_bytree ๋ฎ์ถ๊ธฐ
โ Sample code 1. XGBClassifier
import xgboost as xgb
import matplotlib.pyplot as plt
# ๋ชจ๋ธ ์ ์ธ
model = xgb.XGBClassifier()
# ๋ชจ๋ธ ํ๋ จ
model.fit(x,y)
# ๋ชจ๋ธ ์์ธก
y_pred = model.predict(X_test)
โ Sample code 2. XGBRegressor
import xgboost as xgb
# ๋ชจ๋ธ ์ ์ธ
my_model = xgb.XGBRegressor(learning_rate=0.1,max_depth=5,n_estimators=100)
# ๋ชจ๋ธ ํ๋ จ
my_model.fit(X_train, y_train, verbose=False)
# ๋ชจ๋ธ ์์ธก
y_pred = my_model.predict(X_test)
โ XGBoost ๋ชจํ ์๊ฐํ
๐ ์์ฌ๊ฒฐ์ ๋๋ฌด ์๊ฐํ library ์ค์น (graphviz)
pip install graphviz
conda install graphviz
๐ xgb.plot_importance() ๋ฉ์๋
import xgboost as xgb
xgb.plot_importance(my_model)
๐ xgb.plot_tree() ๋ฉ์๋
import xgboost as xgb
import matplotlib.pyplot as plt
# num_trees : ๊ทธ๋ฆผ์ ์ฌ๋ฌ๊ฐ ๊ทธ๋ฆด์ ๊ทธ๋ฆผ ๋ฒํธ
# rankdir : ํธ๋ฆฌ์ ๋ฐฉํฅ, ๋ํดํธ๋ ์์๋ ๋ฐฉํฅ
# rankdir="LR" : ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ํธ๋ฆฌ๋ฅผ ๋ณด์ฌ์ค๋ค.
xgb.plot_tree(my_model, num_trees=0, rankdir='LR')
fig = plt.gcf()
fig.set_size_inches(150, 100) # ํด์๋ ์ง์ ์ต์
# ์ด๋ฏธ์ง ์ ์ฅํ๊ณ ์ถ๋ค๋ฉด
# fig.savefig('tree.png')
plt.show()
'Machine Learning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Machine Learning] Poisson Regression (0) | 2023.04.26 |
---|---|
[Machine learning] scikit-learn pipeline (0) | 2023.04.21 |
[Machine Learning] Data Leakage (0) | 2023.04.21 |
[Machine Learning] Hyperparameter Tuning (0) | 2023.04.21 |
[Machine Learning] Feature Engineering (0) | 2023.04.21 |