๐ฎ ๋ฐ์ดํฐ๋ก ๋ฏธ๋๋ฅผ ์์ธกํ๋ ์์ ๊ตฌ์ฌ
๋ง์ฝ ์ฐ๋ฆฌ์๊ฒ ๋ฏธ๋๋ฅผ ์์ธกํ๋ ์์ ๊ตฌ์ฌ์ด ์๋ค๋ฉด ์ด๋จ๊น? ์ฃผ์ ๊ฐ๊ฒฉ, ๋ด๋ ๋ ๋งค์ถ, ํน์ ๋ถ๋์ฐ ์์ธ๊น์ง ์์ธกํ ์ ์๋ค๋ฉด ๋ง์ด๋ค. ๋จธ์ ๋ฌ๋์์ ํ๊ท(Regression) ๋ถ์์ด ๋ฐ๋ก ๊ทธ ์์ ๊ตฌ์ฌ๊ณผ ๊ฐ์ ์ญํ ์ ํ๋ค. ๊ณผ๊ฑฐ ๋ฐ์ดํฐ์ ํจํด์ ํ์ตํด ์ฐ์์ ์ธ ๋ฏธ๋ ๊ฐ์ ์์ธกํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด๋ค.
์ค๋์ ํ์ด์ฌ์ ์ด์ฉํด ์ด ํ๊ท ๋ถ์์ ์ธ๊ณ๋ฅผ ํํํด ๋ณด์๋ค. ๋จ์ํ ๊ฐ๋ ์ ๋ฆฌ๋ถํฐ ์์ํด, ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํ๊ฐํ๊ณ , ๋จ๊ณ๋ณ๋ก ๊ฐ์ ํด๋๊ฐ๋ฉฐ ์ต์ข ์ ์ผ๋ก AutoML์ ํตํด ์ต์ ์ ๋ชจ๋ธ์ ์ฐพ์๊ฐ๋ ์ฌ์ ์ ์์ํ๊ฒ ๋ด์๋ณด์๋ค.
โจ โํ๊ท๋ ์ ์ ๊ธ๋ ๊ฒ์ด ์๋๋ผ, ๋ฐ์ดํฐ์ ๋ชฉ์๋ฆฌ๋ฅผ ๋ฃ๋ ๊ณผ์ ์ด๋ค.โ
๋ชจ๋ธ์ ์ฑ๋ฅ์ ๋ํ๋ด๋ ์ซ์ ๋ค์ ์จ๊ฒจ์ง ์๋ฏธ๋ฅผ ์ดํดํ๊ณ , ๋ ๋์ ์์ธก์ ์ํด ๋ชจ๋ธ์ ๋ด๊ธ์งํ๋ ๊ณผ์ ์ด์ผ๋ง๋ก ํ๊ท ๋ถ์์ ์ง์ ํ ๋ฌ๋ฏธ๋ผ๊ณ ํ ์ ์๋ค.
๐ง ํ๊ท ๋ถ์, ํต์ฌ ๊ฐ๋ ํ๊ณ ๋ค๊ธฐ
ํ๊ท ๋ถ์์ ์ ๋๋ก ํ์ฉํ๋ ค๋ฉด ๋ช ๊ฐ์ง ํต์ฌ ๊ฐ๋ ๊ณผ ํ๊ฐ ์งํ๋ฅผ ์์์ผ ํ๋ค.
๊ตฌ๋ถ | ๋จ์ ์ ํ ํ๊ท | ๋ค์ค ์ ํ ํ๊ท |
---|---|---|
๊ฐ๋ | ํ๋์ ๋ ๋ฆฝ๋ณ์๋ก ์ข ์๋ณ์๋ฅผ ์์ธก | ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ๋ณ์๋ก ์ข ์๋ณ์๋ฅผ ์์ธก |
์์ | y = wx + b |
y = w1x1 + w2x2 + ... + b |
๋ชจ๋ธ์ ๋ง๋ค์๋ค๋ฉด, ๊ทธ ์ฑ๋ฅ์ ์ ๋๋ก ํ๊ฐํ๋ ๊ฒ์ด ์ค์ํ๋ค. ํ๊ท ๋ชจ๋ธ์์๋ ์ฃผ๋ก ์๋ ์งํ๋ค์ด ์ฌ์ฉ๋๋ค.
๐ ์ฃผ์ ํ๊ท ํ๊ฐ ์งํ
- Rยฒ (๊ฒฐ์ ๊ณ์): ๋ชจ๋ธ์ด ๋ฐ์ดํฐ๋ฅผ ์ผ๋ง๋ ์ ์ค๋ช ํ๋์ง๋ฅผ ๋ํ๋ด๋ ์งํ. 1์ ๊ฐ๊น์ธ์๋ก ์ข๋ค.
- MSE (ํ๊ท ์ ๊ณฑ ์ค์ฐจ): ์ค์ฐจ์ ์ ๊ณฑ์ ๋ํ ํ๊ท . ์์์๋ก ์ข๋ค.
- RMSE (ํ๊ท ์ ๊ณฑ๊ทผ ์ค์ฐจ): MSE์ ๋ฃจํธ๋ฅผ ์์ด ๊ฐ. ์ค์ ๊ฐ๊ณผ ์ ์ฌํ ๋จ์๋ฅผ ๊ฐ์ ธ ํด์์ด ์ฉ์ดํ๋ค.
- MAE (ํ๊ท ์ ๋ ์ค์ฐจ): ์ค์ฐจ์ ์ ๋๊ฐ์ ๋ํ ํ๊ท . ์ด์์น์ ๋ ๋ฏผ๊ฐํ๋ค.
์ด ์งํ๋ค์ ์ดํดํด์ผ ์ฐ๋ฆฌ ๋ชจ๋ธ์ด ์ผ๋ง๋ ๋๋ํ์ง, ํน์ ์ด๋๊ฐ ๋ถ์กฑํ์ง ์ ์ ์๋ค.
๐ ์บ๋ฆฌํฌ๋์ ์ฃผํ ๊ฐ๊ฒฉ ์์ธก ์ค์ต
์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๋ชจ๋ธ์ ๋ง๋ค์ด๋ณด์๋ค. 90๋ ๋ ์บ๋ฆฌํฌ๋์ ์ฃผํ ๊ฐ๊ฒฉ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด, ์ฌ๋ฌ ๊ธฐ๋ฒ์ผ๋ก ๋ชจ๋ธ ์ฑ๋ฅ์ ๊ฐ์ ํด๋๊ฐ๋ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ์งํํ๋ค.
1๋จ๊ณ: Baseline ๋ชจ๋ธ - ์ฒซ๊ฑธ์ ๋ผ๊ธฐ ๐ถ
์๋ฌด๋ฐ ์ ์ฒ๋ฆฌ ์์ด ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ LinearRegression
๋ชจ๋ธ์ ์ ์ฉํด ๋ณด์๋ค.
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import root_mean_squared_error
from sklearn.datasets import fetch_california_housing
import pandas as pd
# ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ๋ถํ
housing = fetch_california_housing()
X = pd.DataFrame(housing.data, columns=housing.feature_names)
y = pd.Series(housing.target, name='MedHouseVal')
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=121)
# ๋ชจ๋ธ ํ์ต ๋ฐ ํ๊ฐ
li_model = LinearRegression()
li_model.fit(X_train, y_train)
y_pred = li_model.predict(X_test)
print(f"R2 Score: {li_model.score(X_test, y_test)}")
print(f"RMSE: {root_mean_squared_error(y_test, y_pred)}")
๊ฒฐ๊ณผ: Rยฒ ์ ์๋
0.62
, RMSE๋0.70
์ด ๋์๋ค. ๋์์ง ์์ง๋ง, ๊ฐ์ ์ ์ฌ์ง๊ฐ ๋ง์ ๋ณด์๋ค. ๐ค
2๋จ๊ณ: Scaling & Feature Selection - ๋ชจ๋ธ ๋ค์ด์ดํธ ๐
๋ชจ๋ธ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด ์ค์ผ์ผ๋ง์ ์ ์ฉํ๊ณ , SequentialFeatureSelector
๋ก ์ค์ํ ํน์ฑ๋ง ๊ณจ๋ผ๋ด ๋ณด์๋ค. ํ์ง๋ง LinearRegression
๋ชจ๋ธ์์๋ ์ค์ผ์ผ๋ง ํจ๊ณผ๊ฐ ๋ฏธ๋ฏธํ๊ณ , ํน์ฑ์ ๋๋ฌด ์ ๊ฒ ์ ํํ๋ ์คํ๋ ค ์ฑ๋ฅ์ด ๋จ์ด์ก๋ค. ์คํจ ๐ญ
ํน์ฑ์ ๋ฌด์์ ์ค์ด๋ ๊ฒ์ด ๋ฅ์ฌ๋ ์๋๋ผ๋ ๊ตํ์ ์ป์๋ค. ๋ฐ์ดํฐ์ ํน์ฑ์ ์ดํดํ๋ ๊ฒ์ด ๋จผ์ ์๋ค.
3๋จ๊ณ: ๊ท์ ๋ชจ๋ธ (Ridge, Lasso) - ๊ณผ์ ํฉ ๋ฐฉ์งํฑ ๋๊ธฐ ๐ง
๋ชจ๋ธ์ด ํ๋ จ ๋ฐ์ดํฐ์๋ง ๊ณผํ๊ฒ ์ต์ ํ๋๋ ๊ณผ์ ํฉ์ ๋ง๊ธฐ ์ํด ๊ท์ ๊ฐ ์๋ Ridge, Lasso ๋ชจ๋ธ์ ์ฌ์ฉํ๋ค. RandomizedSearchCV
๋ก ์ต์ ์ alpha
๊ฐ์ ์ฐพ์ ์ ์ฉํ๋ค.
from sklearn.linear_model import Ridge, Lasso
from sklearn.model_selection import RandomizedSearchCV
from scipy import stats
param_dist = {"alpha": stats.reciprocal(1e-1, 1e1)}
# Ridge ๋ชจ๋ธ ์ต์ ํ
ridge = Ridge()
ri_model_search = RandomizedSearchCV(ridge, param_distributions=param_dist, n_iter=70, scoring="neg_root_mean_squared_error", cv=5, random_state=42)
ri_model_search.fit(X_train, y_train)
ri_model = ri_model_search.best_estimator_
y_pred_ridge = ri_model.predict(X_test)
print(f"Ridge RMSE: {root_mean_squared_error(y_test, y_pred_ridge)}")
๊ฒฐ๊ณผ: Ridge ๋ชจ๋ธ์ด Baseline๊ณผ ๋น์ทํ๊ฑฐ๋ ์ฝ๊ฐ ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์๋ค. ๊ท์ ๋ฅผ ํตํด ๋ชจ๋ธ์ด ๋ ์์ ํ๋ ๋๋์ด๋ค.
4๋จ๊ณ: AutoML - ์ต์ข ๋ณ๊ธฐ ๋ฑ์ฅ ๐ค
์๋ ํ๋์ ํ๊ณ๋ฅผ ๋์ด, PyCaret
๊ณผ Optuna
๊ฐ์ AutoML ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ์ต์ ์ ๋ชจ๋ธ๊ณผ ํ์ดํผํ๋ผ๋ฏธํฐ๋ฅผ ํ์ํ๋ค.
# PyCaret์ผ๋ก ์ฌ๋ฌ ๋ชจ๋ธ ๋น๊ต
from pycaret.regression import *
s = setup(pd.concat([X, y], axis=1), target='MedHouseVal', session_id=123, preprocess=False, verbose=False)
best_model = compare_models()
print(best_model)
PyCaret
์ ๋จ ๋ช ์ค์ ์ฝ๋๋ก ์๋ง์ ๋ชจ๋ธ์ ํ ์คํธํ๊ณ ๊ฐ์ฅ ์ข์ ๋ชจ๋ธ์ ์ถ์ฒํด์ฃผ์๋ค.CatBoost
๋ExtraTreesRegressor
๊ฐ ์ข์ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ์๋ค. ์ด๋ฐ ์๋ํ ๋๊ตฌ ๋๋ถ์ ๋ชจ๋ธ ํ์ ์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์์๋ค.
โจ ์ค๋์ ํ๊ณ
์ค๋์ ํ๊ท ๋ถ์์ ์ด๋ก ๋ถํฐ ์์ํด, ์ค์ ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ์ ๋ง๋ค๊ณ ์ ์ง์ ์ผ๋ก ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ์ ๊ณผ์ ์ ๊ฒฝํํ๋ค. ๋จ์ํ ๋ชจ๋ธ์ ๋ง๋ค๊ณ ๋๋ด๋ ๊ฒ์ด ์๋๋ผ, ์ ์ฑ๋ฅ์ด ์ ๋์ค์ง ์๋์ง ๊ณ ๋ฏผํ๊ณ , ์ค์ผ์ผ๋ง, ํน์ฑ ์ ํ, ๊ท์ ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ ์๋ํ๋ ๊ณผ์ ์ด ์ ๋ง ์ฌ๋ฏธ์์๋ค.
ํนํ AutoML์ ๊ฐ๋ ฅํจ์ ์ฒด๊ฐํ ์ ์์๋ค. ๋ฌผ๋ก ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ์ง๋ง, ์ด๋ฐ ์๋ํ ๋๊ตฌ๋ฅผ ์ ํ์ฉํ๋ฉด ํจ์ฌ ๋ ํจ์จ์ ์ผ๋ก ์ข์ ๋ชจ๋ธ์ ์ฐพ์ ์ ์๊ฒ ๋ค๋ ํ์ ์ด ๋ค์๋ค. ๋ค์์๋ ๋ชจ๋ธ์ ํ์ดํผํ๋ผ๋ฏธํฐ๋ฅผ Optuna
๋ก ๋ ๊น๊ฒ ํ๋ํด๋ณด๋ฉฐ ์ฑ๋ฅ์ ๊ทนํ๊น์ง ๋์ด์ฌ๋ฆฌ๋ ์์
์ ํด๋ณผ ๊ณํ์ด๋ค. ๐