[ํธ๋ฆฌ] ํธ๋ฆฌ ๊ธฐ๋ฐ ML ์๊ณ ๋ฆฌ์ฆ
ํธ๋ฆฌ ๊ธฐ๋ฐ ML ์๊ณ ๋ฆฌ์ฆ
ํธ๋ฆฌ ๊ธฐ๋ฐ ๋จธ์ ๋ฌ๋(ML) ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ์ดํฐ์ ํน์ง์ ๊ธฐ๋ฐ์ผ๋ก ํธ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ์์ธก(Regression) ๋๋ ๋ถ๋ฅ(Classification)๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ฃจํธ ๋
ธ๋์์ ์์ํ์ฌ ๋ด๋ถ ๋
ธ๋์์ ๋ฐ์ดํฐ๋ฅผ ๋ถํ ํ๊ณ , ๋ฆฌํ ๋
ธ๋์์ ์ต์ข
์์ธก๊ฐ์ ์ฐ์ถํฉ๋๋ค. ํธ๋ฆฌ ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ์๊ฐ์ ์ผ๋ก ํํํ ์ ์์ด ํด์์ด ์ฉ์ดํ๋ฉฐ, ๋ค์ํ ๋ฐ์ดํฐ์
์ ๋ํด ๋์ ์ฑ๋ฅ์ ๋ณด์
๋๋ค.
์๊ณ ๋ฆฌ์ฆ์ ์ฅ๋จ์
์ฅ์
- ํด์ ์ฉ์ด์ฑ (Interpretability): ํธ๋ฆฌ ๊ตฌ์กฐ๋ ์๊ฐ์ ์ผ๋ก ์ดํดํ๊ธฐ ์ฝ๊ณ , ๋ชจ๋ธ์ ๊ฒฐ์ ๊ณผ์ ์ ๋ช ํํ๊ฒ ๋ณด์ฌ์ค๋๋ค. ์ด๋ ๋ชจ๋ธ์ด ์ด๋ป๊ฒ ์์ธก์ ์ํํ๋์ง ์ฝ๊ฒ ์ค๋ช ํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ํนํ ์์ฌ ๊ฒฐ์ ์ด ์ค์ํ ๋ถ์ผ์์ ์ ์ฉํฉ๋๋ค.
- ๋น์ ํ ๊ด๊ณ ๋ชจ๋ธ๋ง (Non-linear Relationships): ํธ๋ฆฌ ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋น์ ํ์ ์ธ ๋ฐ์ดํฐ ๊ด๊ณ๋ฅผ ์ ํฌ์ฐฉํ ์ ์์ด ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ํน์ง ์ ํ (Feature Selection): ์๊ณ ๋ฆฌ์ฆ์ด ์ค์ํ ํน์ง์ ์๋์ผ๋ก ์ ํํ๊ณ ๋ถํ์ํ ํน์ง์ ๋ฌด์ํ์ฌ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ๋ค์ํ ๋ฐ์ดํฐ ํ์ ์ฒ๋ฆฌ (Handling Various Data Types): ์ฐ์ํ ๋ฐ ๋ฒ์ฃผํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ ์ ์์ด ๋ค์ํ ์ ํ์ ๋ฐ์ดํฐ์ ์ ์ ์ฐํ๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.
- ๋ก๋ฒ์คํธํจ (Robustness): ํธ๋ฆฌ ๊ธฐ๋ฐ ๋ชจ๋ธ์ ์ด์์น(outliers)๋ ์ก์(noise)์ ๊ฐํ ํน์ฑ์ ๋ณด์ ๋๋ค. ์ด๋ ๋ชจ๋ธ์ด ๋ค์ํ ๋ฐ์ดํฐ ์กฐ๊ฑด์์๋ ์์ ์ ์ผ๋ก ์๋ํ๊ฒ ํฉ๋๋ค.
๋จ์
- ๊ณผ์ ํฉ ์ํ (Risk of Overfitting): ๋จ์ผ ์์ฌ๊ฒฐ์ ๋๋ฌด๋ ๊ณผ์ ํฉ์ ๋ฏผ๊ฐํ์ฌ ํ์ต ๋ฐ์ดํฐ์ ๋๋ฌด ๋ง์ถฐ์ง ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ฐ์ง์น๊ธฐ(pruning) ๋ฑ์ ๊ธฐ๋ฒ์ด ํ์ํฉ๋๋ค.
- ๋์ ๊ณ์ฐ ๋น์ฉ (High Computational Cost): ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์์ ํธ๋ฆฌ๋ฅผ ํ์ตํ๊ณ ์์ธกํ๋ ๋ฐ ์๊ฐ์ด ๋ง์ด ์์๋ ์ ์์ต๋๋ค. ํนํ ๋ถ์คํ ๊ณ์ด ๋ชจ๋ธ(์: GBM, AdaBoost ๋ฑ)์ ๋ง์ ํธ๋ฆฌ๋ฅผ ํ์ตํด์ผ ํ๋ฏ๋ก ๊ณ์ฐ ๋น์ฉ์ด ๋ ๋์ต๋๋ค.
- ๋ฐ์ดํฐ ๋ฏผ๊ฐ์ฑ (Data Sensitivity): ํธ๋ฆฌ ๊ธฐ๋ฐ ๋ชจ๋ธ์ ๋ฐ์ดํฐ์ ์์ ๋ณํ์๋ ๋ฏผ๊ฐํ๊ฒ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ ๋ชจ๋ธ์ ์์ ์ฑ์ ์ ํ์ํฌ ์ ์์ต๋๋ค.
- ๋ณ์ ๊ฐ ์ํธ์์ฉ ๋ณต์ก์ฑ (Complexity of Interactions): ํธ๋ฆฌ ๊ตฌ์กฐ๊ฐ ๊น์ด์ง์๋ก ๋ณ์ ๊ฐ ์ํธ์์ฉ์ด ๋ณต์กํด์ง ์ ์์ผ๋ฉฐ, ์ด๋ ๋ชจ๋ธ์ ํด์์ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- ๊ฒฐ์ ๊ฒฝ๊ณ ๋ถ์ฐ์์ฑ (Discontinuity of Decision Boundaries): ํธ๋ฆฌ ๊ธฐ๋ฐ ๋ชจ๋ธ์ ๊ฒฐ์ ๊ฒฝ๊ณ๊ฐ ๋ถ์ฐ์์ ์ด์ด์, ์ค์ ๋ฐ์ดํฐ์ ์ฐ์์ฑ์ ์ ๋ฐ์ํ์ง ๋ชปํ ์ ์์ต๋๋ค. ์ด๋ ํนํ ๊ฒฝ๊ณ๊ฐ ์ค์ํ ์ฐ์ํ ๋ณ์์ ๋ํด ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
ํธ๋ฆฌ ๊ธฐ๋ฐ ML ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ์
ํธ๋ฆฌ ๊ธฐ๋ฐ ํ๊ท/๋ถ๋ฅ ์๊ณ ๋ฆฌ์ฆ์ ์ญ์ฌ๋ ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ์ ๊ณผ์ ์์ ์ค์ํ ์์น๋ฅผ ์ฐจ์งํฉ๋๋ค. ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ ์ด์ ์ ์๊ณ ๋ฆฌ์ฆ์ ํ๊ณ๋ฅผ ๋ณด์ํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ๊ฐ๋ฐ๋์์ต๋๋ค.
์๋์ ์ฃผ์ ํธ๋ฆฌ ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ์ ์์์ ํน์ง์ ์ค๋ช ํ๊ฒ ์ต๋๋ค. ์๋ ๊ธฐ์ ํ ์ญ์ฌ๋ ์ฐพ์ ๋ ผ๋ฌธ ๋ ์ง๋ฅผ ํ ๋๋ก ์์ฑํ์์ต๋๋ค. (์ค์ ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ฐ ๋ ์ง์ ์์ดํ ์ ์์ต๋๋ค!!)
1. Decision Tree (์์ฌ๊ฒฐ์ ๋๋ฌด)
- ์ญ์ฌ: 1960๋ ๋ (๋ ผ๋ฌธ ๋งํฌ)
- ํน์ง: ๋ฐ์ดํฐ์ ํน์ง์ ๋ฐ๋ผ ๋ถํ ์ ๋ฐ๋ณตํ์ฌ ์์ธก์ ์ํํฉ๋๋ค. ID3, C4.5, CART ๋ฑ์ ์๊ณ ๋ฆฌ์ฆ์ด ํฌํจ๋ฉ๋๋ค.
- ์์: ์ํธ๋กํผ, ์ง๋ ๋ถ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ถํ ๊ธฐ์ค์ ์ ํจ.
2. Random Forest (๋๋ค ํฌ๋ ์คํธ)
- ์ญ์ฌ: 2001๋ (Leo Breiman) (๋ ผ๋ฌธ ๋งํฌ)
- ํน์ง: ์ฌ๋ฌ ๊ฐ์ ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ์์๋ธํ์ฌ ์์ธก ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ๊ฐ ํธ๋ฆฌ๋ ๋ถํธ์คํธ๋ฉ ์ํ๋ง๊ณผ ๋ฌด์์ ํน์ง ์ ํ์ ํตํด ์์ฑ๋ฉ๋๋ค.
- ์์: ๋ฐฐ๊น (bagging) ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ํธ๋ฆฌ์ ์์ธก์ ํ๊ท ๋ด๊ฑฐ๋ ๋ค์๊ฒฐ๋ก ๊ฒฐํฉ.
3. Gradient Boosting (๊ทธ๋๋์ธํธ ๋ถ์คํ )
- ์ญ์ฌ: 2001๋ (Jerome Friedman) (๋ ผ๋ฌธ ๋งํฌ)
- ํน์ง: ์ด์ ํธ๋ฆฌ์ ์ค์ฐจ๋ฅผ ์ค์ด๊ธฐ ์ํด ์์ฐจ์ ์ผ๋ก ํธ๋ฆฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ฃผ๋ก ํ๊ท ๋ถ์์ ์ฌ์ฉ๋์ง๋ง, ๋ถ๋ฅ์๋ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- ์์: ์์ค ํจ์๋ฅผ ์ต์ํํ๋ ๋ฐฉํฅ์ผ๋ก ํธ๋ฆฌ๋ฅผ ํ์ต์ํด.
4. AdaBoost (Adaptive Boosting)
- ์ญ์ฌ: 1996๋ (Yoav Freund, Robert Schapire) (๋ ผ๋ฌธ ๋งํฌ)
- ํน์ง: ์๋ชป ๋ถ๋ฅ๋ ์ํ์ ๊ฐ์ค์น๋ฅผ ๋ ๋ถ์ฌํ์ฌ ๋ค์ ํธ๋ฆฌ๋ฅผ ํ์ต์ํต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ๋ ฅํ ํ์ต๊ธฐ๋ฅผ ๋ง๋ญ๋๋ค.
- ์์: ๊ฐ ํ์ต๊ธฐ์ ๊ฐ์ค์น๋ฅผ ์กฐ์ ํ์ฌ ์ต์ข ์์ธก ๋ชจ๋ธ์ ๊ตฌ์ฑ.
5. Extra Trees (Extremely Randomized Trees)
- ์ญ์ฌ: 2006๋ (Pierre Geurts, Damien Ernst, Louis Wehenkel) (๋ ผ๋ฌธ ๋งํฌ)
- ํน์ง: ๋๋ค ํฌ๋ ์คํธ์ ์ ์ฌํ์ง๋ง, ํธ๋ฆฌ์ ๋ถํ ๊ธฐ์ค์ ์์ ํ ๋ฌด์์๋ก ์ ํํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ ๋ง์ ํธ๋ฆฌ๋ฅผ ํ์๋ก ํ์ง๋ง, ๋์ ์ฑ๋ฅ์ ๋ณด์ ๋๋ค.
- ์์: ๋ถํ ์ ๋ฌด์์๋ก ํน์ง๊ณผ ๋ถํ ์ ์ ์ ํ.
6. XGBoost (Extreme Gradient Boosting)
- ์ญ์ฌ: 2016๋ (Tianqi Chen) (๋ ผ๋ฌธ ๋งํฌ)
- ํน์ง: ๊ทธ๋๋์ธํธ ๋ถ์คํ ์ ํจ์จ์ฑ๊ณผ ์ฑ๋ฅ์ ๊ฐ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ ๊ทํ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฑ์ ์ต์ ํ ๊ธฐ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
- ์์: ์ ๊ทํ ํญ์ ์ถ๊ฐํ์ฌ ๊ณผ์ ํฉ ๋ฐฉ์ง.
7. LightGBM (Light Gradient Boosting Machine)
- ์ญ์ฌ: 2017๋ (Microsoft) (๋ ผ๋ฌธ ๋งํฌ)
- ํน์ง: ๋์ฉ๋ ๋ฐ์ดํฐ์ ๊ณ ์ฐจ์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๋ฆฌํ ์ค์ฌ ํธ๋ฆฌ ๋ถํ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
- ์์: Gradient-based One-Side Sampling (GOSS)์ Exclusive Feature Bundling (EFB) ๊ธฐ๋ฒ ์ฌ์ฉ.
8. CatBoost (Categorical Boosting)
- ์ญ์ฌ: 2018๋ (Yandex) (๋ ผ๋ฌธ ๋งํฌ)
- ํน์ง: ๋ฒ์ฃผํ ๋ณ์๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์์ฐจ ๋ถ์คํ ๊ณผ ๊ทธ๋ผ๋์ธํธ ๊ณ์ฐ์ ์ต์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํฉ๋๋ค.
- ์์: ์์ฐจ์ ์ธ ์์์ ๋ฐ๋ผ ์นดํ ๊ณ ๋ฆฌํ ๋ณ์์ ํ๊ท ์ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ์ฒ๋ฆฌ.
9. Histogram-based Gradient Boosting (HGBT)
- ์ญ์ฌ: ํน์ ํ๊ธฐ ์ด๋ ค์. (LightGBM ๊ฐ๋ฐ ๋น์, ํ์คํ ๊ทธ๋จ ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ํจ์จ์ฑ์ ํ์ธํจ => ์ด๋ฅผ ๋ฐ์ ์ํจ ํํ๊ฐ ๋ฐ๋ก HGBT)
- ํน์ง: ํ์คํ ๊ทธ๋จ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ์ฐ์ ๋ณ์๋ฅผ ๋ฒํท์ผ๋ก ๊ทธ๋ฃนํํ์ฌ ์ฒ๋ฆฌ ์๋๋ฅผ ๋์ ๋๋ค.
- ์์: ๊ฐ ํน์ง์ ํ์คํ ๊ทธ๋จ์ผ๋ก ๋ณํํ์ฌ ๋น ๋ฅด๊ฒ ์ต์ ๋ถํ ์ ์ฐพ์.
์ด ์ธ์๋ ํธ๋ฆฌ ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ณํ๊ณผ ๊ฐ์ ์ด ๊ณ์ํด์ ์ด๋ฃจ์ด์ง๊ณ ์์ผ๋ฉฐ, ์ต์ ๊ธฐ์ ๋ํฅ์ ๋ฐ๋ผ ๋ ๋์ ์ฑ๋ฅ์ ๋ชฉํ๋ก ํ๋ ์๋ก์ด ์๊ณ ๋ฆฌ์ฆ์ด ๊ฐ๋ฐ๋๊ณ ์์ต๋๋ค. ์๋์ ์์์ ์ธ๊ธํ ์ฃผ์ ํธ๋ฆฌ ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ญ์ฌ์ ์์์ ํน์ง์ ์ค๋ช ํ๊ณ , ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋ ๋ฐ ์๋ฆฌ, ํ์ด์ฌ ์ฝ๋ ์์ ๋ฅผ ์๊ฐํฉ๋๋ค.
1. Decision Tree (์์ฌ๊ฒฐ์ ๋๋ฌด)

