๐ ๋ฐฑ์ง์ฅ๋ ๋ง๋ค๋ฉด ๋ซ๋ค!
โ๋ฐฑ์ง์ฅ๋ ๋ง๋ค๋ฉด ๋ซ๋คโ๋ ์๋ด์ด ์๋ค. ๋จธ์ ๋ฌ๋์ ์ธ๊ณ์๋ ์ด ์๋ด์ด ๊ทธ๋๋ก ์ ์ฉ๋๋ค. ๋ฐ๋ก ์์๋ธ(Ensemble) ํ์ต ๊ธฐ๋ฒ์ ํตํด์๋ค. ์์๋ธ์ ์ฌ๋ฌ ๊ฐ์ ๋ชจ๋ธ(๋ถ๋ฅ๊ธฐ)์ ์ฐ๊ฒฐํ์ฌ ๋จ์ผ ๋ชจ๋ธ๋ณด๋ค ๋ ๋๋ํ๊ณ ๊ฐ๋ ฅํ ํ๋์ ๋ชจ๋ธ์ ๋ง๋๋, ๋ง ๊ทธ๋๋ก ์ง๋จ์ง์ฑ์ ํ์ ๋น๋ฆฌ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ค๋์ ์ด ์์๋ธ์ ์ธ๊ณ๋ฅผ ๊น์ด ํํํด ๋ณด์๋ค. ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํฌํ ๋ฐฉ์๋ถํฐ, ์์ ์ ์ธ ์ฑ๋ฅ์ ์๋ํ๋ ๋๋ค ํฌ๋ ์คํธ, ๊ทธ๋ฆฌ๊ณ ์บ๊ธ๊ณผ ๊ฐ์ ๊ฒฝ์ง๋ํ์์ ์์ข๋ฅผ ์ฐจ์งํ๊ณ ์๋ ๋ถ์คํ ๋ชจ๋ธ๋ค๊น์ง! ์ฌ๋ฌ ๋ชจ๋ธ์ ์กฐํ๋กญ๊ฒ ์ฌ์ฉํด ์์ธก ์ฑ๋ฅ์ ๊ทน๋ํํ๋ ์ฌ์ ์ ์งํํ๋ค.
โจ โํ๋์ ์ฒ์ฌ๋ณด๋ค ์ฌ๋ฌ ๋ช ์ ์ ๋ฌธ๊ฐ๊ฐ ๋ซ๋ค.โ
์์๋ธ ํ์ต์ ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฐ์ ์ ๊ฐ์ง ์ฌ๋ฌ ๋ชจ๋ธ์ ์๊ฒฌ์ ์ข ํฉํ์ฌ ๋ ์ ์คํ๊ณ ์ ํํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋, ํ์ค ์ธ๊ณ์ ์ ๋ฌธ๊ฐ ์์ํ์๋ ๊ฐ๋ค.
๐ณ๏ธ 1. Voting: ๊ฐ์ฅ ๊ฐ๋จํ ์ง๋จ์ง์ฑ
๊ฐ์ฅ ์ง๊ด์ ์ธ ์์๋ธ ๋ฐฉ๋ฒ์ ํฌํ(Voting) ์ด๋ค. ์ฌ๋ฌ ๋ชจ๋ธ์ด ๊ฐ์ ์์ธกํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ๋ค์๊ฒฐ๋ก ์ต์ข ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐฉ์์ด๋ค.
๊ตฌ๋ถ | Hard Voting | Soft Voting |
---|---|---|
๋ฐฉ์ | ๋จ์ ๋ค์๊ฒฐ ํฌํ | ๊ฐ ๋ชจ๋ธ์ ์์ธก ํ๋ฅ ์ ํ๊ท ์ ๋ด์ด ๊ฒฐ์ |
ํน์ง | ๊ตฌํ์ด ๊ฐ๋จํ๋ค | ์ผ๋ฐ์ ์ผ๋ก ์ฑ๋ฅ์ด ๋ ์ฐ์ํ๋ค |
์ ๋ฐฉ์ ๋ฐ์ดํฐ์ ์ 3๊ฐ์ ๋ค๋ฅธ ๋ชจ๋ธ(๋ก์ง์คํฑ ํ๊ท, KNN, ๊ฒฐ์ ํธ๋ฆฌ)๋ก ํ์ต์ํจ ๋ค, VotingClassifier๋ก ๋ฌถ์ด ์ฑ๋ฅ์ ํ์ธํด ๋ณด์๋ค.
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
# ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ๋ถํ
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=121, test_size=0.2)
# ๊ฐ๋ณ ๋ชจ๋ธ ๋ฐ VotingClassifier ์์ฑ
lr_clf = LogisticRegression(max_iter=10000)
knn_clf = KNeighborsClassifier()
dt_clf = DecisionTreeClassifier()
vo_clf_hard = VotingClassifier([('LR', lr_clf), ('KNN', knn_clf), ('DT', dt_clf)], voting="hard")
# ๋ชจ๋ธ ํ์ต ๋ฐ ํ๊ฐ
vo_clf_hard.fit(X_train, y_train)
print(f"Hard Voting Accuracy: {vo_clf_hard.score(X_test, y_test)}")
๊ฒฐ๊ณผ: Hard Voting์ผ๋ก
97.3%
์ ์ ํ๋๋ฅผ ์ป์๋ค. ๊ฐ ๋ชจ๋ธ์ ๋จ๋ ์ผ๋ก ์ฌ์ฉํ์ ๋๋ณด๋ค ์์ ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ์๋ค. ๐
๐ณ 2. Bagging & Random Forest: ๊ฐ์ ๋ชจ๋ธ, ๋ค๋ฅธ ์๊ฐ
๋ฐฐ๊น (Bagging) ์ ๊ฐ์ ์ข ๋ฅ์ ๋ชจ๋ธ ์ฌ๋ฌ ๊ฐ์๊ฒ ์ฝ๊ฐ์ฉ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ฃผ์ด ํ์ต์ํค๋ ๋ฐฉ์์ด๋ค. ๋ฐ์ดํฐ์ ์ผ๋ถ๋ฅผ ๋ณต์์ถ์ถ(Bootstrap) ํ์ฌ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ์ ์ ๋ง๋ค๊ณ , ๊ฐ ๋ชจ๋ธ์ด ์ด ๋ฐ์ดํฐ์ ์ผ๋ก ๋ณ๋ ฌ ํ์ต์ ์งํํ๋ค. ์ด ๊ณผ์ ์ ํตํด ๊ฐ๋ณ ๋ชจ๋ธ์ ์ฝ์ ์ ๋ณด์๋๊ณ ์ ์ฒด ๋ชจ๋ธ์ ๊ณผ์ ํฉ์ ์ค์ด๋ ๋ค.
์ด ๋ฐฐ๊น ๋ฐฉ์์ ๋ํ์ฃผ์๊ฐ ๋ฐ๋ก ๋๋ค ํฌ๋ ์คํธ(Random Forest) ์ด๋ค.
from sklearn.ensemble import RandomForestClassifier
# RandomForest ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต
rf_clf = RandomForestClassifier(random_state=121, n_estimators=100) # 100๊ฐ์ ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉ
rf_clf.fit(X_train, y_train)
print(f"Random Forest Accuracy: {rf_clf.score(X_test, y_test)}")
๊ฒฐ๊ณผ: ๋ฌด๋ ค
98.2%
์ ์ ํ๋๋ฅผ ๋ฌ์ฑํ๋ค! ๋ณ๋ค๋ฅธ ํ๋ ์์ด๋ ๋งค์ฐ ๊ฐ๋ ฅํ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ๋, ์ ๋ง ๋ ๋ ํ ๋ชจ๋ธ์ด๋ค. ๐
โจ 3. Boosting: ์ ๋ฐฐ์ ์ค์๋ฅผ ๊ตํ ์ผ์
๋ถ์คํ (Boosting) ์ ์ฝํ ๋ชจ๋ธ๋ค์ ์์ฐจ์ ์ผ๋ก ํ์ต์ํค๋ ์ ์ด ๋ฐฐ๊น ๊ณผ ๋ค๋ฅด๋ค. ์ฒซ ๋ฒ์งธ ๋ชจ๋ธ์ด ์์ธกํ๊ณ ๋๋ฉด, ๊ทธ ๋ชจ๋ธ์ด ํ๋ฆฐ ๋ฌธ์ ์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ์ฌ ๋ค์ ๋ชจ๋ธ์ด ๋ ์ง์ค์ ์ผ๋ก ํ์ตํ๊ฒ ๋ง๋ ๋ค. ์ด๋ ๊ฒ ์ ๋ฐฐ์ ์ค์๋ฅผ ๊ตํ ์ผ์ ๊ณ์ ๋ฐ์ ํด๋๊ฐ๋ ๋ฐฉ์์ด๋ค.
๊ฐ. GBM (Gradient Boosting Machine)
๊ฒฝ์ฌํ๊ฐ๋ฒ์ ์ด์ฉํด ์ค์ฐจ๋ฅผ ๋ณด์ํด๋๊ฐ๋ ๊ธฐ๋ณธ์ ์ธ ๋ถ์คํ ๋ชจ๋ธ์ด๋ค.
๋. XGBoost (eXtra Gradient Boosting)
GBM์ ์ฑ๋ฅ์ ๊ทน๋ํํ ๋ชจ๋ธ๋ก, ๋ณ๋ ฌ ์ฒ๋ฆฌ(GPU) ์ง์, ๊ณผ์ ํฉ ๋ฐฉ์ง ๊ท์ , ์กฐ๊ธฐ ์ค๋จ ๊ธฐ๋ฅ ๋ฑ์ ์ถ๊ฐํ์ฌ ์๋์ ์ฑ๋ฅ์ ๋ชจ๋ ์ก์๋ค. ์บ๊ธ๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ๊ฒฝ์ง๋ํ์์ โ์ผ๋จ XGBoost๋ถํฐ ์ฐ๊ณ ๋ณธ๋คโ๋ ๋ง์ด ์์ ์ ๋๋ผ๊ณ ํ๋ค.
from xgboost import XGBClassifier
# XGBoost ๋ชจ๋ธ ์์ฑ ๋ฐ ์กฐ๊ธฐ ์ค๋จ ์ค์
xgbc = XGBClassifier(n_estimators=1000, early_stopping_rounds=10, eval_metric='logloss')
xgbc.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)
print(f"XGBoost Accuracy: {xgbc.score(X_test, y_test)}")
๊ฒฐ๊ณผ: ์ญ์
98.2%
! ๋๋ค ํฌ๋ ์คํธ์ ๋์ผํ ์ต๊ณ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ์๋ค. ์กฐ๊ธฐ ์ค๋จ ๊ธฐ๋ฅ ๋๋ถ์ ๋ถํ์ํ ํ์ต์ ๋ง์ ํจ์จ์ ์ด์๋ค.
๋ค. LightGBM
XGBoost๋ณด๋ค ๋ ๋น ๋ฅด๊ณ ๊ฐ๋ฒผ์ด ๋ชจ๋ธ์ ๋ชฉํ๋ก ๊ฐ๋ฐ๋์๋ค. ๋ฆฌํ ์ค์ฌ ํธ๋ฆฌ ๋ถํ ๋ฐฉ์์ ์ฌ์ฉํด ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์์ ํนํ ๊ฐ์ ์ ๋ณด์ธ๋ค.
โจ ์ค๋์ ํ๊ณ
์ค๋์ ์์๋ธ ๊ธฐ๋ฒ์ ๊ณต๋ถํ๋ฉฐ ๋ชจ๋ธ ๊ฐ ์ง๋จ์ง์ฑ์ ํ์ ์ง์ ํ์ธํ๋ค. Voting, Bagging, Boosting ์ด๋ผ๋ ์ธ ๊ฐ์ง ํฐ ์ถ์ ์ค์ฌ์ผ๋ก, ๊ฐ ๊ธฐ๋ฒ์ด ์ด๋ป๊ฒ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ๋์ด์ฌ๋ฆฌ๋์ง ๋ฐฐ์ธ ์ ์์๋ค. ํนํ ๋จ์ผ ๋ชจ๋ธ์ ์ฑ๋ฅ์๋ง ๋งค๋ฌ๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ, ์ฌ๋ฌ ๋ชจ๋ธ์ ํ๋ช ํ๊ฒ ์กฐํฉํ๋ โ์ํคํ ์ฒโ ์ค๊ณ๊ฐ ์ผ๋ง๋ ์ค์ํ์ง ๊นจ๋ฌ์๋ค.
๋๋ค ํฌ๋ ์คํธ์ ์์ ์ฑ๊ณผ XGBoost์ ๊ฐ๋ ฅํจ์ด ํนํ ์ธ์ ๊น์๋ค. ์ ๋ง์ ํ์ ๋ฐ์ดํฐ ์ฌ์ด์ธํฐ์คํธ๋ค์ด ์ด ๋ชจ๋ธ๋ค์ ์ฌ๋ํ๋์ง ์ ๊ฒ ๊ฐ์๋ค.! ๐