๐ ํ๊ท ์์ธก์ ์ํ ๋ชจ๋ธ ์ ์ : LightGBM
- ์ด๋ก ์ ์ผ๋ก ์ ์ ๋ฐ์ดํฐ ์ (ํต์ ํ ๊ฐ์ 10,000๊ฐ ์ดํ)์ ๋ํ ๊ณผ์ ํฉ ์ฐ๋ ค๊ฐ ์๋ ๋ชจ๋ธ์ด์ง๋ง, ํ์ฌ ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์๋ ์ธ๊ธฐ์๋ ๋ชจ๋ธ์ด๊ธฐ๋ ํ๋ฉฐ ์ฑ๋ฅ์ด ๋ฐ์ด๋ LightGBM์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑํ
- ์ดํ, ๊ฐ๋ฅํ๋ฉด ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ์ฌ ์์ธก ์ฑ๋ฅ์ ๋น๊ตํด ๋ณผ ์์
โถ๏ธ LightGBM์ ํ์ดํผ ํ๋ผ๋ฏธํฐ ์ ํ
- Gradient Boosting ํ๋ ์์ํฌ๋ก ํธ๋ฆฌ ๊ธฐ๋ฐ ํ์ต ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ๊ฒฐ์ ํธ๋ฆฌ ๋ชจ๋ธ๊ณผ ๊ฐ๋ ์ด ์ด์ด์ง๋ ํ์ดํผ ํ๋ผ๋ฏธํฐ๋ค์ด ๋ค์ ์กด์ฌํ๋ค
- ๋ชจ๋ธ ์ต์ ํ๋ฅผ ์ํด ์ฃผ์ ํ์ดํผ ํ๋ผ๋ฏธํฐ๋ฅผ ํ์, ์ ์ ํ๊ธฐ๋ก ํ๋ค (โ ๋ ๊ฒ์ด ์ ์ ์ฑํ๋ ํ์ดํผ ํ๋ผ๋ฏธํฐ!)
- ์ ์ ๋ ํ์ดํผ ํ๋ผ๋ฏธํฐ๋ RandomSearchCV๋ฅผ ์ด์ฉํด, ์ต์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋์ถํ ๊ฒ์ด๋ค
โ max_depth | tree์ ์ต๋ ๊น์ด๋ก, ๊ฐ์ฅ ๋จผ์ ํ๋ํด์ผํ ํ์ดํผ ํ๋ผ๋ฏธํฐ | * ๊ณผ์ ํฉ ์กฐ์ * ๊ฐ์ง์น๊ธฐ ํจ * ๋ณดํต 3~12์ ๊ฐ ์ฌ์ฉ |
min_data_in_leaf | Leaf๊ฐ ๊ฐ์ง๊ณ ์๋ ์ต์ํ์ ๋ ์ฝ๋ ์ | * ๊ณผ์ ํฉ ์กฐ์ * ๋ํดํธ = 20 |
feature_fraction | Tree๋ฅผ ๋ง๋ค ๋, ๊ฐ iteration ๋ฐ๋ณต์์ ํ๋ผ๋ฏธํฐ ์ค (80%) ๋ฅผ ๋๋คํ๊ฒ ์ ํ | Boosting์ด ๋๋ค ํฌ๋ ์คํธ์ผ ๊ฒฝ์ฐ, (0.8) |
bagging_fraction | ๋งค๋ฒ iteration์ ๋๋ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ์ผ๋ถ๋ฅผ ์ ํํ๋๋ฐ ํธ๋ ์ด๋ ์๋๋ฅผ ๋์ด๊ณ ๊ณผ์ ํฉ ๋ฐฉ์งํ ๋ ์ฃผ๋ก ์ฌ์ฉ | |
early_stopping_round | ๋ชจ๋ธ์ ์ด๋ค validation ๋ฐ์ดํฐ ์ค ํ๋์ ์งํ๊ฐ early_stopping_round์์ ํฅ์๋์ง ์์ผ๋ฉด ํ์ต์ ์ค๋จ | * ์ง๋์น iteration์ ์ค์ด๋๋ฐ ๋์์ด ๋จ * ์๋ ํฅ์์ ๋์์ด ๋จ. |
min_gain_to_split | ๋ถ๊ธฐํ๊ธฐ ์ํด ํ์ํ ์ต์ gain ์ผ๋ก tree์์ ๋ถ๊ธฐ์ ์๋ฅผ ์กฐ์ ํ ๋ ์ฌ์ฉ | |
โ num_leaves | ||
โ learning_rate | ||
โ num_iterations (์ฌ์ดํท๋ฐ : n_estimators) |
* number of iterations : ๋ถ์คํ
์ดํฐ๋ ์ด์
์๋ก, ๋ชจ๋ธ ์ฑ๋ฅ๊ณผ ํ์ต์๊ฐ, ๋จ ์ฌ์ฉ๋์ ์ํฅ์ ์ค * ํฐ ๊ฐ์ ๋ฃ์ ํ, early stopping ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒ |
* early stopping ์์ด ์ด ๊ฐ์ ํฌ๊ฒ ๋ฃ์ผ๋ฉด ๊ณผ๋ ์ ํฉ ์ํ * ๋ณดํต 50 ์ ๋์ ๊ฐ์ ์ฌ์ฉ |
โ early_stopping_rounds |
โถ๏ธ Modeling Baseline Code ์์ฑ (ํฅํ ์์ ๋ฐ ๋ฐ์ ์์ !)
- k-Fold ๊ต์ฐจ ๊ฒ์ฆ์ ์ํ
- RandomSearchCV๋ฅผ ํตํ ์ต์ ์ ํ์ดํผ ํ๋ผ๋ฏธํฐ ํ์
- LightGBM์ ์ด์ฉํด ์์ธก ๋ชจ๋ธ๋ง
- ์์ธก ์ฑ๋ฅ ํ๊ฐ ์งํ๋ RMSE, MSE ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ธ
X = data[['์ ํฌ์', '์๊ฐ๋1',
'์๊ฐ๋2', '์๊ฐ๋3', '์๊ฐ๋4', '์๊ฐ๋5', '๋ถ๊ธฐ_1', '๋ถ๊ธฐ_2', '๋ถ๊ธฐ_3', '์ด ์์ฃผ์ธ๊ตฌ ์',
'์ด ๊ฐ๊ตฌ ์', '์ด_์ง์ฅ์ธ๊ตฌ_์', '์ํํธ_๋จ์ง_์', '์ํํธ_๊ฐ๊ฒฉ_1_์ต_๋ฏธ๋ง_์ธ๋_์',
'์ํํธ_๊ฐ๊ฒฉ_1_์ต_์ธ๋_์', '์ํํธ_๊ฐ๊ฒฉ_2_์ต_์ธ๋_์', '์ํํธ_๊ฐ๊ฒฉ_3_์ต_์ธ๋_์',
'์ํํธ_๊ฐ๊ฒฉ_4_์ต_์ธ๋_์', '์ํํธ_๊ฐ๊ฒฉ_5_์ต_์ธ๋_์', '์ํํธ_๊ฐ๊ฒฉ_6_์ต_์ด์_์ธ๋_์', '์ด_์ํ์ธ๊ตฌ_์',
'์๊ฐ๋_์ํ์ธ๊ตฌ_์', '์์์ผ_์ํ์ธ๊ตฌ_์', 'ํ์์ผ_์ํ์ธ๊ตฌ_์', '์์์ผ_์ํ์ธ๊ตฌ_์', '๋ชฉ์์ผ_์ํ์ธ๊ตฌ_์',
'๊ธ์์ผ_์ํ์ธ๊ตฌ_์', 'ํ ์์ผ_์ํ์ธ๊ตฌ_์', '์ผ์์ผ_์ํ์ธ๊ตฌ_์', '์ง๊ฐ์์ค_์', '๊ด๊ณต์_์', '์ํ_์',
'๋ฐฑํ์ _์', '์๋ฐ_์์ค_์', 'area', '์ฐ๋ น๋_10_์ํ์ธ๊ตฌ_์', '์ฐ๋ น๋_20_์ํ์ธ๊ตฌ_์',
'์ฐ๋ น๋_30_์ํ์ธ๊ตฌ_์', '์ฐ๋ น๋_40_์ํ์ธ๊ตฌ_์', '์ฐ๋ น๋_50_์ํ์ธ๊ตฌ_์', '์ฐ๋ น๋_60_์ด์_์ํ์ธ๊ตฌ_์',
'๋ฐฐํ์ง_์ํํธ_๋จ์ง_์', '๋ฐฐํ์ง_์ํํธ_๊ฐ๊ฒฉ_1_์ต_๋ฏธ๋ง_์ธ๋_์', '๋ฐฐํ์ง_์ํํธ_๊ฐ๊ฒฉ_1_์ต_์ธ๋_์',
'๋ฐฐํ์ง_์ํํธ_๊ฐ๊ฒฉ_2_์ต_์ธ๋_์', '๋ฐฐํ์ง_์ํํธ_๊ฐ๊ฒฉ_3_์ต_์ธ๋_์', '๋ฐฐํ์ง_์ํํธ_๊ฐ๊ฒฉ_4_์ต_์ธ๋_์',
'๋ฐฐํ์ง_์ํํธ_๊ฐ๊ฒฉ_5_์ต_์ธ๋_์', '๋ฐฐํ์ง_์ํํธ_๊ฐ๊ฒฉ_6_์ต_์ด์_์ธ๋_์', '์๊ฐ๋_๋ฒ์ค_์นํ์ฐจ์น๊ฐ์',
'์๊ฐ๋_์งํ์ฒ _์นํ์ฐจ์น๊ฐ์', '๋ฒ์ค์ ๋ฅ์ฅ_์', '์งํ์ฒ ์ญ_์']]
y = data['๋งค์ถ']
# k-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ
num_folds = 5
kf = KFold(n_splits= num_folds, shuffle=True, random_state=42)
# LightGBM ๋ชจ๋ธ ์ด๊ธฐํ
params = {
'boosting_type': 'gbdt',
'objective': 'regression',
'metric': 'rmse',
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.9
}
# ํน์ฑ ์ค์๋ ๋ฆฌ์คํธ ์ด๊ธฐํ
feature_importance_list = []
# ๊ฒฐ๊ณผ ์ค์ฝ์ด
rmse_scores = [] # RMSE ์ค์ฝ์ด๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ
mae_scores = [] # MAE ์ค์ฝ์ด๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ
best_params_list = [] # ๊ฐ fold์์์ ์ต์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ
# ๋ฐ์ดํฐ ๋ถํ
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# ํ๋ผ๋ฏธํฐ ๋ฒ์ ์ค์ (๋๋ค ์์น์ฉ)
param_dist = {
'objective': ['regression'],
'metric': ['mse'],
'num_leaves': list(range(7, 64)), # 7๋ถํฐ 63๊น์ง
'learning_rate': [0.01, 0.02, 0.03, 0.04, 0.05], #0.01๋ถํฐ 0.05๊น์ง
'n_estimators': list(range(200, 301)), # 200๋ถํฐ 300๊น์ง
'early_stopping_rounds': list(range(40, 51)) # 40๋ถํฐ 50๊น์ง
}
# K-Fold ๊ต์ฐจ ๊ฒ์ฆ ์ํ
for train_index, val_index in kf.split(X_train):
X_train_kf, X_val_kf = X.iloc[train_index], X.iloc[val_index]
y_train_kf, y_val_kf = y.iloc[train_index], y.iloc[val_index]
# ๋ฐ์ดํฐ์
train_data = lgb.Dataset(X_train_kf, label=y_train_kf)
val_data = lgb.Dataset(X_val_kf, label=y_val_kf, reference=train_data)
# ๋๋ค ์์น๋ฅผ ์ฌ์ฉํ LightGBM ๋ชจ๋ธ ํ๋
random_search = RandomizedSearchCV(
lgb.LGBMRegressor(),
param_distributions=param_dist,
n_iter=10,
scoring='neg_mean_squared_error',
cv=kf,
random_state=42,
n_jobs=-1,
verbose=1
)
evals = [(X_train_kf, y_train_kf),(X_val_kf, y_val_kf)]
random_search.fit(X_train_kf, y_train_kf, eval_set = evals, eval_metric='rmse')
best_params = random_search.best_params_
bst = lgb.LGBMRegressor(**best_params)
bst.fit(X_train_kf, y_train_kf,
eval_set=evals,
eval_metric='rmse',
verbose=False)
# ๋ชจ๋ธ ํ๊ฐ (RMSE)
y_pred = bst.predict(X_val_kf)
mse = mean_squared_error(y_val_kf, y_pred)
rmse = np.sqrt(mean_squared_error(y_val_kf, y_pred))
mae = mean_absolute_error(y_val_kf, y_pred)
rmse_scores.append(rmse)
mae_scores.append(mae)
best_params_list.append(best_params)
# ๊ต์ฐจ ๊ฒ์ฆ ๊ฒฐ๊ณผ ์ถ๋ ฅ
mean_rmse = np.mean(rmse_scores)
mean_mae = np.mean(mae_scores)
print(f'ํ๊ท RMSE: {mean_rmse}')
print(f'ํ๊ท MAE: {mean_mae}')
# K-fold ๊ต์ฐจ ๊ฒ์ฆ์์ ์ป์ ์ต์ ํ๋ผ๋ฏธํฐ ์ถ๋ ฅ
print("Best Hyperparameters for K-fold CV:")
for i, params in enumerate(best_params_list):
print(f'Fold {i + 1}: {params}')
โถ๏ธ Issue 1
- ๋ชจ๋ธ๋ง ๊ฒฝํ์ด ๋ถ์กฑํด, ํ์ดํผ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ ํ๊ณ , ๊ทธ ๋ฒ์๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ์ด๋ ค์ ๋ค.
- ๋ค๊ฐ์ด ๊ณต์๋ฌธ์ ๋ฐ ๊ตฌ๊ธ๋ง์ ํตํด ์คํฐ๋๋ฅผ ํ์ฌ ํ์ดํผ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ํ๋ค.
- ์ด ์ธ, ๋ค์ํ ๋ธ๋ก๊ทธ์ chatGPT ๋ฑ์ ํ์ฉํ์ฌ ํ์ตํ๋ค
โถ๏ธ Issue 2
- ์์ Baseline Code ๋ฅผ ์ง๋๋ฐ ์๊พธ๋ง ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
- early stopping ํ๋ผ๋ฏธํฐ๋ ๋นผ๋์ ์ ์๋ ์ค์ํ ์์์๊ธฐ์, ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ํ ๋ฌธ์๋ฅผ ์ฐพ์ ์คํฐ๋ํ๋ค.
For early stopping, at least one dataset and eval metric is required for evaluation
- ๊ทธ ๊ฒฐ๊ณผ, eval_set ์ ๋ฌธ์ ๊ฐ ์์์ ํ์ธ
⇒ Kfold์ train_test_split์์ validation set ๊ตฌ์ฑ์์ ์๋ชป๋ ๋ถ๋ถ์ด ์๋์ง ์์ฌ - LightGBM์ ํ์ฉํ ๋ค์ํ ์ํ ์ฝ๋์ ํ์ด์ฌ ๋จธ์ ๋ฌ๋ ๊ต๊ณผ์์์ ํ์ต์ฉ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ๋ฉฐ model fit ๋ถ๋ถ์ ๊ฒํ
⇒ LGBM์ eval_set์ [(X_train, y_train),(X_valid, y_valid)] ๋ก ์ง์ ํด์ค์ผ ํจ์ ํ์ธ - ์ดํ, ๋ชจ๋ธ ํ์ต์ด ์์กฐ๋กญ๊ฒ ์งํ๋์๋ค.
728x90