์ถ์ฒ: ์ง์ฅ์ธ ๊ณ ๋์ ๋ฐ์ดํฐ ๋ถ์
๊ฐ๋ ๋ฐ ์๋ฆฌ
์์ฌ๊ฒฐ์ ๋๋ฌด๋ ๋ฐ์ดํฐ์ ํน์ง์ ๊ธฐ๋ฐ์ผ๋ก ๋ถํ ํ์ฌ ์์ธก์ ์ํํ๋ ๋ชจ๋ธ์ ๋๋ค. ํธ๋ฆฌ๋ ๋ฃจํธ ๋ ธ๋์์ ์์ํ์ฌ ๋ด๋ถ ๋ ธ๋์์ ๋ฐ์ดํฐ์ ํน์ง์ ๋ฐ๋ผ ๋ถํ ๋๊ณ , ๋ฆฌํ ๋ ธ๋์์ ์ต์ข ์์ธก๊ฐ์ ์ฐ์ถํฉ๋๋ค. ์์ฌ๊ฒฐ์ ๋๋ฌด์ ์ฃผ์ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ถํ ๊ธฐ์ค (Split Criterion): ๋ฐ์ดํฐ ๋ถํ ์ ๊ธฐ์ค์ ์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ์ํธ๋กํผ(entropy)์ ์ง๋ ๋ถ์๋(gini impurity)๊ฐ ๋ํ์ ์ ๋๋ค.
- ์ ๋ณด ํ๋ (Information Gain): ํน์ ๋ถํ ๊ธฐ์ค์ ์ํด ๋ฐ์ดํฐ๊ฐ ์ผ๋ง๋ ์ ๋ถํ ๋๋์ง๋ฅผ ์ธก์ ํฉ๋๋ค. ์ ๋ณด ํ๋์ด ์ต๋ํ๋๋ ๋ฐฉํฅ์ผ๋ก ํธ๋ฆฌ๋ฅผ ๋ถํ ํฉ๋๋ค.
- ๊ฐ์ง์น๊ธฐ (Pruning): ๊ณผ์ ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํธ๋ฆฌ์ ์ฑ์ฅ์ ์ ํํ๊ฑฐ๋ ๋ถํ์ํ ๊ฐ์ง๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
ํ์ด์ฌ ์ฝ๋ ์์
์๋๋ scikit-learn ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฌ๊ฒฐ์ ๋๋ฌด๋ฅผ ๊ตฌํํ๋ ์์ ์
๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
# ๋ฐ์ดํฐ ๋ก๋
iris = load_iris()
X, y = iris.data, iris.target
# ํ์ต ๋ฐ์ดํฐ์ ํ
์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# ์์ฌ๊ฒฐ์ ๋๋ฌด ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต
clf = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=42)
clf.fit(X_train, y_train)
# ์์ธก ๋ฐ ํ๊ฐ
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
# ํธ๋ฆฌ ์๊ฐํ
plt.figure(figsize=(20, 10))
plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.show()
์ฝ๋ ์ค๋ช
- ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ๋ถํ :
load_iris()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ด๋ฆฌ์ค ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ,train_test_split()์ ํตํด ํ์ต ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ ํฉ๋๋ค. - ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต:
DecisionTreeClassifier๋ฅผ ์ฌ์ฉํ์ฌ ์์ฌ๊ฒฐ์ ๋๋ฌด ๋ชจ๋ธ์ ์์ฑํ๊ณ ,fit()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต์ํต๋๋ค. ์ฌ๊ธฐ์๋ ์ง๋ ๋ถ์๋๋ฅผ ๋ถํ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉํ๊ณ , ์ต๋ ๊น์ด๋ฅผ 3์ผ๋ก ์ค์ ํ์ต๋๋ค. - ์์ธก ๋ฐ ํ๊ฐ: ํ์ต๋ ๋ชจ๋ธ๋ก ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๊ณ , ์ ํ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ํธ๋ฆฌ ์๊ฐํ:
plot_tree()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต๋ ํธ๋ฆฌ๋ฅผ ์๊ฐํํฉ๋๋ค. ํธ๋ฆฌ์ ๊ฐ ๋ ธ๋๋ ํน์ง๊ณผ ํด๋์ค์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค.
2. Random Forest (๋๋ค ํฌ๋ ์คํธ)

