[ํธ๋ฆฌ] ํธ๋ฆฌ ๊ธฐ๋ฐ ML ์๊ณ ๋ฆฌ์ฆ
์๋ณธ ๊ฒ์๊ธ: https://velog.io/@euisuk-chung/ํธ๋ฆฌ-ํธ๋ฆฌ-๊ธฐ๋ฐ-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 ์๊ณ ๋ฆฌ์ฆ ์ ๋ฐ์ ๋ํด์ ์ ๋ฆฌํ๊ณ , ๊ธฐ๋ณธ์ ์ธ ์ฝ๋๊น์ง ์ ์ด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ดค๋๋ฐ์ ๐ ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ํ๋ฒ์ฏค ์ ๋ฆฌํ๊ณ ๊ฐ๊ณ ์ถ์๋ ๊ฐ๋ ์ด๋ผ ์ ์ตํ๋ ์๊ฐ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค!!
๊ฐ์ฌํฉ๋๋ค ๐