05. GBM
๐ ๊ฐ์ ๋ฐ ์ค์ต
๐ก ๋ถ์คํ ์๊ณ ๋ฆฌ์ฆ
- ์ฌ๋ฌ๊ฐ์ ์ฝํ ํ์ต๊ธฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ํ์ต - ์์ธกํ๋ฉด์ ์๋ชป ์์ธกํ ๋ฐ์ดํฐ์ ๊ฐ์ค์น ๋ถ์ฌ๋ฅผ ํตํด ์ค๋ฅ๋ฅผ ๊ฐ์ ํด ๋๊ฐ๋ฉด์ ํ์ตํ๋ ๋ฐฉ์์ด๋ค.
- ๋ํ ์๊ณ ๋ฆฌ์ฆ : AdaBoost, Gradient Booting Machine(GBM), XGBoost, LightGBM, CatBoost
1๏ธโฃ AdaBoost
→ ์ค๋ฅ ๋ฐ์ดํฐ์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ๋ฉด์ ๋ถ์คํ ์ ์ํํ๋ ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ (๊ต์ฌ ๊ทธ๋ฆผ ํ์ธ)
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score
clf = AdaBoostClassifier(n_estimators=30,
random_state=10,
learning_rate=0.1)
clf.fit(X_train, y_train)
pred = clf.predict(X_test)
print('AdaBoost ์ ํ๋: {:.4f}'.format(accuracy_score(y_test, pred)))
2๏ธโฃ ๊ทธ๋๋์ธํธ ๋ถ์คํธ (GBM)
→ AdaBoost ์ ์ ์ฌํ๋ ๊ฐ์ค์น ์ ๋ฐ์ดํธ๋ฅผ ๊ฒฝ์ฌํ๊ฐ๋ฒ์ ์ด์ฉํ๋ ๊ฒ์ด ํฐ ์ฐจ์ด๋ค.
→ ๊ฒฝ์ฌํ๊ฐ๋ฒ : (์ค์ ๊ฐ-์์ธก๊ฐ) ์ ์ต์ํํ๋๋ก ํ๋ ๋ฐฉํฅ์ฑ์ ๊ฐ์ง๊ณ ๋ฐ๋ณต์ ์ผ๋ก ๊ฐ์ค์น ๊ฐ์ ์ ๋ฐ์ดํธ ํ๋ค.
→ ๋ถ๋ฅ์ ํ๊ท ๋ชจ๋ ๊ฐ๋ฅํ๋ค.
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train , X_test, y_train, y_test = train_test_split(X,y, test_size = 0.3, random_state=10)
gb_clf = GradientBoostingClassifier(random_state = 0)
# default ๊ฐ max_depth = 3
gb_clf.fit(X_train, y_train)
print(gb_clf.score(X_train, y_train)) # .score : ์ ํ๋ ๋ฐํ
# 0.1
print(gb_clf.score(X_test, y_test))
# 0.9777777777778
from sklearn.metrics import accuracy_score
y_pred = gb_clf.predict(X_test)
print(accuracy_score(y_test, y_pred))
# 0.9777777777777777
- ์ผ๋ฐ์ ์ผ๋ก GBM ์ด ๋๋คํฌ๋ ์คํธ๋ณด๋ค๋ ์์ธก ์ฑ๋ฅ์ด ์กฐ๊ธ ๋ฐ์ด๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๊ทธ๋ฌ๋ ์ฝํ ํ์ต๊ธฐ์ ์์ฐจ์ ์ธ ์์ธก ์ค๋ฅ ๋ณด์ ๋๋ฌธ์ ์ํ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๊ณ , ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋์ ๋ํ ๋ ธ๋ ฅ๋ ํ์ํ๋ค.
๐ GBM ํ์ดํผํ๋ผ๋ฏธํฐ
Parameter | ์ค๋ช |
n_estimator | ์์ฑํ ์ฝํ ํ์ต๊ธฐ์ ๊ฐ์ (๋ํดํธ๋ 100) |
max_depth | ํธ๋ฆฌ์ ์ต๋ ๊น์ด (๋ํดํธ๋ 3) ๊น์ด์ง๋ฉด ๊ณผ์ ํฉ ๋ ์ ์์ผ๋ฏ๋ก ์ ์ ํ ์ ์ด ํ์ |
max_features | ์ต์ ์ ๋ถํ ์ ์ํด ๊ณ ๋ คํ ์ต๋ feature ๊ฐ์ |
loss | ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์์ ์ฌ์ฉํ ๋น์ฉํจ์ ์ง์ (๋ํดํธ๋ deviance) |
learning_rate | ์ฝํ ํ์ต๊ธฐ๊ฐ ์์ฐจ์ ์ผ๋ก ์ค๋ฅ ๊ฐ์ ๋ณด์ ํด ๋์๊ฐ๋๋ฐ ์ ์ฉํ๋ ๊ณ์๋ก 0~1 ์ฌ์ด์ ๊ฐ ์ง์ ๊ฐ๋ฅ. ๋ํดํธ๋ 0.1 ๐ธ ๋๋ฌด ์์ ๊ฐ์ ์ง์ ํ๋ฉด ์์ธก ์ฑ๋ฅ์ ๋์์ง ์ ์์ง๋ง ์ํ์๊ฐ์ด ์ค๋๊ฑธ๋ฆด ์ ์๊ณ ๋ฐ๋ณต์ด ์๋ฃ๋์ด๋ ์ต์ ์ค๋ฅ๊ฐ์ ์ฐพ์ง ๋ชปํ ์ ์์ ๐ธ ๋๋ฌด ํฐ๊ฐ์ ์ง์ ํ๋ฉด ๋น ๋ฅธ ์ํ์ ๊ฐ๋ฅํ๋ ์ต์์ค๋ฅ๊ฐ์ ์ฐพ์ง ๋ชปํ๊ณ ์ง๋์ณ ์์ธก ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ |
subsample | ํ์ต์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ์ ์ํ๋ง ๋น์จ๋ก 0~1 ๊ฐ ์ง์ ๊ฐ๋ฅ (๋ํดํธ๋ 1๋ก ์ฆ ์ ์ฒด ํ์ต ๋ฐ์ดํฐ ๊ธฐ๋ฐ) |
from sklearn.model_selection import GridSearchCV
params = {
'n_estimators' : [100,500],
'learning_rate' : [0.05, 0.1]
}
grid_cv = GridSearchCV(gb_clf, param_grid = params, cv = 2, verbose = 1)
# verbose : iteration ๋ง๋ค ์ํ ๊ฒฐ๊ณผ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ ๋ถ๋ถ
# verbose = 0 : ๋ฉ์์ง ์ถ๋ ฅ ์ํจ (๋ํดํธ)
# verbose = 1 : ๊ฐ๋จํ ๋ฉ์์ง ์ถ๋ ฅ , verbose = 2 : ํ์ดํผํ๋ผ๋ฏธํฐ๋ณ ๋ฉ์์ง ์ถ๋ ฅ
grid_cv.fit(X_train, y_train)
print('์ต์ ์ ํ์ดํผ ํ๋ผ๋ฏธํฐ : \n', grid_cv.best_params_)
# {'learning_rate': 0.05, 'n_estimators': 100}
print('์ต๊ณ ์์ธก ์ ํ๋ : {0:.4f}'.format(grid_cv.best_score_))
# ์ต๊ณ ์์ธก ์ ํ๋ : 0.9334
gb_pred = grid_cv.best_estimator_.predict(X_test) # ์ต์ ์ผ๋ก ํ์ต๋ estimator ๋ก ์์ธก ์ํ
gb_accuracy = accuracy_score(y_test, gb_pred)
print('GBM ์ ํ๋ : {0:.4f}'.format(gb_accuracy))
# GBM ์ ํ๋ : 0.9778
06. XGBoost
๐ ๊ฐ์ ๋ฐ ์ค์ต
๐ก XGBoost
- ํธ๋ฆฌ ๊ธฐ๋ฐ์ ์์๋ธ ํ์ต์์ ๊ฐ์ฅ ๊ฐ๊ด๋ฐ๊ณ ์๋ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์ด๋ค.
๐ ์ฅ์
- ๋ถ๋ฅ์ ์์ด ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ๋จธ์ ๋ฌ๋๋ณด๋ค ๋ฐ์ด๋ ์์ธก ์ฑ๋ฅ์ ๋ํ๋ธ๋ค.
- GBM ์ ๊ธฐ๋ฐํ๊ณ ์์ง๋ง, GBM ์ ๋จ์ ์ธ ๋๋ฆฐ ์ํ์๊ฐ ๋ฐ ๊ณผ์ ํฉ ๊ท์ ๋ถ์ฌ ๋ฑ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ฌ ๋งค์ฐ ๊ฐ๊ด๋ฐ๊ณ ์๋ค. ๋ณ๋ ฌ ํ์ต์ด ๊ฐ๋ฅํด ๊ธฐ์กด GBM ๋ณด๋ค ๋น ๋ฅด๊ฒ ํ์ต์ ์๋ฃํ ์ ์๋ค.
- ๊ณผ์ ํฉ ๊ท์ (Regularization) ๊ธฐ๋ฅ์ด ์๋ค. (GBM ์ ์์)
- Tree prunning (๋๋ฌด ๊ฐ์ง์น๊ธฐ) : max_depth ํ๋ผ๋ฏธํฐ๋ก ๋ถํ ๊น์ด๋ฅผ ์กฐ์ ํ๊ธฐ๋ ํ์ง๋ง, tree prunning ์ผ๋ก ๋ ์ด์ ๊ธ์ ์ด๋์ด ์๋ ๋ถํ ์ ๊ฐ์ง์น๊ธฐ ํด์ ๋ถํ ์๋ฅผ ๋ ์ค์ด๋ ์ถ๊ฐ์ ์ธ ์ฅ์ ์ ๊ฐ์ง๊ณ ์๋ค.
- ์์ฒด ๋ด์ฅ๋ ๊ต์ฐจ ๊ฒ์ฆ : ๊ต์ฐจ๊ฒ์ฆ์ ์ํํด ์ต์ ํ๋ ๋ฐ๋ณต ์ํ ํ์๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ ํ๊ฐ ๊ฐ์ด ์ต์ ํ ๋๋ฉด ๋ฐ๋ณต์ ์ค๊ฐ์ ๋ฉ์ถ ์ ์๋ ์กฐ๊ธฐ ์ค๋จ ๊ธฐ๋ฅ์ด ์๋ค.
- ๊ท ํํธ๋ฆฌ๋ถํ : ์ต๋ํ ๊ท ํ์กํ ํธ๋ฆฌ๋ฅผ ์ ์งํ๋ฉด์ ๋ถํ ํ๋ค. (ํธ๋ฆฌ์ ๊น์ด ์ต์ํ, ๊ณผ์ ํฉ ๋ฐฉ์ง)
- ๊ฒฐ์๊ฐ ์์ฒด ์ฒ๋ฆฌ
๐ ํ์ดํผํ๋ผ๋ฏธํฐ
- GBM ๊ณผ ์ ์ฌํ ํ์ดํผ ํ๋ผ๋ฏธํฐ๋ฅผ ๋์ผํ๊ฒ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ฌ๊ธฐ์ ์กฐ๊ธฐ์ค๋จ (early stopping) , ๊ณผ์ ํฉ์ ๊ท์ ํ๊ธฐ ์ํ ํ์ดํผ ํ๋ผ๋ฏธํฐ ๋ฑ์ด ์ถ๊ฐ ๋์๋ค.
- XGBoost ์์ฒด์ ์ผ๋ก ๊ต์ฐจ๊ฒ์ฆ, ์ฑ๋ฅํ๊ฐ, ํผ์ฒ ์ค์๋ ๋ฑ์ ์๊ฐํ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.
1๏ธโฃ ํ์ด์ฌ ๋ํผ XGBoost
import xgboost
Parameter | ์ค๋ช |
eta | GBM ์ ํ์ต๋ฅ ๊ณผ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก, 0์์ 1 ์ฌ์ด์ ๊ฐ์ ์ง์ ํ๋ค. ํ์ด์ฌ ๋ํผ ๊ธฐ๋ฐ์ ๋ํดํธ๋ 0.3 |
num_boost_rounds | GBM ์ n_estimators (์ฝํ ํ์ต๊ธฐ์ ๊ฐ์) ์ ๊ฐ์ ํ๋ผ๋ฏธํฐ์ด๋ค. |
min_child_weight | (๋ํดํธ 1) ํธ๋ฆฌ์์ ์ถ๊ฐ์ ์ผ๋ก ๊ฐ์ง๋ฅผ ๋๋์ง๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ํ์ํ weight ์ ์ดํฉ. ๊ฐ์ด ํด์๋ก ๋ถํ ์ ์์ ํ๋ค. ๊ณผ์ ํฉ์ ์กฐ์ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. |
gamma | (๋ํดํธ 0) ๋ฆฌํ๋ ธ๋๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๋๋์ง๋ฅผ ๊ฒฐ์ ํ ์ต์ ์์ค ๊ฐ์ ๊ฐ์ด๋ค. ํด๋น ๊ฐ๋ณด๋ค ํฐ ์์ค์ด ๊ฐ์๋ ๊ฒฝ์ฐ์ ๋ฆฌํ๋ ธ๋๋ฅผ ๋ถ๋ฆฌํ๋ค. ๊ฐ์ด ํด์๋ก ๊ณผ์ ํฉ ๊ฐ์ ํจ๊ณผ๊ฐ ์๋ค. |
max_depth | ํธ๋ฆฌ ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ max_depth ์ ๊ฐ๋ค. 0์ ์ง์ ํ๋ฉด ๊น์ด์ ์ ํ์ด ์๋ค. ๋ณดํต 3~10 ์ฌ์ด์ ๊ฐ์ ์ ์ฉํ๋ค. |
sub_sample | GBM ์ subsample ๊ณผ ๋์ผํ๋ค. ํธ๋ฆฌ๊ฐ ์ปค์ ธ์ ๊ณผ์ ํฉ ๋๋ ๊ฒ์ ์ ์ดํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ์ํ๋งํ๋ ๋น์จ์ ์ง์ ํ๋ค. 0.5๋ก ์ง์ ํ๋ฉด ์ ์ฒด ๋ฐ์ดํฐ์ ์ ๋ฐ์ ํธ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉํ๋ค. 0์์ 1 ์ฌ์ด์ ๊ฐ์ด ๊ฐ๋ฅํ๋, ์ผ๋ฐ์ ์ผ๋ก 0.5~1 ์ฌ์ด์ ๊ฐ์ ์ฌ์ฉํ๋ค. |
lambda | L2 ๊ท์ ์ ์ฉ๊ฐ. ํผ์ฒ ๊ฐ์๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ ์ฉ์ ๊ฒํ ํ๋ฉฐ, ๊ฐ์ด ํด์๋ก ๊ณผ์ ํฉ ๊ฐ์ ํจ๊ณผ๊ฐ ์๋ค. |
alpha | L1 ๊ท์ ์ ์ฉ๊ฐ. ํผ์ฒ ๊ฐ์๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ ์ฉ์ ๊ฒํ ํ์ฌ, ๊ฐ์ด ํด์๋ก ๊ณผ์ ํฉ ๊ฐ์ ํจ๊ณผ๊ฐ ์๋ค. |
๐ ๊ณผ์ ํฉ ๋ฌธ์ ๋ฐฉ์งํ๊ธฐ
- 0.01~0.1 ์ ๋ eta ๊ฐ์ ๋ฎ์ถ๋ค.
- n_estimator ๋ฅผ ๋์ธ๋ค. (num_round)
- max_depth ๊ฐ์ ๋ฎ์ถ๋ค.
- min_child_weight ๊ฐ์ ๋์ธ๋ค.
- gamma ๊ฐ์ ๋์ธ๋ค.
- subsample ๊ณผ colsample_bytree ๋ฅผ ์กฐ์ ํ์ฌ ํธ๋ฆฌ๊ฐ ๋๋ฌด ๋ณต์กํ๊ฒ ์์ฑ๋๋ ๊ฒ์ ๋ง์ ๊ณผ์ ํฉ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ๋ค.
โญ ์์ฒด์ ์ผ๋ก ๊ต์ฐจ ๊ฒ์ฆ, ์ฑ๋ฅ ํ๊ฐ, ํผ์ฒ ์ค์๋ ๋ฑ์ ์๊ฐํ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.
โญ ์กฐ๊ธฐ์ค๋จ ๊ธฐ๋ฅ์ด ์์ด์ ๋ถ์คํ ๋ฐ๋ณต ํ์์ ๋๋ฌํ์ง ์์๋ ์์ธก ์ค๋ฅ๊ฐ ๊ฐ์ ๋์ง ์์ผ๋ฉด ์ค๋จํ๋ค.
2๏ธโฃ ์ฌ์ดํท๋ฐ ๋ํผ XGBoost
from xgboost import XGBClassifier
Parameter | ์ค๋ช |
learning_rate | ํ์ต๋ฅ |
subsample | ํธ๋ฆฌ๊ฐ ์ปค์ ธ์ ๊ณผ์ ํฉ ๋๋ ๊ฒ์ ์ ์ดํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ์ํ๋งํ๋ ๋น์จ์ ์ง์ ํ๋ค. 0.5๋ก ์ง์ ํ๋ฉด ์ ์ฒด ๋ฐ์ดํฐ์ ์ ๋ฐ์ ํธ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉํ๋ค. 0์์ 1 ์ฌ์ด์ ๊ฐ์ด ๊ฐ๋ฅํ๋, ์ผ๋ฐ์ ์ผ๋ก 0.5~1 ์ฌ์ด์ ๊ฐ์ ์ฌ์ฉํ๋ค. |
reg_lambda | L2 ๊ท์ ์ ์ฉ๊ฐ. ํผ์ฒ ๊ฐ์๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ ์ฉ์ ๊ฒํ ํ๋ฉฐ, ๊ฐ์ด ํด์๋ก ๊ณผ์ ํฉ ๊ฐ์ ํจ๊ณผ๊ฐ ์๋ค. |
reg_alpha | L1 ๊ท์ ์ ์ฉ๊ฐ. ํผ์ฒ ๊ฐ์๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ ์ฉ์ ๊ฒํ ํ์ฌ, ๊ฐ์ด ํด์๋ก ๊ณผ์ ํฉ ๊ฐ์ ํจ๊ณผ๊ฐ ์๋ค. |
โ ์กฐ๊ธฐ์ค๋จ ๊ด๋ จ ํ๋ผ๋ฏธํฐ : early_sropping_rounds ๋ก fit() ์ ์ธ์๋ก ์ ๋ ฅํ๋ฉด ๋๋ค.
โ eval_metric : ์กฐ๊ธฐ์ค๋จ์ ์ํ ํ๊ฐ์งํ
โ eval_set : ์ฑ๋ฅ ํ๊ฐ๋ฅผ ์ํํ ๋ฐ์ดํฐ์
๐ ์์ค์ฝ์ ์ ๋ฐฉ์ ์์ธก
โ ์ ์ฑ์ข ์(malignant) , ์์ฑ์ข ์(benign) ์ธ์ง ๋ถ๋ฅํ๋ ๋ฌธ์
โ ํผ์ฒ : ์ข ์์ ํฌ๊ธฐ, ๋ชจ์ ๋ฑ ๋ค์ํ ์์ฑ๊ฐ์ด ์กด์ฌ
1๏ธโฃ ํ์ด์ฌ ๋ํผ XGBoost
import xgboost as xgb
from xgboost import plot_importance
import pandas as pd
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')
# 01. ๋ฐ์ดํฐ ๋ก๋
dataset = load_breast_cancer()
X_features = dataset.data
y_label = dataset.target
cancer_df = pd.DataFrame(data = X_features, columns = dataset.feature_names)
cancer_df['target'] = y_label
# 02. target ๋ถํฌ ํ์ธ
print(cancer_df['target'].value_counts())
### 1 357
### 0 212
# 03. ํ๋ จ์
, ํ
์คํธ์
์์ฑ
X_train, X_test, y_train, y_test = train_test_split(X_features, y_label, test_size = 0.2, random_state = 156)
## ํ์ด์ฌ ๋ํผ์ xgboost ์ ์ฉ์์๋ ํ๋ จ, ํ
์คํธ ๋ฐ์ดํฐ ์
์ DMatrix ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ผ ํ๋ค.
dtrain = xgb.DMatrix(data = X_train, label = y_train)
dtest = xgb.DMatrix(data = X_test, label = y_test)
# 04. ํ์ดํผ ํ๋ผ๋ฏธํฐ ์ค์ , ํ๋ จ
# ํ์ดํผํ๋ผ๋ฏธํฐ ์ค์ : ๋์
๋๋ฆฌ ํํ๋ก ์ง์
params = {
'max_depth' : 3 , #ํธ๋ฆฌ์ ์ต๋ ๊น์ด๋ 3
'eta' : 0.1 , # ํ์ต๋ฅ ์ 0.1
'objective' : 'binary:logistic', # ์์ ๋ฐ์ดํฐ๊ฐ 0 ๋๋ 1 ์ด์ง๋ถ๋ฅ ์ด๋ฏ๋ก ๋ชฉ์ ํจ์๋ ์ด์ง ๋ก์ง์คํฑ
'eval_metric' : 'logloss', # ์ค๋ฅ ํจ์์ ํ๊ฐ ์ฑ๋ฅ ์งํ
'early_stoppings' : 100 # ์กฐ๊ธฐ์ค๋จ
}
num_rounds = 400 # ๋ถ์คํ
๋ฐ๋ณต ํ์๋ 400ํ
wlist = [(dtrain, 'train'), (dtest, 'eval')]
xgb_model = xgb.train(params = params, dtrain = dtrain, num_boost_round = num_rounds,
early_stopping_rounds = 100, evals = wlist)
# ์กฐ๊ธฐ์ค๋จํ ์ ์๋ ์ต์๋ฐ๋ณตํ์ : 100
# loss ๊ฐ ์ง์์ ์ผ๋ก ๊ฐ์ํจ์ ํ์ธํด๋ณผ ์ ์์
๐ง logloss ๋?
- ๋ค์ค ํด๋์ค ๋ถ๋ฅ ๋ชจ๋ธ (target ์ด 3๊ฐ ์ด์) ์ ํ๊ฐํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๋ชจ๋ธ์ด ์์ธกํ ํ๋ฅ ๊ฐ์ ์ง์ ์ ์ผ๋ก ๋ฐ์ํ์ฌ ํ๊ฐํ๋ค. ์ฆ, ์ ๋ต์ ๋ง์ท๋ค๊ณ ํด๋, ์ ๋ต์ ๋ ๋์ ํ๋ฅ ๋ก ์์ธกํ ์๋ก ๋ ์ข์ ๋ชจ๋ธ์ด๋ผ๊ณ ํ๊ฐํ๋ ๊ฒ
- logloss ๊ฐ์ด ์์์๋ก (= pij ํ๋ฅ ์ด 1์ ๊ฐ๊น์ธ์๋ก = 0์ ๊ฐ๊น์ด ๊ฐ์ด๋ฏ๋ก) ์ข์ ๋ชจ๋ธ์ด๋ค.
- ex. 100% ํ๋ฅ (ํ์ )์ผ๋ก ๋ต์ ๊ตฌํ ๊ฒฝ์ฐ์ logloss ๋ -log(1.0) = 0 ์ด๊ณ , 60%์ ํ๋ฅ ์ ๊ฒฝ์ฐ์๋ -log(0.6) = 0.51082 ์ด๋ค.
โ https://seoyoungh.github.io/machine-learning/ml-logloss/
# 05. ์์ธก
pred_probs = xgb_model.predict(dtest)
print('predict ๊ฒฐ๊ณผ 10๊ฐ ํ์, ์์ธก ํ๋ฅ ๊ฐ์ผ๋ก ํ์๋จ')
print(np.round(pred_probs[:10],3))
## [0.934 0.003 0.91 0.094 0.993 1. 1. 0.999 0.997 0. ]
preds = [1 if x > 0.5 else 0 for x in pred_probs]
# 0.5 ๋ณด๋ค ํฌ๋ฉด 1, ์๋๋ฉด 0์ผ๋ก ๋ ์ด๋ธ๋ง
print('์์ธก๊ฐ 10๊ฐ๋ง ํ์ : ', preds[:10])
## ์์ธก๊ฐ 10๊ฐ๋ง ํ์ : [1, 0, 1, 0, 1, 1, 1, 1, 1, 0]
# 06. ์ฑ๋ฅํ๊ฐ์งํ
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, preds)
# array([[35, 2],
# [ 1, 76]])
from sklearn.metrics import classification_report
print(classification_report(y_test, preds))
# 07. ๋ณ์ ์ค์๋ ์ถ๋ ฅ
from xgboost import plot_importance
import matplotlib.pyplot as plt
%matplotlib inline
fig, ax = plt.subplots(figsize=(10,12))
plot_importance(xgb_model, ax = ax)
# ๋ณ์ ์ค์๋ ์ถ๋ ฅ : f1 ์ค์ฝ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ํผ์ฒ์ ์ค์๋๋ฅผ ๋ํ๋ธ๋ค.
โญ https://wikidocs.net/22881 : ๋ก์ง์คํฑ ํ๊ท(์ด์ง๋ถ๋ฅ), ์ธ๊ณต ์ง๋ฅ ์๊ณ ๋ฆฌ์ฆ์ด ํ๋ ๊ฒ์ ๊ฒฐ๊ตญ ์ฃผ์ด์ง ๋ฐ์ดํฐ์ ์ ํฉํ ๊ฐ์ค์น w์ b๋ฅผ ๊ตฌํ๋ ๊ฒ์ ๋๋ค.
2๏ธโฃ ์ฌ์ดํท๋ฐ ๋ํผ XGBoost
# ์ฌ์ดํท๋ฐ ๋ํผ XGBoost ํด๋์ค์ธ XGBClassifier ์ํฌํธ
from xgboost import XGBClassifier
xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate = 0.1, max_depth = 3)
xgb_wrapper.fit(X_train, y_train)
w_preds = xgb_wrapper.predict(X_test)
from sklearn.metrics import classification_report
print(classification_report(y_test, w_preds))
# ์กฐ๊ธฐ์ค๋จ ์ฌ์ฉํด๋ณด๊ธฐ
from xgboost import XGBClassifier
xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate = 0.1, max_depth = 3)
evals = [(X_test, y_test)] # ์ฑ๋ฅํ๊ฐ๋ฅผ ์ํํ ๋ฐ์ดํฐ์
xgb_wrapper.fit(X_train, y_train, early_stopping_rounds = 100, eval_metric = 'logloss', eval_set = evals, verbose = True)
ws100_preds = xgb_wrapper.predict(X_test)
# 211 ๋ฒ ๋ฐ๋ณต์ logloss ๊ฐ 0.085593 ์ธ๋ฐ, 311๋ฒ ๋ฐ๋ณต์ logloss๊ฐ 0.085948๋ก ์ง์ ๋ 100๋ฒ์ ๋ฐ๋ณต๋์ ์ฑ๋ฅํ๊ฐ์ง์๊ฐ ํฅ์๋์ง ์์๊ธฐ์ ์กฐ๊ธฐ์ข
๋ฃ
print(classification_report(y_test, ws100_preds))
xgb_wrapper.fit(X_train, y_train, early_stopping_rounds = 10, eval_metric = 'logloss', eval_set = evals, verbose = True)
ws10_preds = xgb_wrapper.predict(X_test)
print(classification_report(y_test, ws10_preds))
# ๋ณ์ ์ค์๋
from xgboost import plot_importance
import matplotlib.pyplot as plt
%matplotlib inline
fig, ax = plt.subplots(figsize=(10,12))
plot_importance(xgb_wrapper, ax = ax)
'1๏ธโฃ AIโขDS > ๐ ๋จธ์ ๋ฌ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[05. ํด๋ฌ์คํฐ๋ง] K-means, ํ๊ท ์ด๋, GMM, DBSCAN (0) | 2022.05.07 |
---|---|
[06. ์ฐจ์์ถ์] PCA, LDA, SVD, NMF (0) | 2022.04.24 |
[05. ํ๊ท] ์ ํํ๊ท, ๋คํญํ๊ท, ๊ท์ ํ๊ท, ๋ก์ง์คํฑํ๊ท, ํ๊ทํธ๋ฆฌ (0) | 2022.03.25 |
[04. ๋ถ๋ฅ] LightGBM, ์คํํน ์์๋ธ, Catboost (0) | 2022.03.20 |
[01,02] ๋จธ์ ๋ฌ๋ ๊ฐ์ (0) | 2022.03.13 |
๋๊ธ