์ถ์ฒ : GeeksforGeeks
๊ฐ๋ ๋ฐ ์๋ฆฌ
๋๋ค ํฌ๋ ์คํธ๋ ์ฌ๋ฌ ๊ฐ์ ์์ฌ๊ฒฐ์ ๋๋ฌด๋ฅผ ์์๋ธํ์ฌ ์์ธก ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ฐ ์์ฌ๊ฒฐ์ ๋๋ฌด๋ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ต๋๋ฉฐ, ์ต์ข ์์ธก์ ๊ฐ ๋๋ฌด์ ์์ธก์ ๊ฒฐํฉํ์ฌ ์ด๋ฃจ์ด์ง๋๋ค. ๋๋ค ํฌ๋ ์คํธ์ ์ฃผ์ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฐฐ๊น (Bagging): ๋ถํธ์คํธ๋ฉ ์ํ๋ง์ ํตํด ์ฌ๋ฌ ํธ๋ ์ด๋ ์ธํธ๋ฅผ ์์ฑํ๊ณ , ๊ฐ ์ธํธ์ ๋ํด ๋ ๋ฆฝ์ ์ธ ๋ชจ๋ธ์ ํ์ต์ํต๋๋ค.
- ๋๋ค ํน์ง ์ ํ: ๊ฐ ๋ ธ๋์์ ๋ถํ ํ ๋ ์ ์ฒด ํน์ง ์ค ๋ฌด์์๋ก ์ ํ๋ ์ผ๋ถ ํน์ง๋ง์ ์ฌ์ฉํ์ฌ ๋ถํ ํฉ๋๋ค.
- ์์๋ธ: ๊ฐ ๋๋ฌด์ ์์ธก์ ํ๊ท ๋ด๊ฑฐ๋ ๋ค์๊ฒฐ ํฌํ๋ฅผ ํตํด ์ต์ข ์์ธก์ ์ํํฉ๋๋ค.
ํ์ด์ฌ ์ฝ๋ ์์
์๋๋ scikit-learn ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ค ํฌ๋ ์คํธ๋ฅผ ๊ตฌํํ๋ ์์ ์
๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# ๋ฐ์ดํฐ ๋ก๋
iris = load_iris()
X, y = iris.data, iris.target
# ํ์ต ๋ฐ์ดํฐ์ ํ
์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# ๋๋ค ํฌ๋ ์คํธ ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต
clf = RandomForestClassifier(n_estimators=100, max_depth=3, random_state=42)
clf.fit(X_train, y_train)
# ์์ธก ๋ฐ ํ๊ฐ
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
# ์ค์ ํน์ง ์๊ฐํ
feature_importances = clf.feature_importances_
features = iris.feature_names
importance_df = pd.DataFrame({'Feature': features, 'Importance': feature_importances})
plt.figure(figsize=(10, 6))
sns.barplot(x='Importance', y='Feature', data=importance_df)
plt.title('Feature Importance in Random Forest')
plt.show()
์ฝ๋ ์ค๋ช
- ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ๋ถํ :
load_iris()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ด๋ฆฌ์ค ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ,train_test_split()์ ํตํด ํ์ต ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ ํฉ๋๋ค. - ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต:
RandomForestClassifier๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ค ํฌ๋ ์คํธ ๋ชจ๋ธ์ ์์ฑํ๊ณ ,fit()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต์ํต๋๋ค. ์ฌ๊ธฐ์๋ 100๊ฐ์ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ , ๊ฐ ํธ๋ฆฌ์ ์ต๋ ๊น์ด๋ฅผ 3์ผ๋ก ์ค์ ํ์ต๋๋ค. - ์์ธก ๋ฐ ํ๊ฐ: ํ์ต๋ ๋ชจ๋ธ๋ก ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๊ณ , ์ ํ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ค์ ํน์ง ์๊ฐํ:
feature_importances_์์ฑ์ ์ฌ์ฉํ์ฌ ๊ฐ ํน์ง์ ์ค์๋๋ฅผ ๊ณ์ฐํ๊ณ ,seaborn์ ์ฌ์ฉํ์ฌ ๋ฐ ๊ทธ๋ํ๋ก ์๊ฐํํฉ๋๋ค.
3. Gradient Boosting (๊ทธ๋๋์ธํธ ๋ถ์คํ )

