Machine Learning/Case Study ๐ฉ๐ป๐ป
[๐ฆ ๊ฒ ๋์ด ์์ธก(2)] Baseline Modeling(Gradient Boosting)
ISLA!
2023. 9. 24. 22:19
๐ Gradient Boosting ์ด๋?
- ๋จธ์ ๋ฌ๋์์ ์ฌ์ฉ๋๋ ๊ฐ๋ ฅํ ์์๋ธ ํ์ต ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋๋ก, ํ๊ท & ๋ถ๋ฅ ๋ฌธ์ ๋ชจ๋ ์ ์ฉ ๊ฐ๋ฅํ๋ฉฐ ๋์ ์์ธก ์ฑ๋ฅ์ ์ ๊ณต
- ์์๋ธ ํ์ต : ์ฌ๋ฌ ๊ฐ์ ์ฝํ ๋ชจ๋ธ์ ๊ฒฐํฉํ์ฌ ํ๋์ ๊ฐ๋ ฅํ ๋ชจ๋ธ์ ๋ง๋๋ ๊ธฐ๋ฒ
- ๋ถ์คํ : ๋ถ์คํ (์ด์ ๋ชจ๋ธ์ ์ค๋ฅ๋ฅผ ๋ณด์ํ๋ ์๋ก์ด ๋ชจ๋ธ์ ํ์ตํ๋ ๋ฐฉ์์ผ๋ก ์๋) ๊ธฐ๋ฒ ์ค ํ๋๋ก, ์์ฐจ์ ์ผ๋ก ๋ชจ๋ธ์ ์ถ๊ฐํ๋ฉฐ ์ด์ ๋ชจ๋ธ์ด ์๋ชป ์์ธกํ ์ํ์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ์ฌ ๋ชจ๋ธ์ ์ค๋ฅ๋ฅผ ๋ณด์ํจ
- ๊ทธ๋ผ๋์ธํธ : ๊ทธ๋ผ๋์ธํธ(๊ธฐ์ธ๊ธฐ)๋ฅผ ํ์ฉํ์ฌ ๋ชจ๋ธ ํ์ต. ์์ค ํจ์(MSE, MAE ๋ฑ)์ ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ณ์ฐํ์ฌ ์ด์ ๋ชจ๋ธ์ด ์์ธก์ ์๋ชปํ ์ํ์ ๋ ํฐ ๊ฐ์ค์น๋ฅผ ์ฃผ๊ณ , ์ด๋ฅผ ๋ชจ์ ํ๋ ์๋ก์ด ๋ชจ๋ธ์ ํ์ตํจ
- ๋ชจ๋ธ์ ๊ฒฐํฉ : ์ฝํ ํ์ต์(๋ชจ๋ธ)์ ์์ธก์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ์ฌ ์ค์ ๋ชจ๋ธ์ ์์ธก์ ๋์ ๊ฐ์ค์น๋ฅผ ์ฃผ๊ณ , ๋ ์ค์ํ ๋ชจ๋ธ์ ์์ธก์๋ ๋ฎ์ ๊ฐ์ค์น๋ฅผ ์ค
LabelEncoding (์ฑ๋ณ ๋ผ๋ฒจ ์ธ์ฝ๋ฉ)
- Sex ์ปฌ๋ผ ๊ฐ์ธ I, M, F ์ ๋ํด ๋ผ๋ฒจ์ธ์ฝ๋ฉ ์งํ
- 0, 1, 2์ ๊ฐ์ผ๋ก ๊ฒฐ๊ณผ ๋์ค๋ ๊ฒ ํ์ธ ํ
- Test ๋ฐ์ดํฐ๋ ๋์ผํ๊ฒ ์งํํ๋ train ๋ฐ์ดํฐ์ ์์ fit ํ ๋ผ๋ฒจ์ธ์ฝ๋๋ก transform ํ๋ ๊ฒ์ ์ ์ํ๋ค
le = LabelEncoder()
train['generated'] = 1
original['generated'] = 0
test['generated'] = 1
train.drop(columns = 'id', axis = 1, inplace = True)
train = pd.concat([train, original], axis = 0).reset_index(drop = True)
train['Sex'] = le.fit_transform(train['Sex'])
train.head()
- X, Y ๋ณ์ ๋ถ๋ฆฌ
X = train.drop(columns = 'Age', axis = 1)
Y = train['Age']
- test ๋ฐ์ดํฐ ๋ผ๋ฒจ ์ธ์ฝ๋ฉ
test_baseline = test.drop(columns = ['id'], axis = 1)
test_baseline['Sex'] = le.transform(test_baseline['Sex'])
K-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ & Gradient Boosting (๋ฒ ์ด์ค ์ฝ๋ ์์ฑ)
- K-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ์ ์ฌ์ฉํ์ฌ Gradient Boosting ํ๊ท ๋ชจ๋ธ์ ์ฌ๋ฌ๋ฒ ํ์ตํ๊ณ ํ๊ฐํ๋ ์์ ์ ์ํ
- skf = KFold(n_splits=10, random_state=42, shuffle=True)
- 10๊ฐ์ ํด๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋๋
- ๋ฌด์์ ์๋๋ฅผ ์ค์ ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ฌํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ฆ
- ๊ฐ ํด๋์ ๋ฐ์ดํฐ๋ฅผ ์์ ๊ฒ์ธ์ง ์ฌ๋ถ(True = ๋ฐ์ดํฐ๊ฐ ๋ฌด์์๋ก ์์)
- K-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ์ ๋ฐ๋ณต
- skf.split(X, Y) : ๋ฐ์ดํฐ๋ฅผ ๋๋๊ณ ํ๋ จ ๋ฐ ํ ์คํธ ์ธ๋ฑ์ค๋ฅผ ์์ฑ
- enumerate ํจ์๋ก ๋ฐ๋ณต ๋ฒํธ i ์ ํ๋ จ ๋ฐ ํ ์คํธ ์ธ๋ฑ์ค train_ix, test_ix ๋ฅผ ์ป์
- ํ์ฌ ํด๋(i๋ฒ์งธ) ์ ๋ํ ํ๋ จ ๋ฐ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถ
- Gradient Boosting ๋ชจ๋ธ ์ค์ ๋ฐ ํ์ต
- gb_md ์ ์ค์ ํ๊ณ ํน์ ๋งค๊ฐ๋ณ์๋ก ์ด๊ธฐํ ํจ
- gb_md.fit(X_train, Y_train)์ผ๋ก ๋ชจ๋ธ ํ์ต
- ํ ์คํธ ๋ฐ์ดํฐ๋ก ์์ธก ๋ฐ ํ๊ฐ : gb_pred_1 ๊ณผ gb_pred_2 ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ ๋ฐ์ดํฐ์ ๋ํ ์์ธก ์์ฑ
- gb_score_fold ๋ก ํ์ฌ ํด๋์์ ๋ชจ๋ธ ์ฑ๋ฅ์ ๋ํ๋ด๋ ํ๊ท ์ ๋ ์ค์ฐจ(MAE)๋ฅผ ๊ณ์ฐ
- gb_preds ๋ฆฌ์คํธ์ gb_score_fold ๊ฐ ์ ์ฅ
- ๊ฒฐ๊ณผ ์ถ๋ ฅ : ๊ฐ ํด๋๋ง๋ค Gradient Boosting ๋ชจ๋ธ์ ์ฑ๋ฅ๊ณผ ํ์ฌ ํด๋ ๋ฒํธ๋ฅผ ์ถ๋ ฅ
# ํ๊ฐ ์งํ๋ฅผ ๋น ๋ฆฌ์คํธ ๊ฐ์ผ๋ก ์์ฑ
gb_cv_scores, gb_preds = list(), list()
# kํด๋ + gradient Boosting ์งํ
skf = KFold(n_splits = 10, random_state = 42, shuffle = True)
for i, (train_ix, test_ix) in enumerate(skf.split(X, Y)):
X_train, X_test = X.iloc[train_ix], X.iloc[test_ix]
Y_train, Y_test = Y.iloc[train_ix], Y.iloc[test_ix]
print(f'----------------------------------------------------------------')
#Gradient Boosting
gb_md = GradientBoostingRegressor(loss = 'absolute_error',
n_estimators = 100,
max_depth = 8,
learning_rate = 0.01,
min_samples_split = 10,
min_samples_leaf = 20)
gb_md.fit(X_train, Y_train)
gb_pred_1 = gb_md.predict(X_test[X_test['generated'] == 1])
gb_pred_2 = gb_md.predict(test_baseline)
gb_score_fold = mean_absolute_error(Y_test[X_test['generated'] == 1], gb_pred_1)
gb_preds.append(gb_score_fold)
gb_preds.append(gb_pred_2)
print('Fold', i, '-->> GradientBoosting of MAE is ---->>', gb_score_fold)
728x90