07. LightGBM
๐ ๊ฐ์
๐ก LightGBM
- XGBoost ์ ์์ธก ์ฑ๋ฅ์ ๋น์ทํ์ง๋ง ํ์ต์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ํจ์ฌ ์ ์ผ๋ฉฐ ๋ค์ํ ๊ธฐ๋ฅ์ ๋ณด์ ํ๊ณ ์๋ค.
- ์นดํ ๊ณ ๋ฆฌํ ํผ์ฒ์ ์๋ ๋ณํ(์ํซ์ธ์ฝ๋ฉ์ ํ์ง ์์๋ ๋จ) ๊ณผ ์ต์ ๋ถํ ์ํ
- ๊ท ํ ํธ๋ฆฌ ๋ถํ ๋ฐฉ์์ด ์๋ ๋ฆฌํ ์ค์ฌ ํธ๋ฆฌ ๋ถํ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
- ๊ทธ๋ฌ๋ ์ ์ ๋ฐ์ดํฐ ์ธํธ (10,000๊ฑด ์ดํ) ์ ์ ์ฉํ ๊ฒฝ์ฐ ๊ณผ์ ํฉ์ด ๋ฐ์ํ๊ธฐ ์ฝ๋ค.
- ๋ฆฌํ์ค์ฌ ํธ๋ฆฌ ๋ถํ Leaf wise : ํธ๋ฆฌ์ ๊ท ํ์ ๋ง์ถ์ง ์๊ณ ์ต๋ ์์ค๊ฐ์ ๊ฐ์ง๋ ๋ฆฌํ๋ ธ๋๋ฅผ ์ง์์ ์ผ๋ก ๋ถํ ํ๋ค. ํ์ต์ ๋ฐ๋ณต์ ํตํด ๊ฒฐ๊ตญ ๊ท ํํธ๋ฆฌ ๋ถํ ๋ฐฉ์๋ณด๋ค ์์ธก ์ค๋ฅ ์์ค์ ์ต์ํํ ์ ์๊ฒ ๋๋ค.
๐ ํ์ดํผ ํ๋ผ๋ฏธํฐ
- LightGBM ์ XGBoost ์ ํ๋ผ๋ฏธํฐ๊ฐ ๋งค์ฐ ์ ์ฌํ์ง๋ง, ์ฃผ์ํ ์ ์ ๋ฆฌํ๋ ธ๋๊ฐ ๊ณ์ ๋ถํ ๋๋ฉฐ ํธ๋ฆฌ์ ๊น์ด๊ฐ ๊น์ด์ง๋ฏ๋ก max_depth ์ ๊ฐ์ ํ๋ผ๋ฏธํฐ ์ค์ ์ ์ ์ํด์ผ ํ๋ค.
- ์๋ ํ๋ผ๋ฏธํฐ๋ ํ์ด์ฌ ๋ํผ LightGBM
Parameter | ๋ด์ฉ |
num_iterations | ๋ํดํธ 100. ๋ฐ๋ณต์ํํ๋ ค๋ ํธ๋ฆฌ์ ๊ฐ์๋ฅผ ์ง์ . ํฌ๊ฒ ์ง์ ํ ์๋ก ์ฑ๋ฅ์ด ๋์์ง ์ ์์ผ๋ ๊ณผ์ ํฉ์ ์ฃผ์ํด์ผํ๋ค. (=n_estimators) |
learning_rate | ๋ํดํธ 0.1 ๋ก 0๊ณผ 1 ์ฌ์ด์ ๊ฐ์ ์ง์ ํ๋ฉฐ ๋ฐ๋ณต์ํํ ๋ ์ ๋ฐ์ดํธ ๋๋ ํ์ต๋ฅ ๊ฐ |
max_depth | ๋ํดํธ -1. 0๋ณด๋ค ์์ ๊ฐ์ ์ง์ ํ๋ฉด ๊น์ด์ ์ ํ์ด ์๋ค. ์ง๊ธ๊น์ง ์๊ฐํ Depth wise ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ LightGBM ์ Leaf wise ๊ธฐ๋ฐ์ด๋ฏ๋ก ๊น์ด๊ฐ ์๋์ ์ผ๋ก ๋ ๊น๋ค. |
boosting | * gbdt : ์ผ๋ฐ์ ์ธ ๊ทธ๋๋์ธํธ ๋ถ์คํ
๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ์์ฑ * rf : ๋๋คํฌ๋ ์คํธ ๋ฐฉ๋ฒ์ผ๋ก ํธ๋ฆฌ๋ฅผ ์์ฑ |
num_leaves | ๋ํดํธ 31. ํ๋์ ํธ๋ฆฌ๊ฐ ๊ฐ์ง ์ ์๋ ์ต๋ ๋ฆฌํ ๊ฐ์๋ก ๋ชจ๋ธ์ ๋ณต์ก๋๋ฅผ ์ ์ดํ๋ ์ฃผ์ ํ๋ผ๋ฏธํฐ์ด๋ค. ๊ฐ์๋ฅผ ๋์ด๋ฉด ์ ํ๋๊ฐ ๋์์ง๋, ํธ๋ฆฌ์ ๊น์ด๊ฐ ๊น์ด์ง๊ณ ๋ณต์ก๋๊ฐ ์ปค์ ธ ๊ณผ์ ํฉ ์ํฅ์ด ์ปค์ง๋ค. |
๐ ์ค์ต - ์์ค์ฝ์ ์ ๋ฐฉ์ ์์ธก
from lightgbm import LGBMClassifier
from lightgbm import LGBMClassifier
import pandas as pd
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
dataset = load_breast_cancer()
ftr = dataset.data
target = dataset.target
X_train,X_test,y_train,y_test = train_test_split(ftr, target, test_size=0.2, random_state=156)
lgbm_wrapper = LGBMClassifier(n_estimators = 400)
evals = [(X_test, y_test)]
lgbm_wrapper.fit(X_train, y_train, early_stopping_rounds = 100, eval_metric = 'logloss',
eval_set = evals, verbose = True)
preds = lgbm_wrapper.predict(X_test)
from sklearn.metrics import classification_report
print(classification_report(y_test, preds))
from lightgbm import plot_importance
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10,12))
plot_importance(lgbm_wrapper, ax = ax)
10. ์คํํน ์์๋ธ
๐ ๊ฐ์
- ๊ฐ๋ณ ์๊ณ ๋ฆฌ์ฆ์ด ์์ธกํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ๋ค์ ์ต์ข '๋ฉํ ๋ฐ์ดํฐ ์ธํธ' ๋ก ๋ง๋ค์ด, ๋ณ๋์ ML ์๊ณ ๋ฆฌ์ฆ (๋ฉํ ๋ชจ๋ธ์ด๋ผ ๋ถ๋ฅธ๋ค) ์ผ๋ก ์ต์ข ํ์ต์ ์ํํ๊ณ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ต์ข ์์ธก์ ์ํํ๋ ๋ฐฉ์
- ๊ฐ๋ณ์ ์ธ ์ฌ๋ฌ ์๊ณ ๋ฆฌ์ฆ์ ์๋ก ๊ฒฐํฉํด ์์ธก๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๋ค๋ ์ ์์ ๋ฐฐ๊น ๊ณผ ๋ถ์คํ ๋ฐฉ์๊ณผ ๊ณตํต์ ์ด ์์ผ๋, ๊ฐ๋ณ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์์ธกํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ ์์ธก์ ์ํํ๋ค๋ ๊ฒ์ด ํฐ ์ฐจ์ด์ ์ด๋ค.
๐ ๊ธฐ๋ณธ ์คํํน ๋ชจ๋ธ ์ค์ต
* ์์ค์ฝ์ ์ ๋ฐฉ์ ์์ ๋ฐ์ดํฐ ๋ก๋
import numpy as np
# ์คํํน ๋ชจ๋ธ์ ์ฌ์ฉํ ์๊ณ ๋ฆฌ์ฆ
from sklearn.neighbors import KNeighborsClassifier # KNN
from sklearn.ensemble import RandomForestClassifier # ๋๋คํฌ๋ ์คํธ
from sklearn.ensemble import AdaBoostClassifier # ๋ถ์คํ
from sklearn.tree import DecisionTreeClassifier # ๊ฒฐ์ ํธ๋ฆฌ
from sklearn.linear_model import LogisticRegression # ๋ก์ง์คํฑ ํ๊ท (๋ฉํ๋ชจ๋ธ)
# ์์ค์ฝ์ ์ ๋ฐฉ์ ์์ ๋ฐ์ดํฐ ๋ก๋
# metrics๋ก accuracy๋ฅผ ์ฌ์ฉ
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
cancer_data = load_breast_cancer()
X_data = cancer_data.data
y_label = cancer_data.target
X_train, X_test, y_train, y_test = train_test_split(X_data, y_label, test_size=0.2)
๐ ๊ธฐ๋ฐ๋ชจ๋ธ๊ณผ ๋ฉํ ๋ชจ๋ธ ๊ฐ์ฒด ์์ฑ , ํ์ต , ์์ธก
# ๊ฐ๋ณ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ๊ฐ์ฒด ์์ฑ (๊ธฐ๋ฐ๋ชจ๋ธ)
knn_clf = KNeighborsClassifier(n_neighbors =4) # n_neighbors : ๋ถ๋ฅ์ ๊ณ ๋ คํ ์ธ์ ์ํ ์
rf_clf = RandomForestClassifier(n_estimators=100, random_state=30)
dt_clf = DecisionTreeClassifier()
ada_clf = AdaBoostClassifier(n_estimators=100)
# ๋ฉํ๋ชจ๋ธ (์คํํน์ผ๋ก ๋ง๋ค์ด์ง ๋ฐ์ดํฐ ํ์ต ๋ฐ ์์ธก)
lr_final = LogisticRegression(C=10) # C : ๊ณผ๋์ ํฉ/๊ณผ์์ ํฉ ๋ฌธ์ ํด๊ฒฐ์ ์ํ ํ๋ผ๋ฏธํฐ. ๊ฐ์ด ํฌ๋ฉด ํ๋ จ์ ๋ณต์กํ๊ฒ(์ฝํ๊ท์ )
# ๊ฐ๋ณ ๋ชจ๋ธ ํ์ต
knn_clf.fit(X_train, y_train)
rf_clf.fit(X_train, y_train)
dt_clf.fit(X_train, y_train)
ada_clf.fit(X_train, y_train)
# ๊ธฐ๋ฐ ๋ชจ๋ธ ์์ธก ์ธํธ์ ์ ํ๋ ํ์ธ
knn_pred = knn_clf.predict(X_test)
rf_pred = rf_clf.predict(X_test)
dt_pred = dt_clf.predict(X_test)
ada_pred = ada_clf.predict(X_test)
print('KNN ์ ํ๋ :',accuracy_score(y_test, knn_pred))
print('RF ์ ํ๋ :',accuracy_score(y_test, rf_pred))
print('DT ์ ํ๋ :',accuracy_score(y_test, dt_pred))
print('ADA๋ถ์คํธ ์ ํ๋ :',accuracy_score(y_test, ada_pred))
๐ ๊ธฐ๋ฐ ๋ชจ๋ธ์ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ์คํํน
# ๊ธฐ๋ฐ ๋ชจ๋ธ์ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ์คํํน
stacked_pred = np.array([knn_pred, rf_pred, dt_pred, ada_pred])
# transpose ๋ฅผ ์ด์ฉํ์ฌ ํ๊ณผ ์ด์ ์์น๋ฅผ ๊ตํ
# ์นผ๋ผ ๋ ๋ฒจ๋ก ๊ฐ ๋ชจ๋ธ์ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ํผ์ฒ๋ก ์ฌ์ฉ
stacked_pred = np.transpose(stacked_pred)
stacked_pred.shape # 4 : ๋ชจ๋ธ์ ๊ฐ์ , 114 : ๋ฐ์ดํฐ ๊ฐ์
# (114,4)
๐ ๋ฉํ๋ชจ๋ธ์ ํ์ต , ์ต์ข ์ ํ๋ ๋์ถ
# ๋ฉํ๋ชจ๋ธ์ ๊ธฐ๋ฐ๋ชจ๋ธ์ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ต
lr_final.fit(stacked_pred, y_test)
final_pred = lr_final.predict(stacked_pred)
print('์ต์ข
๋ฉํ ๋ชจ๋ธ์ ์ ํ๋ : ', accuracy_score(y_test, final_pred))
# ์ต์ข
๋ฉํ ๋ชจ๋ธ์ ์ ํ๋ : 0.9912280701754386
๐ CV ์ธํธ ๊ธฐ๋ฐ ์คํํน
(์ฐธ๊ณ )
- ์์ ๊ธฐ๋ณธ ์คํํน ๋ชจ๋ธ์ ์ฌ์ฉ๋ ๋ฉํ ๋ชจ๋ธ์ธ ๋ก์ง์คํฑ ํ๊ท ๋ชจ๋ธ์์ ๊ฒฐ๊ตญ y_test(ํ ์คํธ ๋ฐ์ดํฐ)๋ฅผ ํ์ตํ๊ธฐ ๋๋ฌธ์ ๊ณผ์ ํฉ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๊ณผ์ ํฉ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ต์ข ๋ฉํ๋ชจ๋ธ์ ์ํ ๋ฐ์ดํฐ์ธํธ๋ฅผ ๋ง๋ค ๋, ๊ต์ฐจ ๊ฒ์ฆ ๊ธฐ๋ฐ์ผ๋ก ์์ธก๋ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
โญ ๊ฐ๋ณ ๋ชจ๋ธ์ด ๊ต์ฐจ ๊ฒ์ฆ์ ํตํด์ ๋ฉํ ๋ชจ๋ธ์ ์ฌ์ฉ๋๋ ํ์ต, ํ ์คํธ์ฉ ์คํํน ๋ฐ์ดํฐ์ ์ ์์ฑํ์ฌ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฉํ ๋ชจ๋ธ์ด ํ์ต๊ณผ ์์ธก์ ์ํํ๋ ๋ฐฉ์!
1. ํ๋ จ set ๋ฅผ N ๊ฐ์ fold ๋ก ๋๋๋ค. (3๊ฐ๋ผ๊ณ ๊ฐ์ )
2. 2๊ฐ์ fold ๋ฅผ ํ์ต์ ์ํ ๋ฐ์ดํฐ๋ก, 1๊ฐ์ fold ๋ฅผ ๊ฒ์ฆ์ ์ํ ๋ฐ์ดํฐ๋ก ์ฌ์ฉ
3. 2๊ฐ ํด๋๋ฅผ ์ด์ฉํด ๊ฐ๋ณ ๋ชจ๋ธ์ ํ์ต, 1๊ฐ์ ๊ฒ์ฆ์ฉ fold ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ธกํ ํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅ
4. 3๋ฒ ๋จ๊ณ๋ฅผ 3๋ฒ ๋ฐ๋ณต (๊ฒ์ฆ์ฉ ํด๋๋ฅผ ๋ณ๊ฒฝํด๊ฐ๋ฉด์) , ์ดํ test set ์ ๋ํ ์์ธก์ ํ๊ท ์ผ๋ก ์ต์ข ๊ฒฐ๊ณผ๊ฐ ์์ฑ
4. 4๋ฒ์์ ์์ฑ๋ ์ต์ข ์์ธก ๊ฒฐ๊ณผ๋ฅผ ๋ฉํ ๋ชจ๋ธ์ ํ์ต ๋ฐ ์์ธก ์ํ
๐ train meta data ์ test meta data ๊ฐ ๋ง๋ค์ด์ง๋ค๋ ๊ฒ์ด ํต์ฌ!
* ์์ค์ฝ์ ์ ๋ฐฉ์ ์์ ๋ฐ์ดํฐ
๐ ๋ฉํ ๋ฐ์ดํฐ ์์ฑ
from sklearn.model_selection import KFold
from sklearn.metrics import mean_absolute_error
# ๊ฐ๋ณ ๋ชจ๋ธ๋ณ ๋ฉํ ๋ฐ์ดํฐ
def get_stacking_base_datasets(model, X_train, y_train, X_test, n_folds):
# KFold ์์ฑ
kf = KFold(n_splits=n_folds, shuffle=True, random_state=0)
# ๋ฉํ ๋ฐ์ดํฐ ๋ฐํ์ ์ํ ๊ธฐ๋ณธ ๋ฐฐ์ด
train_cnt = X_train.shape[0]
test_cnt = X_test.shape[0]
train_meta = np.zeros((train_cnt, 1))
test_meta = np.zeros((test_cnt, n_folds))
print(model.__class__.__name__ , ' model ์์ ')
# train ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก fold๋ฅผ ๋๋ ํ์ต/์์ธก
for i , (train_fold_idx, test_fold_index) in enumerate(kf.split(X_train)):
# train, test fold ์์ฑ
print(f'\t ํด๋ ์ธํธ: {i+1} ์์ ')
x_train_fold = X_train[train_fold_idx]
y_train_fold = y_train[train_fold_idx]
x_test_fold = X_train[test_fold_index]
# train_fold๋ก ํ์ต
model.fit(x_train_fold , y_train_fold)
# train ๋ฉํ ๋ฐ์ดํฐ ์์ฑ (x_test_fold ์์ธก)
train_meta[test_fold_index, :] = model.predict(x_test_fold).reshape(-1,1)
# test ๋ฉํ ๋ฐ์ดํฐ ์์ฑ (x_test ์์ธก) - ํ๊ท ์
test_meta[:, i] = model.predict(X_test)
# test ๋ฉํ ๋ฐ์ดํฐ ์์ฑ - ํ๊ท ์งํ
test_meta_mean = np.mean(test_meta, axis=1).reshape(-1,1)
# train test ๋ฉํ ๋ฐ์ดํฐ ๋ฐํ
return train_meta , test_meta_mean
๐ ํ๋ จ
knn_train, knn_test = get_stacking_base_datasets(knn_clf, X_train, y_train, X_test, 7) # knn
rf_train, rf_test = get_stacking_base_datasets(rf_clf, X_train, y_train, X_test, 7) # ๋๋คํฌ๋ ์คํธ
dt_train, dt_test = get_stacking_base_datasets(dt_clf, X_train, y_train, X_test, 7) # ๊ฒฐ์ ํธ๋ฆฌ
ada_train, ada_test = get_stacking_base_datasets(ada_clf, X_train, y_train, X_test, 7) # ์์ด๋ค๋ถ์คํธ
๐ ๋ชจ๋ธ๋ณ ํ์ต, ํ ์คํธ ๋ฐ์ดํฐ ํฉ์น๊ธฐ
Stack_final_X_train = np.concatenate((knn_train, rf_train, dt_train, ada_train), axis=1)
Stack_final_X_test = np.concatenate((knn_test, rf_test, dt_test, ada_test), axis=1)
print('์๋ณธ ํ์ต ํผ์ฒ ๋ฐ์ดํฐ shape', X_train.shape, '์๋ณธ ํ
์คํธ ํผ์ฒ ๋ฐ์ดํฐ shape', X_test.shape)
print('์คํํน ํ์ต ํผ์ฒ ๋ฐ์ดํฐ shape:', Stack_final_X_train.shape, '์คํํน ํ
์คํธ ํผ์ฒ ๋ฐ์ดํฐ shape : ', Stack_final_X_test.shape)
๐ ์์ธก ์ํ
lr_final.fit(Stack_final_X_train, y_train)
stack_final = lr_final.predict(Stack_final_X_test)
print('์ต์ข
๋ฉํ ๋ชจ๋ธ์ ์์ธก ์ ํ๋ : ', accuracy_score(y_test, stack_final))
# ์ต์ข
๋ฉํ ๋ชจ๋ธ์ ์์ธก ์ ํ๋ : 0.9736842105263158
catboost
๐ ๊ฐ์
๐ก Boosting ์ ๊ธฐ๋ณธ ์์ด๋์ด = Residual Boosting
- ์ค์ ๊ฐ๋ค์ ํ๊ท ๊ณผ ์ค์ ๊ฐ์ ์ฐจ์ด์ธ ์์ฐจ๋ฅผ ๊ตฌํ๋ค ๐ ์์ฐจ๋ฅผ ํ์ตํ๋ ๋ชจ๋ธ ์์ฑ ๐ ์์ธก ๐ ์์ธก ๊ฐ์ ํ์ต๋ฅ ์ ๊ณฑํด ๊ฐ์ ์ ๋ฐ์ดํธ ํ๋ค (๋ฐ๋ณต)
- bias ๋ฅผ ์๊ฒ ๋ง๋๋ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์ผ๋ ๋ถ์ฐ-ํธํฅ ํธ๋ ์ด๋ ์คํ ๊ด๊ณ์ ์ํด high variance ์ฆ ์ค๋ฒํผํ ์ด ๋ฐ์ํ ๊ฒฝ์ฐ๊ฐ ๋๋ค.
๐ก CatBoost
- ๊ฒฐ์ ํธ๋ฆฌ์์์ ๊ทธ๋๋์ธํธ ๋ถ์คํ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
- ๊ฒ์, ์ถ์ฒ์์คํ , ๋ ์จ ์์ธก ๋ฑ์ ์์ ์ ๋ง์ด ์ฌ์ฉ๋๋ค.
- ๋ฐ์ดํฐ์ ๋๋ถ๋ถ์ด ๋ฒ์ฃผํ ๋ณ์์ผ ๋ ์ข์ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
- Target leakage ๋ก ์ธํ ๊ณผ์ ํฉ์ ๋ง์์ค๋ค.
โ Target leakage : https://m.blog.naver.com/hongjg3229/221811766581
๋ณต์ต. GBM : ๊ฒฝ์ฌํ๊ฐ๋ฒ์ ํตํด ๊ฐ์ค์น๋ฅผ ์ ๋ฐ์ดํธ ํ๋ฉด์ ์ฌ๋ฌ ๊ฐ์ ์ฝํ ํ์ต๊ธฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ํ์ต-์์ธกํ๋ ์์๋ธ ํ์ต ๋ฐฉ์
- ๋์นญํธ๋ฆฌ ๊ตฌ์กฐ๋ ์์ธก ์๊ฐ์ ๊ฐ์์์ผ ํ์ต ์๋๋ฅผ ๋น ๋ฅด๊ฒ ๋ง๋ ๋ค.
๐ก ํน์ง
- GBM ์ ๋จ์ ์ธ ๊ณผ์ ํฉ ๋ฌธ์ ์ ํ์ต์๋ ๋ฌธ์ , ํ์ดํผ ํ๋ผ๋ฏธํฐ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ๋ฌ๋ผ์ง๋ ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ ์๊ณ ๋ฆฌ์ฆ
- ๋ฒ์ฃผํ ๋ณ์๋ฅผ ์ํซ์ธ์ฝ๋ฉ, label ์ธ์ฝ๋ฉ ๋ฑ ์ธ์ฝ๋ฉ ์์ ์ ํ์ง ์๊ณ ๊ทธ๋๋ก ๋ชจ๋ธ์ input ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
- ์์นํ ๋ณ์๊ฐ ๋ง์ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ํ์ต ์๋๊ฐ ๋๋ฆฌ๋ค. ๋ฒ์ฃผํ ๋ณ์๊ฐ ๋ง์ ๋ ์ ํฉํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- Level-wise tree : Feature ๋ฅผ ๋ชจ๋ ๋์ผํ๊ฒ ๋์นญ์ ์ธ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํ์ฑํ๊ฒ ๋๋ค ๐ ์์ธก ์๊ฐ์ ๊ฐ์์ํด
- Ordered boosting : ๊ธฐ์กด ๋ถ์คํ ๋ชจ๋ธ์ด ์ผ๊ด์ ์ผ๋ก ๋ชจ๋ ํ๋ จ ๋ฐ์ดํฐ๋ฅผ ๋์์ผ๋ก ์์ฐจ๋ฅผ ๊ณ์ฐํ๋ค๋ฉด, catboost ๋ ์ผ๋ถ๋ง ๊ฐ์ง๊ณ ๊ณ์ฐํ ๋ค, ๋ชจ๋ธ์ ๋ง๋ค๊ณ ๊ทธ ๋ค์ ๋ฐ์ดํฐ์ ์์ฐจ๋ ๋ชจ๋ธ๋ก ์์ธกํ ๊ฐ์ ์ฌ์ฉํ๋ค.
- Random Permutation : ordered boosting ์ ํ ๋ ๋ฐ์ดํฐ ์์๋ฅผ ์์ง ์์ผ๋ฉด ๋งค๋ฒ ๊ฐ์ ์์๋๋ก ์์ฐจ๋ฅผ ์์ธกํ๊ฒ ๋๋ฏ๋ก ์ด๋ฐ ๊ฒ์ ๊ฐ์ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ํ๋งํ์ฌ ๋ฝ์๋ธ๋ค ๐ ํธ๋ฆฌ๋ฅผ ๋ค๊ฐ์ ์ผ๋ก ๋ง๋ค์ด ์ค๋ฒํผํ ์ ๋ฐฉ์ง
- Orderd Target Encoding : ๋ฒ์ฃผํ ๋ณ์๋ฅผ ์์นํ์ผ๋ก ๋ณํํ ๋ ์์๋ก ์๊ณ์ด์ ์ธ (์์ฐจ์ ์ธ) ์์ด๋์ด๋ฅผ ์ ์ฉํด ์ธ์ฝ๋ฉ ํ๋ค. ์๋ฅผ๋ค์ด ์๋์ ํ์์ ๊ธ์์ผ์ ํด๋นํ๋ Cloudy ๋ฅผ ์ธ์ฝ๋ฉ ํ ๋ ์์ ์ป์ Tues, Wed ์ ํด๋นํ๋ Target ๊ฐ์ ํ๊ท ์ ์ด์ฉํ์ฌ ์ธ์ฝ๋ฉ ํ๋ค. (15+14)/2 = 14.5 ๋์ผํ๊ฒ ์ผ์์ผ์ ๋ํ Cloudy ๋ (15+14+20)/3 = 16.3 ์ด๋ ๊ฒ ๊ณ์ฐํ๋ค. ์ฆ, ๊ณผ๊ฑฐ์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ํ์ฌ์ ๋ฐ์ดํฐ๋ฅผ ์ธ์ฝ๋ฉ ํ๋ ์๋ฆฌ์ด๋ค. ์ด๋ ๊ฒ ํ๋ฉด data leakage ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
- Categorical Feature Combination : ์ ๋ณด๊ฐ ์ค๋ณต๋๋ ๋ฒ์ฃผํ ๋ณ์ ์ฒ๋ฆฌ. ์ ๋ณด๊ฐ ๋์ผํ ๋ feature ๋ฅผ ํ๋์ feature ๋ก ๋ฌถ์ด์ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ์ ์์ด feature selection ๋ถ๋ด์ ์ค์ธ๋ค.
- One-Hot Encoding : ๋ฒ์ฃผํ ๋ณ์๋ค ์ค ๊ฐ์ level ์๊ฐ ์ผ์ ๊ฐ์๋ณด๋ค ์์ผ๋ฉด ํด๋น ๋ฒ์ฃผํ์ ์ํซ์ธ์ฝ๋ฉ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํด์ค๋ค. ์ฆ ์ค๋ณต๋๊ฐ ๋์ ๋ฒ์ฃผํ ๋ณ์๋ค์๊ฒ ์ ์ฉํ๋ ๋ฐฉ์
- Optimized Parameter Tuning : ํ์ดํผ ํ๋ผ๋ฏธํฐ์ ์ํด ํฌ๊ฒ ์ฑ๋ฅ์ด ์ข์ฐ๋์ง ์๋๋ค.
- catboost ๋ ํ๋ผ๋ฏธํฐ ํ๋์ ํฌ๊ฒ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ค. ๋ถ์คํ ๋ชจ๋ธ๋ค์ ํ๋ผ๋ฏธํฐ ํ๋์ ์ด์ ๋ ํธ๋ฆฌ์ ๋คํ์ฑ๊ณผ ์ค๋ฒํผํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํจ์ธ๋ฐ, catboost ๋ ๋ด๋ถ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. ํด์ค๋ค๋ฉด learning_rate, random_strength, L2_regulariser ์ ๋
๐ก ํ๊ณ
- Sparse ํ ํ๋ ฌ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ค. (์ฆ, ๊ฒฐ์ธก์น๊ฐ ๋งค์ฐ ๋ง์ ๋ฐ์ดํฐ์ ์๋ ๋ถ์ ํฉํ ๋ชจ๋ธ์ด๋ค)
- ๋ฐ์ดํฐ ๋๋ถ๋ถ์ด ์์นํ ๋ณ์์ธ ๊ฒฝ์ฐ ํ์ต ์๋๊ฐ lightGBM ๋ณด๋ค ๋๋ฆฌ๋ค.
์ฐธ๊ณ ์๋ฃ
โ https://dailyheumsi.tistory.com/136
โ https://techblog-history-younghunjo1.tistory.com/199
โ https://www.kaggle.com/code/prashant111/catboost-classifier-in-python/notebook
'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. ๋ถ๋ฅ] GBM, XGboost (0) | 2022.03.14 |
[01,02] ๋จธ์ ๋ฌ๋ ๊ฐ์ (0) | 2022.03.13 |
๋๊ธ