์ถ์ฒ : GeeksforGeeks
๊ฐ๋ ๋ฐ ์๋ฆฌ
๊ทธ๋๋์ธํธ ๋ถ์คํ ์ ์์ฐจ์ ์ผ๋ก ํธ๋ฆฌ๋ฅผ ์ถ๊ฐํ์ฌ ์์ธก ์ฑ๋ฅ์ ํฅ์์ํค๋ ์์๋ธ ํ์ต ๋ฐฉ๋ฒ์ ๋๋ค. ๊ฐ ํธ๋ฆฌ๋ ์ด์ ํธ๋ฆฌ์ ์ค์ฐจ๋ฅผ ์ค์ด๊ธฐ ์ํด ํ์ต๋๋ฉฐ, ์์ค ํจ์๋ฅผ ์ต์ํํ๋ ๋ฐฉํฅ์ผ๋ก ํธ๋ฆฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋๋์ธํธ ๋ถ์คํ ์ ์ฃผ์ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์์ฐจ์ ํ์ต: ๋ชจ๋ธ์ ์์ฐจ์ ์ผ๋ก ํ์ต์ํค๋ฉฐ, ๊ฐ ๋จ๊ณ์์ ์ด์ ๋ชจ๋ธ์ ์์ฌ ์ค์ฐจ๋ฅผ ์ค์ด๊ธฐ ์ํด ์๋ก์ด ๋ชจ๋ธ์ ์ถ๊ฐํฉ๋๋ค.
- ์์ค ํจ์ (Loss Function): ์์ธก ์ค์ฐจ๋ฅผ ํ๊ฐํ๊ธฐ ์ํ ํจ์๋ก, ์ฃผ๋ก ํ๊ท์์๋ ํ๊ท ์ ๊ณฑ ์ค์ฐจ(MSE), ๋ถ๋ฅ์์๋ ๋ก๊ทธ ์์ค(Log Loss)์ ์ฌ์ฉํฉ๋๋ค.
- ๊ทธ๋ผ๋์ธํธ ๊ณ์ฐ: ์์ค ํจ์๋ฅผ ์ต์ํํ๊ธฐ ์ํด ๊ฐ ๋จ๊ณ์์ ์์ฌ ์ค์ฐจ์ ๊ทธ๋ผ๋์ธํธ๋ฅผ ๊ณ์ฐํ์ฌ ๋ชจ๋ธ์ ์ ๋ฐ์ดํธํฉ๋๋ค.
ํ์ด์ฌ ์ฝ๋ ์์
์๋๋ scikit-learn ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋๋์ธํธ ๋ถ์คํ
์ ๊ตฌํํ๋ ์์ ์
๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from sklearn.datasets import load_iris
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# ๋ฐ์ดํฐ ๋ก๋
iris = load_iris()
X, y = iris.data, iris.target
# ํ์ต ๋ฐ์ดํฐ์ ํ
์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# ๊ทธ๋๋์ธํธ ๋ถ์คํ
๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต
clf = GradientBoostingClassifier(n
_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
clf.fit(X_train, y_train)
# ์์ธก ๋ฐ ํ๊ฐ
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
# ์ค์ ํน์ง ์๊ฐํ
feature_importances = clf.feature_importances_
features = iris.feature_names
importance_df = pd.DataFrame({'Feature': features, 'Importance': feature_importances})
plt.figure(figsize=(10, 6))
sns.barplot(x='Importance', y='Feature', data=importance_df)
plt.title('Feature Importance in Gradient Boosting')
plt.show()
์ฝ๋ ์ค๋ช
- ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ๋ถํ :
load_iris()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ด๋ฆฌ์ค ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ,train_test_split()์ ํตํด ํ์ต ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ ํฉ๋๋ค. - ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต:
GradientBoostingClassifier๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋๋์ธํธ ๋ถ์คํ ๋ชจ๋ธ์ ์์ฑํ๊ณ ,fit()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต์ํต๋๋ค. ์ฌ๊ธฐ์๋ 100๊ฐ์ ํธ๋ฆฌ, ํ์ต๋ฅ 0.1, ์ต๋ ๊น์ด 3์ผ๋ก ์ค์ ํ์ต๋๋ค. - ์์ธก ๋ฐ ํ๊ฐ: ํ์ต๋ ๋ชจ๋ธ๋ก ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๊ณ , ์ ํ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ค์ ํน์ง ์๊ฐํ:
feature_importances_์์ฑ์ ์ฌ์ฉํ์ฌ ๊ฐ ํน์ง์ ์ค์๋๋ฅผ ๊ณ์ฐํ๊ณ ,seaborn์ ์ฌ์ฉํ์ฌ ๋ฐ ๊ทธ๋ํ๋ก ์๊ฐํํฉ๋๋ค.
4. AdaBoost (Adaptive Boosting)

์ถ์ฒ : Towards AI
๊ฐ๋ ๋ฐ ์๋ฆฌ
AdaBoost (Adaptive Boosting)๋ ์ฝํ ํ์ต๊ธฐ(Weak Learner)๋ฅผ ๊ฒฐํฉํ์ฌ ๊ฐํ ํ์ต๊ธฐ(Strong Learner)๋ฅผ ๋ง๋๋ ์์๋ธ ํ์ต ๋ฐฉ๋ฒ์ ๋๋ค. AdaBoost๋ ์ด๊ธฐ ํ์ต๊ธฐ์ ์ค๋ฅ๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ํ์ ํ์ต๊ธฐ์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ์ฌ ์ ์ฐจ์ ์ผ๋ก ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ์ฃผ์ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ฐ์ค์น ์ ๋ฐ์ดํธ: ์ด๊ธฐ ํ์ต๊ธฐ์ ์ค๋ฅ๊ฐ ํฐ ๋ฐ์ดํฐ ํฌ์ธํธ์ ๋ ๋ง์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ์ฌ ๋ค์ ํ์ต๊ธฐ๊ฐ ์ด ์ค๋ฅ๋ฅผ ์ค์ด๋๋ก ํฉ๋๋ค.
- ์์ฐจ์ ํ์ต: ๊ฐ ํ์ต๊ธฐ๋ ์ด์ ํ์ต๊ธฐ์ ์ค๋ฅ๋ฅผ ์ค์ด๊ธฐ ์ํด ์์ฐจ์ ์ผ๋ก ํ์ต๋ฉ๋๋ค.
- ์์๋ธ: ์ต์ข ์์ธก์ ๋ชจ๋ ํ์ต๊ธฐ์ ๊ฐ์ค์น๊ฐ ๋ถ์ฌ๋ ํฌํ๋ฅผ ํตํด ๊ฒฐ์ ๋ฉ๋๋ค.
ํ์ด์ฌ ์ฝ๋ ์์
์๋๋ scikit-learn ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ AdaBoost๋ฅผ ๊ตฌํํ๋ ์์ ์
๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from sklearn.datasets import load_iris
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# ๋ฐ์ดํฐ ๋ก๋
iris = load_iris()
X, y = iris.data, iris.target
# ํ์ต ๋ฐ์ดํฐ์ ํ
์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# AdaBoost ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต
base_estimator = DecisionTreeClassifier(max_depth=1, random_state=42)
clf = AdaBoostClassifier(estimator=base_estimator, n_estimators=50, learning_rate=1.0, random_state=42)
clf.fit(X_train, y_train)
# ์์ธก ๋ฐ ํ๊ฐ
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
# ์ค์ ํน์ง ์๊ฐํ
feature_importances = clf.feature_importances_
features = iris.feature_names
importance_df = pd.DataFrame({'Feature': features, 'Importance': feature_importances})
plt.figure(figsize=(10, 6))
sns.barplot(x='Importance', y='Feature', data=importance_df)
plt.title('Feature Importance in AdaBoost')
plt.show()
์ฝ๋ ์ค๋ช
- ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ๋ถํ :
load_iris()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ด๋ฆฌ์ค ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ,train_test_split()์ ํตํด ํ์ต ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ ํฉ๋๋ค. - ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต:
DecisionTreeClassifier๋ฅผ ์ฝํ ํ์ต๊ธฐ๋ก ์ฌ์ฉํ์ฌAdaBoostClassifier๋ฅผ ์์ฑํ๊ณ ,fit()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต์ํต๋๋ค. ์ฌ๊ธฐ์๋ ์ต๋ ๊น์ด 1์ ์์ฌ๊ฒฐ์ ๋๋ฌด๋ฅผ ์ฝํ ํ์ต๊ธฐ๋ก ์ฌ์ฉํ๋ฉฐ, 50๊ฐ์ ํ์ต๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. - ์์ธก ๋ฐ ํ๊ฐ: ํ์ต๋ ๋ชจ๋ธ๋ก ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๊ณ , ์ ํ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ค์ ํน์ง ์๊ฐํ:
feature_importances_์์ฑ์ ์ฌ์ฉํ์ฌ ๊ฐ ํน์ง์ ์ค์๋๋ฅผ ๊ณ์ฐํ๊ณ ,seaborn์ ์ฌ์ฉํ์ฌ ๋ฐ ๊ทธ๋ํ๋ก ์๊ฐํํฉ๋๋ค.
5. Extra Trees (Extremely Randomized Trees)

์ถ์ฒ : stackexchange, difference-between-random-forest-and-extremely-randomized-trees
๊ฐ๋ ๋ฐ ์๋ฆฌ
Extra Trees (Extremely Randomized Trees)๋ ๋๋ค ํฌ๋ ์คํธ์ ์ ์ฌํ์ง๋ง, ๋ ๋ง์ ๋ฌด์์์ฑ์ ๋์ ํ์ฌ ๋ชจ๋ธ์ ํ์ต์ํค๋ ์์๋ธ ๋ฐฉ๋ฒ์ ๋๋ค. ๋๋ค ํฌ๋ ์คํธ๊ฐ ๊ฐ ๋ ธ๋์์ ์ต์ ์ ๋ถํ ์ ์ฐพ๋ ๋ฐ๋ฉด, Extra Trees๋ ๋ฌด์์๋ก ์ ํ๋ ๋ถํ ๊ธฐ์ค์ ์ฌ์ฉํ์ฌ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ์ด๋ก ์ธํด ๋ชจ๋ธ์ ํธํฅ์ ์ฝ๊ฐ ์ฆ๊ฐํ ์ ์์ง๋ง, ๋ถ์ฐ์ ๊ฐ์ํ์ฌ ๊ณผ์ ํฉ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ฃผ์ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์์ ๋ฌด์์ ๋ถํ : ๊ฐ ๋ ธ๋์์ ๋ฌด์์๋ก ์ ํ๋ ๋ถํ ๊ธฐ์ค์ ์ฌ์ฉํ์ฌ ๋ถํ ํฉ๋๋ค.
- ๋ฐฐ๊น (Bagging): ์ฌ๋ฌ ๊ฐ์ ํธ๋ฆฌ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ต์ํค๊ณ , ์์ธก ๊ฒฐ๊ณผ๋ฅผ ์์๋ธํฉ๋๋ค.
- ํน์ง์ ๋ฌด์์ ์ ํ: ๊ฐ ๋ ธ๋์์ ๋ถํ ํ ๋ ์ฌ์ฉํ ํน์ง์ ๋ฌด์์๋ก ์ ํํฉ๋๋ค.
๐ก ๋๋ค ํฌ๋ ์คํธ์ ์ฐจ์ด
์ ๋ ๊ฐ์ธ์ ์ผ๋ก ๋๋ค ํฌ๋ ์คํธ์ ์์คํธ๋ผ ํธ๋ฆฌ์ ๊ฐ๋ ์ด ๋ง์ด ํผ๋์ค๋ฝ๋๋ผ๊ณ ์โฆ ๊ทธ๋์ ์ ๋ฆฌํ์ต๋๋ค!
- ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์๋ธ(ensemble) ๋ฐฉ์์ ์์ฌ๊ฒฐ์ ๋๋ฌด(decision tree) ๋ชจ๋ธ์ด๋ผ๋ ์ ์์ ์ ์ฌํ์ง๋ง, ๋ช ๊ฐ์ง ์ค์ํ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
๋๋ค ํฌ๋ ์คํธ(Random Forest)์์์คํธ๋ผ ํธ๋ฆฌ(Extra Trees)์ ์ฐจ์ด์ ์ ๋ช ํํ๊ฒ ์ดํดํ๊ธฐ ์ํด์๋ ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ ธ๋ ๋ถํ ๋ฐฉ์๊ณผ ์ํ๋ง ๋ฐฉ์์ ์ฐจ์ด๋ฅผ ์ฃผ์ ๊น๊ฒ ์ดํด๋ด์ผ ํฉ๋๋ค.
๐ณ๐ณ 1. ๋๋ค ํฌ๋ ์คํธ (Random Forest) ๐ณ๐ณ
- ๋ถํธ์คํธ๋ฉ ์ํ๋ง (Bootstrap Sampling, ์์ด):
- ๊ฐ ํธ๋ฆฌ๋ ์๋ณธ ๋ฐ์ดํฐ์์ ๋ฌด์์๋ก ์ํ์ ์ ํํ์ฌ ํ์ตํจ.
- ์ํ๋ง์ ๋ณต์ ์ถ์ถ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์ผ๋ถ ๋ฐ์ดํฐ ํฌ์ธํธ๊ฐ ์ฌ๋ฌ ๋ฒ ์ ํ๋ ์ ์์.
- ํผ์ฒ ๋ฌด์์์ฑ (Feature Sampling, ๋์ผ):
- ๊ฐ ๋ ธ๋๋ฅผ ๋ถํ ํ ๋, ์ ์ฒด ํผ์ฒ ์ค ๋ฌด์์๋ก ์ ํ๋ ํผ์ฒ์ ๋ถ๋ถ์งํฉ์ ์ฌ์ฉํจ.
- ๋ ธ๋ ์ํ ๋ถํ (Node Sample Splits, ์์ด):
- ๊ฐ ๋ ธ๋์์ ์ต์ ์ ๋ถํ ์ ์ฐพ๊ธฐ ์ํด ์ ํ๋ ํผ์ฒ์ ๋ถ๋ถ์งํฉ์ ์ฌ์ฉํจ.
- ์ ํ๋ ํผ์ฒ๋ค ์ค์์ ๋ถํ ๊ธฐ์ค์ด ๋๋ ์๊ณ๊ฐ์ ์ฐพ์.
๐ฒ๐ฒ 2. ์์คํธ๋ผ ํธ๋ฆฌ (Extra Trees) ๐ฒ๐ฒ
- ๋ถํธ์คํธ๋ฉ ์ํ๋ง ์์ (No Bootstrap Sampling, ์์ด):
- ๋ถํธ์คํธ๋ฉ ์ํ๋ง์ ์ฌ์ฉํ์ง ์์.
- ์ ์ฒด ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํ์ฌ ๊ฐ ํธ๋ฆฌ๋ฅผ ํ์ตํจ.
- ํผ์ฒ ๋ฌด์์์ฑ (Feature Sampling, ๋์ผ):
- ๊ฐ ๋ ธ๋๋ฅผ ๋ถํ ํ ๋, ์ ์ฒด ํผ์ฒ ์ค ๋ฌด์์๋ก ์ ํ๋ ํผ์ฒ์ ๋ถ๋ถ์งํฉ์ ์ฌ์ฉํจ.
- ๋ ธ๋ ๋๋ค ๋ถํ (Node Random Splits, ์์ด):
- ์ ํ๋ ํผ์ฒ์ ๋ํด ๋ถํ ์๊ณ๊ฐ์ ๋ฌด์์๋ก ์ ํํจ.
- ์ฌ๋ฌ ๋ฌด์์ ๋ถํ ์ค ๊ฐ์ฅ ์ข์ ๋ถํ ์ ์ ํํจ.
- ์ด ๊ณผ์ ์์ ๋ฌด์์์ฑ์ด ๋ ๋ง์ด ๋์ ๋์ด, ๊ณ์ฐ ์๋๊ฐ ๋นจ๋ผ์ง๊ณ ํธ๋ฆฌ๋ค์ด ์๋ก ๋ ๋ ๋ฆฝ์ ์.
ํ์ด์ฌ ์ฝ๋ ์์
์๋๋ scikit-learn ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ Extra Trees๋ฅผ ๊ตฌํํ๋ ์์ ์
๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from sklearn.datasets import load_iris
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# ๋ฐ์ดํฐ ๋ก๋
iris = load_iris()
X, y = iris.data, iris.target
# ํ์ต ๋ฐ์ดํฐ์ ํ
์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Extra Trees ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต
clf = ExtraTreesClassifier(n_estimators=100, max_depth=3, random_state=42)
clf.fit(X_train, y_train)
# ์์ธก ๋ฐ ํ๊ฐ
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
# ์ค์ ํน์ง ์๊ฐํ
feature_importances = clf.feature_importances_
features = iris.feature_names
importance_df = pd.DataFrame({'Feature': features, 'Importance': feature_importances})
plt.figure(figsize=(10, 6))
sns.barplot(x='Importance', y='Feature', data=importance_df)
plt.title('Feature Importance in Extra Trees')
plt.show()
์ฝ๋ ์ค๋ช
- ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ๋ถํ :
load_iris()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ด๋ฆฌ์ค ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ,train_test_split()์ ํตํด ํ์ต ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ ํฉ๋๋ค. - ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต:
ExtraTreesClassifier๋ฅผ ์ฌ์ฉํ์ฌ Extra Trees ๋ชจ๋ธ์ ์์ฑํ๊ณ ,fit()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต์ํต๋๋ค. ์ฌ๊ธฐ์๋ 100๊ฐ์ ํธ๋ฆฌ์ ์ต๋ ๊น์ด 3์ ์ค์ ํ์ต๋๋ค. - ์์ธก ๋ฐ ํ๊ฐ: ํ์ต๋ ๋ชจ๋ธ๋ก ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๊ณ , ์ ํ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ค์ ํน์ง ์๊ฐํ:
feature_importances_์์ฑ์ ์ฌ์ฉํ์ฌ ๊ฐ ํน์ง์ ์ค์๋๋ฅผ ๊ณ์ฐํ๊ณ ,seaborn์ ์ฌ์ฉํ์ฌ ๋ฐ ๊ทธ๋ํ๋ก ์๊ฐํํฉ๋๋ค.
6. XGBoost (Extreme Gradient Boosting)

์ถ์ฒ: ResearchGate, Flow chart of XGBoost
๊ฐ๋ ๋ฐ ์๋ฆฌ
XGBoost (Extreme Gradient Boosting)๋ ๊ทธ๋๋์ธํธ ๋ถ์คํ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฅํ์ฌ ์ฑ๋ฅ๊ณผ ํจ์จ์ฑ์ ํฌ๊ฒ ํฅ์์ํจ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. XGBoost๋ ์ ๊ทํ, ๋ณ๋ ฌ ์ฒ๋ฆฌ, ์กฐ๊ธฐ ์ข ๋ฃ ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ์ต์ ํ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ๊ธฐ์กด์ ๊ทธ๋๋์ธํธ ๋ถ์คํ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ๋ฐ์ด๋ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ฃผ์ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ ๊ทํ (Regularization): L1, L2 ์ ๊ทํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ๋ณต์ก๋๋ฅผ ์ ์ดํ๊ณ ๊ณผ์ ํฉ์ ๋ฐฉ์งํฉ๋๋ค.
- ๋ณ๋ ฌ ์ฒ๋ฆฌ (Parallel Processing): ๋ค์ค ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต ์๋๋ฅผ ํฅ์์ํต๋๋ค.
- ์กฐ๊ธฐ ์ข ๋ฃ (Early Stopping): ๊ฒ์ฆ ๋ฐ์ดํฐ์ ์ฑ๋ฅ ํฅ์์ด ๋ฉ์ถ๋ฉด ํ์ต์ ์กฐ๊ธฐ ์ข ๋ฃํ์ฌ ๊ณผ์ ํฉ์ ๋ฐฉ์งํฉ๋๋ค.
- ๋ถํ ๊ฒ์ ์ต์ ํ: ๋ถํ ์ ์ ํจ์จ์ ์ผ๋ก ์ฐพ๊ธฐ ์ํด ํ์คํ ๊ทธ๋จ ๊ธฐ๋ฐ ์ ๊ทผ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
ํ์ด์ฌ ์ฝ๋ ์์
์๋๋ xgboost ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ XGBoost๋ฅผ ๊ตฌํํ๋ ์์ ์
๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import xgboost as xgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# ๋ฐ์ดํฐ ๋ก๋
iris = load_iris()
X, y = iris.data, iris.target
# ํ์ต ๋ฐ์ดํฐ์ ํ
์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# XGBoost ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต
clf = xgb.XGBClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42, use_label_encoder=False)
clf.fit(X_train, y_train, eval_metric='logloss')
# ์์ธก ๋ฐ ํ๊ฐ
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
# ์ค์ ํน์ง ์๊ฐํ
feature_importances = clf.feature_importance()
features = iris.feature_names
importance_df = pd.DataFrame({'Feature': features, 'Importance': feature_importances})
plt.figure(figsize=(10, 6))
sns.barplot(x='Importance', y='Feature', data=importance_df)
plt.title('Feature Importance in XGBoost')
plt.show()
์ฝ๋ ์ค๋ช
- ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ๋ถํ :
load_iris()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ด๋ฆฌ์ค ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ,train_test_split()์ ํตํด ํ์ต ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ ํฉ๋๋ค. - ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต:
XGBClassifier๋ฅผ ์ฌ์ฉํ์ฌ XGBoost ๋ชจ๋ธ์ ์์ฑํ๊ณ ,fit()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต์ํต๋๋ค. ์ฌ๊ธฐ์๋ 100๊ฐ์ ํธ๋ฆฌ, ํ์ต๋ฅ 0.1, ์ต๋ ๊น์ด 3์ผ๋ก ์ค์ ํ์ต๋๋ค.use_label_encoder=False๋ ์ต์ ๋ฒ์ ์ XGBoost์์ ๊ฒฝ๊ณ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ์ค์ ์ ๋๋ค. - ์์ธก ๋ฐ ํ๊ฐ: ํ์ต๋ ๋ชจ๋ธ๋ก ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๊ณ , ์ ํ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ค์ ํน์ง ์๊ฐํ:
feature_importance()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ํน์ง์ ์ค์๋๋ฅผ ๊ณ์ฐํ๊ณ ,seaborn์ ์ฌ์ฉํ์ฌ ๋ฐ ๊ทธ๋ํ๋ก ์๊ฐํํฉ๋๋ค.
7. LightGBM (Light Gradient Boosting Machine)

์ถ์ฒ : https://www.linkedin.com/pulse/xgboost-vs-lightgbm-ashik-kumar/
๊ฐ๋ ๋ฐ ์๋ฆฌ
LightGBM (Light Gradient Boosting Machine)์ ๋์ฉ๋ ๋ฐ์ดํฐ์ ๊ณ ์ฐจ์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋ ๊ทธ๋๋์ธํธ ๋ถ์คํ ํ๋ ์์ํฌ์ ๋๋ค. LightGBM์ ๋ฆฌํ ์ค์ฌ ํธ๋ฆฌ ๋ถํ ๋ฐฉ์๊ณผ ์ฌ๋ฌ ์ต์ ํ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ํ์ต ์๋๋ฅผ ํฌ๊ฒ ํฅ์์ํต๋๋ค. ์ฃผ์ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฆฌํ ์ค์ฌ ํธ๋ฆฌ ๋ถํ (Leaf-wise Tree Growth): ํธ๋ฆฌ์ ๋ฆฌํ๋ฅผ ํ์ฅํ๋ ๋ฐฉ์์ผ๋ก, ์์ค์ ๊ฐ์ฅ ๋ง์ด ์ค์ด๋ ๋ฆฌํ๋ฅผ ์ ํํ์ฌ ๋ถํ ํฉ๋๋ค. ์ด๋ ๊น์ด ์ค์ฌ ๋ถํ ๋ณด๋ค ๋ ํจ๊ณผ์ ์ ๋๋ค.
- Gradient-based One-Side Sampling (GOSS): ์ค์ํ ์ํ์ ๋ ๋ง์ด ์ฌ์ฉํ๊ณ ๋ ์ค์ํ ์ํ์ ์ค์ฌ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ์ค์ ๋๋ค.
- Exclusive Feature Bundling (EFB): ์ํธ ๋ฐฐํ์ ์ธ ํน์ง์ ํ๋๋ก ๋ฌถ์ด ํน์ง์ ์๋ฅผ ์ค์ ๋๋ค.
- Histogram-based Decision Tree: ์ฐ์ํ ํน์ง์ ํ์คํ ๊ทธ๋จ์ผ๋ก ๋ณํํ์ฌ ๋น ๋ฅธ ๋ถํ ์ ์ ์ฐพ์ต๋๋ค.
ํ์ด์ฌ ์ฝ๋ ์์
์๋๋ lightgbm ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ LightGBM์ ๊ตฌํํ๋ ์์ ์
๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import lightgbm as lgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# ๋ฐ์ดํฐ ๋ก๋
iris = load_iris()
X, y = iris.data, iris.target
# ํ์ต ๋ฐ์ดํฐ์ ํ
์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# LightGBM ๋ฐ์ดํฐ์
์์ฑ
train_data = lgb.Dataset(X_train, label=y_train)
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)
# LightGBM ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ ์ค์
params = {
'boosting_type': 'gbdt',
'objective': 'multiclass',
'num_class': 3,
'metric': 'multi_logloss',
'learning_rate': 0.1,
'max_depth': 3,
'num_leaves': 31,
'random_state': 42
}
# ๋ชจ๋ธ ํ์ต
clf = lgb.train(params, train_data, num_boost_round=100, valid_sets=[test_data], early_stopping_rounds=10)
# ์์ธก ๋ฐ ํ๊ฐ
y_pred = clf.predict(X_test, num_iteration=clf.best_iteration)
y_pred = [np.argmax(line) for line in y_pred]
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
# ์ค์ ํน์ง ์๊ฐํ
feature_importances = clf.feature_importance()
features = iris.feature_names
importance_df = pd.DataFrame({'Feature': features, 'Importance': feature_importances})
plt.figure(figsize=(10, 6))
sns.barplot(x='Importance', y='Feature', data=importance_df)
plt.title('Feature Importance in LightGBM')
plt.show()
์ฝ๋ ์ค๋ช
- ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ๋ถํ :
load_iris()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ด๋ฆฌ์ค ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ,train_test_split()์ ํตํด ํ์ต ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ ํฉ๋๋ค. - LightGBM ๋ฐ์ดํฐ์
์์ฑ:
lgb.Dataset๋ฅผ ์ฌ์ฉํ์ฌ LightGBM์ ๋ฐ์ดํฐ์ ํ์์ผ๋ก ๋ณํํฉ๋๋ค. - ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ ์ค์ :
params๋์ ๋๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์ค ํด๋์ค ๋ถ๋ฅ๋ฅผ ์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํฉ๋๋ค. - ๋ชจ๋ธ ํ์ต:
lgb.train()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ํ์ต์ํต๋๋ค.early_stopping_rounds๋ฅผ ์ค์ ํ์ฌ ๊ฒ์ฆ ๋ฐ์ดํฐ์ ์ฑ๋ฅ ํฅ์์ด ๋ฉ์ถ๋ฉด ํ์ต์ ์กฐ๊ธฐ ์ข ๋ฃํฉ๋๋ค. - ์์ธก ๋ฐ ํ๊ฐ: ํ์ต๋ ๋ชจ๋ธ๋ก ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๊ณ , ์ ํ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ค์ ํน์ง ์๊ฐํ:
feature_importance()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ํน์ง์ ์ค์๋๋ฅผ ๊ณ์ฐํ๊ณ ,seaborn์ ์ฌ์ฉํ์ฌ ๋ฐ ๊ทธ๋ํ๋ก ์๊ฐํํฉ๋๋ค.
8. CatBoost (Categorical Boosting)

์ถ์ฒ : https://www.mdpi.com/sensors/sensors-23-01811/article_deploy/html/images/sensors-23-01811-g003.png
๊ฐ๋ ๋ฐ ์๋ฆฌ
CatBoost (Categorical Boosting)๋ ๋ฒ์ฃผํ ๋ณ์๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋ ๊ทธ๋๋์ธํธ ๋ถ์คํ ํ๋ ์์ํฌ์ ๋๋ค. CatBoost๋ ๋ฒ์ฃผํ ๋ณ์์ ๊ณ ์ ํ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ๊ณผ ์์ฐจ ๋ถ์คํ ๊ธฐ๋ฒ์ ํตํด ์์ธก ์ฑ๋ฅ๊ณผ ํ์ต ์๋๋ฅผ ํฅ์์ํต๋๋ค. ์ฃผ์ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์์ฐจ ๋ถ์คํ (Ordered Boosting): ๋ฐ์ดํฐ ์์๋ฅผ ๋ฌด์์๋ก ์์ด ๋ถ์คํ ๋จ๊ณ๋ง๋ค ์๋ก์ด ์์๋ฅผ ์ฌ์ฉํ์ฌ ๊ณผ์ ํฉ์ ๋ฐฉ์งํฉ๋๋ค.
- ๋ฒ์ฃผํ ๋ณ์ ์ฒ๋ฆฌ: ๊ฐ ๋ฒ์ฃผํ ๋ณ์์ ๋ํด ๊ณ ์ ํ ํต๊ณ๋(ํ๊ท ๋ชฉํ๊ฐ ๋ฑ)์ ์ฌ์ฉํ์ฌ ๋ณํํฉ๋๋ค.
- ๋์นญ ํธ๋ฆฌ (Symmetric Trees): ๊ท ํ ์กํ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์ธก ์๋๋ฅผ ๋์ด๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํฉ๋๋ค.
- ๊ธฐํ ์ต์ ํ: GPU ์ง์, ์กฐ๊ธฐ ์ข ๋ฃ, ์ ๊ทํ ๋ฑ์ ๋ค์ํ ์ต์ ํ ๊ธฐ๋ฒ์ ํฌํจํฉ๋๋ค.
ํ์ด์ฌ ์ฝ๋ ์์
์๋๋ catboost ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ CatBoost๋ฅผ ๊ตฌํํ๋ ์์ ์
๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import catboost as cb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# ๋ฐ์ดํฐ ๋ก๋
iris = load_iris()
X, y = iris.data, iris.target
# ํ์ต ๋ฐ์ดํฐ์ ํ
์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# CatBoost ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต
clf = cb.CatBoostClassifier(iterations=100, learning_rate=0.1, depth=3, random_seed=42, verbose=0)
clf.fit(X_train, y_train)
# ์์ธก ๋ฐ ํ๊ฐ
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
# ์ค์ ํน์ง ์๊ฐํ
feature_importances = clf.get_feature_importance()
features = iris.feature_names
importance_df = pd.DataFrame({'Feature': features, 'Importance': feature_importances})
plt.figure(figsize=(10, 6))
sns.barplot(x='Importance', y='Feature', data=importance_df)
plt.title
('Feature Importance in CatBoost')
plt.show()
์ฝ๋ ์ค๋ช
- ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ๋ถํ :
load_iris()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ด๋ฆฌ์ค ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ,train_test_split()์ ํตํด ํ์ต ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ ํฉ๋๋ค. - ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต:
CatBoostClassifier๋ฅผ ์ฌ์ฉํ์ฌ CatBoost ๋ชจ๋ธ์ ์์ฑํ๊ณ ,fit()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต์ํต๋๋ค. ์ฌ๊ธฐ์๋ 100๋ฒ์ ๋ฐ๋ณต(iterations), ํ์ต๋ฅ 0.1, ์ต๋ ๊น์ด 3์ ์ค์ ํ์ต๋๋ค. - ์์ธก ๋ฐ ํ๊ฐ: ํ์ต๋ ๋ชจ๋ธ๋ก ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๊ณ , ์ ํ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ค์ ํน์ง ์๊ฐํ:
get_feature_importance()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ํน์ง์ ์ค์๋๋ฅผ ๊ณ์ฐํ๊ณ ,seaborn์ ์ฌ์ฉํ์ฌ ๋ฐ ๊ทธ๋ํ๋ก ์๊ฐํํฉ๋๋ค.
9. Histogram-based Gradient Boosting (HGBT)

์ถ์ฒ : https://ars.els-cdn.com/content/image/1-s2.0-S0926580523000274-gr3.jpg
๊ฐ๋ ๋ฐ ์๋ฆฌ
ํ์คํ ๊ทธ๋จ ๊ธฐ๋ฐ ๊ทธ๋๋์ธํธ ๋ถ์คํ ์ ํ์คํ ๊ทธ๋จ์ ์ฌ์ฉํ์ฌ ์ฐ์ํ ํน์ง์ ๋ฒํท์ผ๋ก ๊ทธ๋ฃนํํ์ฌ ๋ถํ ์ ์ ์ฐพ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด ์ ๊ทผ๋ฒ์ ๊ณ์ฐ ์๋๋ฅผ ํฌ๊ฒ ํฅ์์ํค๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๋ฉฐ, ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ๋ฆฌํฉ๋๋ค. ์ฃผ์ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํ์คํ ๊ทธ๋จ ๋ณํ: ์ฐ์ํ ํน์ง์ ์ผ์ ํ ๊ฐ๊ฒฉ ๋๋ ๋ฐ์ดํฐ ๋ถํฌ์ ๋ฐ๋ผ ๋ฒํท์ผ๋ก ๋ณํํฉ๋๋ค.
- ๋น ๋ฅธ ๋ถํ ์ ์ฐพ๊ธฐ: ๊ฐ ๋ฒํท ๋ด์์ ์์ค ํจ์๋ฅผ ์ต์ํํ๋ ๋ถํ ์ ์ ๋น ๋ฅด๊ฒ ์ฐพ์ต๋๋ค.
- ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ํ์คํ ๊ทธ๋จ ๊ธฐ๋ฐ ์ ๊ทผ๋ฒ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํตํด ๋์ฉ๋ ๋ฐ์ดํฐ์ ์์๋ ๋์ ํจ์จ์ฑ์ ์ ๊ณตํฉ๋๋ค.
ํ์ด์ฌ ์ฝ๋ ์์
์๋๋ scikit-learn์ HistGradientBoostingClassifier๋ฅผ ์ฌ์ฉํ์ฌ ํ์คํ ๊ทธ๋จ ๊ธฐ๋ฐ ๊ทธ๋๋์ธํธ ๋ถ์คํ
์ ๊ตฌํํ๋ ์์ ์
๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from sklearn.experimental import enable_hist_gradient_boosting
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# ๋ฐ์ดํฐ ๋ก๋
iris = load_iris()
X, y = iris.data, iris.target
# ํ์ต ๋ฐ์ดํฐ์ ํ
์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# ํ์คํ ๊ทธ๋จ ๊ธฐ๋ฐ ๊ทธ๋๋์ธํธ ๋ถ์คํ
๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต
clf = HistGradientBoostingClassifier(max_iter=100, learning_rate=0.1, max_depth=3, random_state=42)
clf.fit(X_train, y_train)
# ์์ธก ๋ฐ ํ๊ฐ
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
# ์ค์ ํน์ง ์๊ฐํ
feature_importances = clf.feature_importances_
features = iris.feature_names
importance_df = pd.DataFrame({'Feature': features, 'Importance': feature_importances})
plt.figure(figsize=(10, 6))
sns.barplot(x='Importance', y='Feature', data=importance_df)
plt.title('Feature Importance in Histogram-based Gradient Boosting')
plt.show()
์ฝ๋ ์ค๋ช
- ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ๋ถํ :
load_iris()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ด๋ฆฌ์ค ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ,train_test_split()์ ํตํด ํ์ต ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ๋ถํ ํฉ๋๋ค. - ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต:
HistGradientBoostingClassifier๋ฅผ ์ฌ์ฉํ์ฌ ํ์คํ ๊ทธ๋จ ๊ธฐ๋ฐ ๊ทธ๋๋์ธํธ ๋ถ์คํ ๋ชจ๋ธ์ ์์ฑํ๊ณ ,fit()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต์ํต๋๋ค. ์ฌ๊ธฐ์๋ 100๋ฒ์ ๋ฐ๋ณต(iterations), ํ์ต๋ฅ 0.1, ์ต๋ ๊น์ด 3์ ์ค์ ํ์ต๋๋ค. - ์์ธก ๋ฐ ํ๊ฐ: ํ์ต๋ ๋ชจ๋ธ๋ก ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๊ณ , ์ ํ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ค์ ํน์ง ์๊ฐํ:
feature_importances_์์ฑ์ ์ฌ์ฉํ์ฌ ๊ฐ ํน์ง์ ์ค์๋๋ฅผ ๊ณ์ฐํ๊ณ ,seaborn์ ์ฌ์ฉํ์ฌ ๋ฐ ๊ทธ๋ํ๋ก ์๊ฐํํฉ๋๋ค.
10. ์ ๋ฆฌ
๋ค์์ scikit-learn์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ํธ๋ฆฌ ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ํ์ตํ๊ณ ๊ฒ์ฆ ์ฑ๋ฅ์ ๋น๊ตํ๋ ์ฝ๋์
๋๋ค. ์ด ์ฝ๋๋ ์์ด๋ฆฌ์ค ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ๋ฐ์ดํฐํ๋ ์ ํํ๋ก ์ ์ฅํฉ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, AdaBoostClassifier, ExtraTreesClassifier, HistGradientBoostingClassifier
import xgboost as xgb
import lightgbm as lgb
import catboost as cb
import pandas as pd
# ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ๋ถํ
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# ์๊ณ ๋ฆฌ์ฆ ๋ฆฌ์คํธ
classifiers = {
"Decision Tree": DecisionTreeClassifier(max_depth=3, random_state=42),
"Random Forest": RandomForestClassifier(n_estimators=100, max_depth=3, random_state=42),
"Gradient Boosting": GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42),
"AdaBoost": AdaBoostClassifier(estimator=DecisionTreeClassifier(max_depth=1, random_state=42), n_estimators=50, learning_rate=1.0, random_state=42),
"Extra Trees": ExtraTreesClassifier(n_estimators=100, max_depth=3, random_state=42),
"XGBoost": xgb.XGBClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42, use_label_encoder=False, eval_metric='logloss'),
"LightGBM": lgb.LGBMClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42),
"CatBoost": cb.CatBoostClassifier(iterations=100, learning_rate=0.1, depth=3, random_seed=42, verbose=0),
"HistGradientBoosting": HistGradientBoostingClassifier(max_iter=100, learning_rate=0.1, max_depth=3, random_state=42)
}
# ์ฑ๋ฅ ์ ์ฅ์ ์ํ ๋ฆฌ์คํธ
results = []
# ์๊ณ ๋ฆฌ์ฆ๋ณ ์ฑ๋ฅ ํ๊ฐ
for name, clf in classifiers.items():
clf.fit(X_train, y_train)
train_accuracy = clf.score(X_train, y_train)
test_accuracy = clf.score(X_test, y_test)
cross_val_scores = cross_val_score(clf, X, y, cv=5)
cross_val_mean = cross_val_scores.mean()
cross_val_std = cross_val_scores.std()
results.append({
"Algorithm": name,
"Train Accuracy": train_accuracy,
"Test Accuracy": test_accuracy,
"Cross-Validation Mean": cross_val_mean,
"Cross-Validation Std": cross_val_std
})
# ๋ฆฌ์คํธ๋ฅผ ๋ฐ์ดํฐํ๋ ์์ผ๋ก ๋ณํ
results_df = pd.DataFrame(results)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
print(results_df)

์ค๋์ ํธ๋ฆฌ ๊ธฐ๋ฐ ML ์๊ณ ๋ฆฌ์ฆ ์ ๋ฐ์ ๋ํด์ ์ ๋ฆฌํ๊ณ , ๊ธฐ๋ณธ์ ์ธ ์ฝ๋๊น์ง ์ ์ด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ดค๋๋ฐ์ ๐ ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ํ๋ฒ์ฏค ์ ๋ฆฌํ๊ณ ๊ฐ๊ณ ์ถ์๋ ๊ฐ๋ ์ด๋ผ ์ ์ตํ๋ ์๊ฐ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค!!
๊ฐ์ฌํฉ๋๋ค ๐