[트리] 트리 기반 ML μ•Œκ³ λ¦¬μ¦˜

Posted by Euisuk's Dev Log on June 24, 2024

[트리] 트리 기반 ML μ•Œκ³ λ¦¬μ¦˜

원본 κ²Œμ‹œκΈ€: https://velog.io/@euisuk-chung/트리-트리-기반-ML-μ•Œκ³ λ¦¬μ¦˜

트리 기반 ML μ•Œκ³ λ¦¬μ¦˜

트리 기반 λ¨Έμ‹ λŸ¬λ‹(ML) μ•Œκ³ λ¦¬μ¦˜μ€ λ°μ΄ν„°μ˜ νŠΉμ§•μ„ 기반으둜 트리λ₯Ό μƒμ„±ν•˜μ—¬ 예츑(Regression) λ˜λŠ” λΆ„λ₯˜(Classification)λ₯Ό μˆ˜ν–‰ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. 이 μ•Œκ³ λ¦¬μ¦˜μ€ 루트 λ…Έλ“œμ—μ„œ μ‹œμž‘ν•˜μ—¬ λ‚΄λΆ€ λ…Έλ“œμ—μ„œ 데이터λ₯Ό λΆ„ν• ν•˜κ³ , 리프 λ…Έλ“œμ—μ„œ μ΅œμ’… μ˜ˆμΈ‘κ°’μ„ μ‚°μΆœν•©λ‹ˆλ‹€. 트리 기반 μ•Œκ³ λ¦¬μ¦˜μ€ λ°μ΄ν„°μ˜ ꡬ쑰λ₯Ό μ‹œκ°μ μœΌλ‘œ ν‘œν˜„ν•  수 μžˆμ–΄ 해석이 μš©μ΄ν•˜λ©°, λ‹€μ–‘ν•œ 데이터셋에 λŒ€ν•΄ 높은 μ„±λŠ₯을 λ³΄μž…λ‹ˆλ‹€.

μ•Œκ³ λ¦¬μ¦˜μ˜ μž₯단점

μž₯점

  1. 해석 μš©μ΄μ„± (Interpretability): 트리 κ΅¬μ‘°λŠ” μ‹œκ°μ μœΌλ‘œ μ΄ν•΄ν•˜κΈ° 쉽고, λͺ¨λΈμ˜ κ²°μ • 과정을 λͺ…ν™•ν•˜κ²Œ λ³΄μ—¬μ€λ‹ˆλ‹€. μ΄λŠ” λͺ¨λΈμ΄ μ–΄λ–»κ²Œ μ˜ˆμΈ‘μ„ μˆ˜ν–‰ν•˜λŠ”μ§€ μ‰½κ²Œ μ„€λͺ…ν•  수 있게 ν•΄μ£Όλ©°, 특히 μ˜μ‚¬ 결정이 μ€‘μš”ν•œ λΆ„μ•Όμ—μ„œ μœ μš©ν•©λ‹ˆλ‹€.
  2. λΉ„μ„ ν˜• 관계 λͺ¨λΈλ§ (Non-linear Relationships): 트리 기반 μ•Œκ³ λ¦¬μ¦˜μ€ λΉ„μ„ ν˜•μ μΈ 데이터 관계λ₯Ό 잘 포착할 수 μžˆμ–΄ λ³΅μž‘ν•œ 데이터 ꡬ쑰λ₯Ό 효과적으둜 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  3. νŠΉμ§• 선택 (Feature Selection): μ•Œκ³ λ¦¬μ¦˜μ΄ μ€‘μš”ν•œ νŠΉμ§•μ„ μžλ™μœΌλ‘œ μ„ νƒν•˜κ³  λΆˆν•„μš”ν•œ νŠΉμ§•μ„ λ¬΄μ‹œν•˜μ—¬ λͺ¨λΈμ˜ μ„±λŠ₯을 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.
  4. λ‹€μ–‘ν•œ 데이터 νƒ€μž… 처리 (Handling Various Data Types): μ—°μ†ν˜• 및 λ²”μ£Όν˜• 데이터λ₯Ό λͺ¨λ‘ μ²˜λ¦¬ν•  수 μžˆμ–΄ λ‹€μ–‘ν•œ μœ ν˜•μ˜ 데이터셋에 μœ μ—°ν•˜κ²Œ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  5. λ‘œλ²„μŠ€νŠΈν•¨ (Robustness): 트리 기반 λͺ¨λΈμ€ μ΄μƒμΉ˜(outliers)λ‚˜ 작음(noise)에 κ°•ν•œ νŠΉμ„±μ„ λ³΄μž…λ‹ˆλ‹€. μ΄λŠ” λͺ¨λΈμ΄ λ‹€μ–‘ν•œ 데이터 μ‘°κ±΄μ—μ„œλ„ μ•ˆμ •μ μœΌλ‘œ μž‘λ™ν•˜κ²Œ ν•©λ‹ˆλ‹€.

단점

  1. 과적합 μœ„ν—˜ (Risk of Overfitting): 단일 μ˜μ‚¬κ²°μ •λ‚˜λ¬΄λŠ” 과적합에 λ―Όκ°ν•˜μ—¬ ν•™μŠ΅ 데이터에 λ„ˆλ¬΄ 맞좰질 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ κ°€μ§€μΉ˜κΈ°(pruning) λ“±μ˜ 기법이 ν•„μš”ν•©λ‹ˆλ‹€.
  2. 높은 계산 λΉ„μš© (High Computational Cost): λŒ€κ·œλͺ¨ λ°μ΄ν„°μ…‹μ—μ„œ 트리λ₯Ό ν•™μŠ΅ν•˜κ³  μ˜ˆμΈ‘ν•˜λŠ” 데 μ‹œκ°„μ΄ 많이 μ†Œμš”λ  수 μžˆμŠ΅λ‹ˆλ‹€. 특히 λΆ€μŠ€νŒ… 계열 λͺ¨λΈ(예: GBM, AdaBoost λ“±)은 λ§Žμ€ 트리λ₯Ό ν•™μŠ΅ν•΄μ•Ό ν•˜λ―€λ‘œ 계산 λΉ„μš©μ΄ 더 λ†’μŠ΅λ‹ˆλ‹€.
  3. 데이터 민감성 (Data Sensitivity): 트리 기반 λͺ¨λΈμ€ λ°μ΄ν„°μ˜ μž‘μ€ 변화에도 λ―Όκ°ν•˜κ²Œ λ°˜μ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” λͺ¨λΈμ˜ μ•ˆμ •μ„±μ„ μ €ν•˜μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  4. λ³€μˆ˜ κ°„ μƒν˜Έμž‘μš© λ³΅μž‘μ„± (Complexity of Interactions): 트리 ꡬ쑰가 κΉŠμ–΄μ§ˆμˆ˜λ‘ λ³€μˆ˜ κ°„ μƒν˜Έμž‘μš©μ΄ λ³΅μž‘ν•΄μ§ˆ 수 있으며, μ΄λŠ” λͺ¨λΈμ˜ 해석을 μ–΄λ ΅κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.
  5. κ²°μ • 경계 λΆˆμ—°μ†μ„± (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 (μ˜μ‚¬κ²°μ •λ‚˜λ¬΄)

좜처: 직μž₯인 κ³ λ‹ˆμ˜ 데이터 뢄석

κ°œλ… 및 원리

μ˜μ‚¬κ²°μ •λ‚˜λ¬΄λŠ” λ°μ΄ν„°μ˜ νŠΉμ§•μ„ 기반으둜 λΆ„ν• ν•˜μ—¬ μ˜ˆμΈ‘μ„ μˆ˜ν–‰ν•˜λŠ” λͺ¨λΈμž…λ‹ˆλ‹€. νŠΈλ¦¬λŠ” 루트 λ…Έλ“œμ—μ„œ μ‹œμž‘ν•˜μ—¬ λ‚΄λΆ€ λ…Έλ“œμ—μ„œ λ°μ΄ν„°μ˜ νŠΉμ§•μ— 따라 λΆ„ν• λ˜κ³ , 리프 λ…Έλ“œμ—μ„œ μ΅œμ’… μ˜ˆμΈ‘κ°’μ„ μ‚°μΆœν•©λ‹ˆλ‹€. μ˜μ‚¬κ²°μ •λ‚˜λ¬΄μ˜ μ£Όμš” κ°œλ…μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. λΆ„ν•  κΈ°μ€€ (Split Criterion): 데이터 λΆ„ν• μ˜ 기쀀을 μ •ν•˜λŠ” λ°©λ²•μœΌλ‘œ, μ—”νŠΈλ‘œν”Ό(entropy)와 μ§€λ‹ˆ λΆˆμˆœλ„(gini impurity)κ°€ λŒ€ν‘œμ μž…λ‹ˆλ‹€.
  2. 정보 νšλ“ (Information Gain): νŠΉμ • λΆ„ν•  기쀀에 μ˜ν•΄ 데이터가 μ–Όλ§ˆλ‚˜ 잘 λΆ„ν• λ˜λŠ”μ§€λ₯Ό μΈ‘μ •ν•©λ‹ˆλ‹€. 정보 νšλ“μ΄ μ΅œλŒ€ν™”λ˜λŠ” λ°©ν–₯으둜 트리λ₯Ό λΆ„ν• ν•©λ‹ˆλ‹€.
  3. κ°€μ§€μΉ˜κΈ° (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()

μ½”λ“œ μ„€λͺ…

  1. 데이터 λ‘œλ“œ 및 λΆ„ν• : load_iris() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•„μ΄λ¦¬μŠ€ 데이터λ₯Ό λ‘œλ“œν•˜κ³ , train_test_split()을 톡해 ν•™μŠ΅ 데이터와 ν…ŒμŠ€νŠΈ λ°μ΄ν„°λ‘œ λΆ„ν• ν•©λ‹ˆλ‹€.
  2. λͺ¨λΈ 생성 및 ν•™μŠ΅: DecisionTreeClassifierλ₯Ό μ‚¬μš©ν•˜μ—¬ μ˜μ‚¬κ²°μ •λ‚˜λ¬΄ λͺ¨λΈμ„ μƒμ„±ν•˜κ³ , fit() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•™μŠ΅μ‹œν‚΅λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” μ§€λ‹ˆ λΆˆμˆœλ„λ₯Ό λΆ„ν•  κΈ°μ€€μœΌλ‘œ μ‚¬μš©ν•˜κ³ , μ΅œλŒ€ 깊이λ₯Ό 3으둜 μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€.
  3. 예츑 및 평가: ν•™μŠ΅λœ λͺ¨λΈλ‘œ ν…ŒμŠ€νŠΈ 데이터λ₯Ό μ˜ˆμΈ‘ν•˜κ³ , 정확도λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  4. 트리 μ‹œκ°ν™”: plot_tree() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•™μŠ΅λœ 트리λ₯Ό μ‹œκ°ν™”ν•©λ‹ˆλ‹€. 트리의 각 λ…Έλ“œλŠ” νŠΉμ§•κ³Ό ν΄λž˜μŠ€μ— λŒ€ν•œ 정보λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

2. Random Forest (랜덀 포레슀트)

좜처 : GeeksforGeeks

κ°œλ… 및 원리

랜덀 ν¬λ ˆμŠ€νŠΈλŠ” μ—¬λŸ¬ 개의 μ˜μ‚¬κ²°μ •λ‚˜λ¬΄λ₯Ό μ•™μƒλΈ”ν•˜μ—¬ 예츑 μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” λ°©λ²•μž…λ‹ˆλ‹€. 각 μ˜μ‚¬κ²°μ •λ‚˜λ¬΄λŠ” λ…λ¦½μ μœΌλ‘œ ν•™μŠ΅λ˜λ©°, μ΅œμ’… μ˜ˆμΈ‘μ€ 각 λ‚˜λ¬΄μ˜ μ˜ˆμΈ‘μ„ κ²°ν•©ν•˜μ—¬ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. 랜덀 포레슀트의 μ£Όμš” κ°œλ…μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. λ°°κΉ… (Bagging): λΆ€νŠΈμŠ€νŠΈλž© μƒ˜ν”Œλ§μ„ 톡해 μ—¬λŸ¬ νŠΈλ ˆμ΄λ‹ μ„ΈνŠΈλ₯Ό μƒμ„±ν•˜κ³ , 각 μ„ΈνŠΈμ— λŒ€ν•΄ 독립적인 λͺ¨λΈμ„ ν•™μŠ΅μ‹œν‚΅λ‹ˆλ‹€.
  2. 랜덀 νŠΉμ§• 선택: 각 λ…Έλ“œμ—μ„œ λΆ„ν• ν•  λ•Œ 전체 νŠΉμ§• 쀑 λ¬΄μž‘μœ„λ‘œ μ„ νƒλœ 일뢀 νŠΉμ§•λ§Œμ„ μ‚¬μš©ν•˜μ—¬ λΆ„ν• ν•©λ‹ˆλ‹€.
  3. 앙상블: 각 λ‚˜λ¬΄μ˜ μ˜ˆμΈ‘μ„ 평균 λ‚΄κ±°λ‚˜ λ‹€μˆ˜κ²° νˆ¬ν‘œλ₯Ό 톡해 μ΅œμ’… μ˜ˆμΈ‘μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

파이썬 μ½”λ“œ 예제

μ•„λž˜λŠ” 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()

μ½”λ“œ μ„€λͺ…

  1. 데이터 λ‘œλ“œ 및 λΆ„ν• : load_iris() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•„μ΄λ¦¬μŠ€ 데이터λ₯Ό λ‘œλ“œν•˜κ³ , train_test_split()을 톡해 ν•™μŠ΅ 데이터와 ν…ŒμŠ€νŠΈ λ°μ΄ν„°λ‘œ λΆ„ν• ν•©λ‹ˆλ‹€.
  2. λͺ¨λΈ 생성 및 ν•™μŠ΅: RandomForestClassifierλ₯Ό μ‚¬μš©ν•˜μ—¬ 랜덀 포레슀트 λͺ¨λΈμ„ μƒμ„±ν•˜κ³ , fit() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•™μŠ΅μ‹œν‚΅λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” 100개의 트리λ₯Ό μ‚¬μš©ν•˜κ³ , 각 트리의 μ΅œλŒ€ 깊이λ₯Ό 3으둜 μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€.
  3. 예츑 및 평가: ν•™μŠ΅λœ λͺ¨λΈλ‘œ ν…ŒμŠ€νŠΈ 데이터λ₯Ό μ˜ˆμΈ‘ν•˜κ³ , 정확도λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  4. μ€‘μš” νŠΉμ§• μ‹œκ°ν™”: feature_importances_ 속성을 μ‚¬μš©ν•˜μ—¬ 각 νŠΉμ§•μ˜ μ€‘μš”λ„λ₯Ό κ³„μ‚°ν•˜κ³ , seaborn을 μ‚¬μš©ν•˜μ—¬ λ°” κ·Έλž˜ν”„λ‘œ μ‹œκ°ν™”ν•©λ‹ˆλ‹€.

3. Gradient Boosting (κ·Έλž˜λ””μ–ΈνŠΈ λΆ€μŠ€νŒ…)

좜처 : GeeksforGeeks

κ°œλ… 및 원리

κ·Έλž˜λ””μ–ΈνŠΈ λΆ€μŠ€νŒ…μ€ 순차적으둜 트리λ₯Ό μΆ”κ°€ν•˜μ—¬ 예츑 μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” 앙상블 ν•™μŠ΅ λ°©λ²•μž…λ‹ˆλ‹€. 각 νŠΈλ¦¬λŠ” 이전 트리의 였차λ₯Ό 쀄이기 μœ„ν•΄ ν•™μŠ΅λ˜λ©°, 손싀 ν•¨μˆ˜λ₯Ό μ΅œμ†Œν™”ν•˜λŠ” λ°©ν–₯으둜 트리λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€. κ·Έλž˜λ””μ–ΈνŠΈ λΆ€μŠ€νŒ…μ˜ μ£Όμš” κ°œλ…μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. 순차적 ν•™μŠ΅: λͺ¨λΈμ„ 순차적으둜 ν•™μŠ΅μ‹œν‚€λ©°, 각 λ‹¨κ³„μ—μ„œ 이전 λͺ¨λΈμ˜ μž”μ—¬ 였차λ₯Ό 쀄이기 μœ„ν•΄ μƒˆλ‘œμš΄ λͺ¨λΈμ„ μΆ”κ°€ν•©λ‹ˆλ‹€.
  2. 손싀 ν•¨μˆ˜ (Loss Function): 예츑 였차λ₯Ό ν‰κ°€ν•˜κΈ° μœ„ν•œ ν•¨μˆ˜λ‘œ, 주둜 νšŒκ·€μ—μ„œλŠ” 평균 제곱 였차(MSE), λΆ„λ₯˜μ—μ„œλŠ” 둜그 손싀(Log Loss)을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  3. κ·ΈλΌλ””μ–ΈνŠΈ 계산: 손싀 ν•¨μˆ˜λ₯Ό μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ 각 λ‹¨κ³„μ—μ„œ μž”μ—¬ 였차의 κ·ΈλΌλ””μ–ΈνŠΈλ₯Ό κ³„μ‚°ν•˜μ—¬ λͺ¨λΈμ„ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

파이썬 μ½”λ“œ 예제

μ•„λž˜λŠ” 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()

μ½”λ“œ μ„€λͺ…

  1. 데이터 λ‘œλ“œ 및 λΆ„ν• : load_iris() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•„μ΄λ¦¬μŠ€ 데이터λ₯Ό λ‘œλ“œν•˜κ³ , train_test_split()을 톡해 ν•™μŠ΅ 데이터와 ν…ŒμŠ€νŠΈ λ°μ΄ν„°λ‘œ λΆ„ν• ν•©λ‹ˆλ‹€.
  2. λͺ¨λΈ 생성 및 ν•™μŠ΅: GradientBoostingClassifierλ₯Ό μ‚¬μš©ν•˜μ—¬ κ·Έλž˜λ””μ–ΈνŠΈ λΆ€μŠ€νŒ… λͺ¨λΈμ„ μƒμ„±ν•˜κ³ , fit() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•™μŠ΅μ‹œν‚΅λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” 100개의 트리, ν•™μŠ΅λ₯  0.1, μ΅œλŒ€ 깊이 3으둜 μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€.
  3. 예츑 및 평가: ν•™μŠ΅λœ λͺ¨λΈλ‘œ ν…ŒμŠ€νŠΈ 데이터λ₯Ό μ˜ˆμΈ‘ν•˜κ³ , 정확도λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  4. μ€‘μš” νŠΉμ§• μ‹œκ°ν™”: feature_importances_ 속성을 μ‚¬μš©ν•˜μ—¬ 각 νŠΉμ§•μ˜ μ€‘μš”λ„λ₯Ό κ³„μ‚°ν•˜κ³ , seaborn을 μ‚¬μš©ν•˜μ—¬ λ°” κ·Έλž˜ν”„λ‘œ μ‹œκ°ν™”ν•©λ‹ˆλ‹€.

4. AdaBoost (Adaptive Boosting)

좜처 : Towards AI

κ°œλ… 및 원리

AdaBoost (Adaptive Boosting)λŠ” μ•½ν•œ ν•™μŠ΅κΈ°(Weak Learner)λ₯Ό κ²°ν•©ν•˜μ—¬ κ°•ν•œ ν•™μŠ΅κΈ°(Strong Learner)λ₯Ό λ§Œλ“œλŠ” 앙상블 ν•™μŠ΅ λ°©λ²•μž…λ‹ˆλ‹€. AdaBoostλŠ” 초기 ν•™μŠ΅κΈ°μ˜ 였λ₯˜λ₯Ό λ³΄μ™„ν•˜κΈ° μœ„ν•΄ 후속 ν•™μŠ΅κΈ°μ— κ°€μ€‘μΉ˜λ₯Ό λΆ€μ—¬ν•˜μ—¬ 점차적으둜 μ„±λŠ₯을 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€. μ£Όμš” κ°œλ…μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. κ°€μ€‘μΉ˜ μ—…λ°μ΄νŠΈ: 초기 ν•™μŠ΅κΈ°μ˜ 였λ₯˜κ°€ 큰 데이터 ν¬μΈνŠΈμ— 더 λ§Žμ€ κ°€μ€‘μΉ˜λ₯Ό λΆ€μ—¬ν•˜μ—¬ λ‹€μŒ ν•™μŠ΅κΈ°κ°€ 이 였λ₯˜λ₯Ό 쀄이도둝 ν•©λ‹ˆλ‹€.
  2. 순차적 ν•™μŠ΅: 각 ν•™μŠ΅κΈ°λŠ” 이전 ν•™μŠ΅κΈ°μ˜ 였λ₯˜λ₯Ό 쀄이기 μœ„ν•΄ 순차적으둜 ν•™μŠ΅λ©λ‹ˆλ‹€.
  3. 앙상블: μ΅œμ’… μ˜ˆμΈ‘μ€ λͺ¨λ“  ν•™μŠ΅κΈ°μ˜ κ°€μ€‘μΉ˜κ°€ λΆ€μ—¬λœ νˆ¬ν‘œλ₯Ό 톡해 κ²°μ •λ©λ‹ˆλ‹€.

파이썬 μ½”λ“œ 예제

μ•„λž˜λŠ” 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()

μ½”λ“œ μ„€λͺ…

  1. 데이터 λ‘œλ“œ 및 λΆ„ν• : load_iris() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•„μ΄λ¦¬μŠ€ 데이터λ₯Ό λ‘œλ“œν•˜κ³ , train_test_split()을 톡해 ν•™μŠ΅ 데이터와 ν…ŒμŠ€νŠΈ λ°μ΄ν„°λ‘œ λΆ„ν• ν•©λ‹ˆλ‹€.
  2. λͺ¨λΈ 생성 및 ν•™μŠ΅: DecisionTreeClassifierλ₯Ό μ•½ν•œ ν•™μŠ΅κΈ°λ‘œ μ‚¬μš©ν•˜μ—¬ AdaBoostClassifierλ₯Ό μƒμ„±ν•˜κ³ , fit() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•™μŠ΅μ‹œν‚΅λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” μ΅œλŒ€ 깊이 1의 μ˜μ‚¬κ²°μ •λ‚˜λ¬΄λ₯Ό μ•½ν•œ ν•™μŠ΅κΈ°λ‘œ μ‚¬μš©ν•˜λ©°, 50개의 ν•™μŠ΅κΈ°λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  3. 예츑 및 평가: ν•™μŠ΅λœ λͺ¨λΈλ‘œ ν…ŒμŠ€νŠΈ 데이터λ₯Ό μ˜ˆμΈ‘ν•˜κ³ , 정확도λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  4. μ€‘μš” νŠΉμ§• μ‹œκ°ν™”: 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λŠ” λ¬΄μž‘μœ„λ‘œ μ„ νƒλœ λΆ„ν•  기쀀을 μ‚¬μš©ν•˜μ—¬ 트리λ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€. 이둜 인해 λͺ¨λΈμ˜ 편ν–₯은 μ•½κ°„ 증가할 수 μžˆμ§€λ§Œ, 뢄산은 κ°μ†Œν•˜μ—¬ 과적합을 λ°©μ§€ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€. μ£Όμš” κ°œλ…μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. μ™„μ „ λ¬΄μž‘μœ„ λΆ„ν• : 각 λ…Έλ“œμ—μ„œ λ¬΄μž‘μœ„λ‘œ μ„ νƒλœ λΆ„ν•  기쀀을 μ‚¬μš©ν•˜μ—¬ λΆ„ν• ν•©λ‹ˆλ‹€.
  2. λ°°κΉ… (Bagging): μ—¬λŸ¬ 개의 트리λ₯Ό λ…λ¦½μ μœΌλ‘œ ν•™μŠ΅μ‹œν‚€κ³ , 예츑 κ²°κ³Όλ₯Ό μ•™μƒλΈ”ν•©λ‹ˆλ‹€.
  3. νŠΉμ§•μ˜ λ¬΄μž‘μœ„ 선택: 각 λ…Έλ“œμ—μ„œ λΆ„ν• ν•  λ•Œ μ‚¬μš©ν•  νŠΉμ§•μ„ λ¬΄μž‘μœ„λ‘œ μ„ νƒν•©λ‹ˆλ‹€.

πŸ’‘ 랜덀 ν¬λ ˆμŠ€νŠΈμ™€ 차이

μ €λŠ” 개인적으둜 랜덀 ν¬λ ˆμŠ€νŠΈμ™€ μ—‘μŠ€νŠΈλΌ 트리의 κ°œλ…μ΄ 많이 ν˜Όλ™μŠ€λŸ½λ”λΌκ³ μš”β€¦ κ·Έλž˜μ„œ μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€!

  • 두 μ•Œκ³ λ¦¬μ¦˜μ€ 기본적으둜 앙상블(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()

μ½”λ“œ μ„€λͺ…

  1. 데이터 λ‘œλ“œ 및 λΆ„ν• : load_iris() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•„μ΄λ¦¬μŠ€ 데이터λ₯Ό λ‘œλ“œν•˜κ³ , train_test_split()을 톡해 ν•™μŠ΅ 데이터와 ν…ŒμŠ€νŠΈ λ°μ΄ν„°λ‘œ λΆ„ν• ν•©λ‹ˆλ‹€.
  2. λͺ¨λΈ 생성 및 ν•™μŠ΅: ExtraTreesClassifierλ₯Ό μ‚¬μš©ν•˜μ—¬ Extra Trees λͺ¨λΈμ„ μƒμ„±ν•˜κ³ , fit() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•™μŠ΅μ‹œν‚΅λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” 100개의 νŠΈλ¦¬μ™€ μ΅œλŒ€ 깊이 3을 μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€.
  3. 예츑 및 평가: ν•™μŠ΅λœ λͺ¨λΈλ‘œ ν…ŒμŠ€νŠΈ 데이터λ₯Ό μ˜ˆμΈ‘ν•˜κ³ , 정확도λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  4. μ€‘μš” νŠΉμ§• μ‹œκ°ν™”: feature_importances_ 속성을 μ‚¬μš©ν•˜μ—¬ 각 νŠΉμ§•μ˜ μ€‘μš”λ„λ₯Ό κ³„μ‚°ν•˜κ³ , seaborn을 μ‚¬μš©ν•˜μ—¬ λ°” κ·Έλž˜ν”„λ‘œ μ‹œκ°ν™”ν•©λ‹ˆλ‹€.

6. XGBoost (Extreme Gradient Boosting)

좜처: ResearchGate, Flow chart of XGBoost

κ°œλ… 및 원리

XGBoost (Extreme Gradient Boosting)λŠ” κ·Έλž˜λ””μ–ΈνŠΈ λΆ€μŠ€νŒ… μ•Œκ³ λ¦¬μ¦˜μ„ ν™•μž₯ν•˜μ—¬ μ„±λŠ₯κ³Ό νš¨μœ¨μ„±μ„ 크게 ν–₯μƒμ‹œν‚¨ λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€. XGBoostλŠ” μ •κ·œν™”, 병렬 처리, μ‘°κΈ° μ’…λ£Œ λ“± μ—¬λŸ¬ κ°€μ§€ μ΅œμ ν™” 기법을 μ‚¬μš©ν•˜μ—¬ 기쑴의 κ·Έλž˜λ””μ–ΈνŠΈ λΆ€μŠ€νŒ… μ•Œκ³ λ¦¬μ¦˜λ³΄λ‹€ λ›°μ–΄λ‚œ μ„±λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. μ£Όμš” κ°œλ…μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. μ •κ·œν™” (Regularization): L1, L2 μ •κ·œν™”λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λΈμ˜ λ³΅μž‘λ„λ₯Ό μ œμ–΄ν•˜κ³  과적합을 λ°©μ§€ν•©λ‹ˆλ‹€.
  2. 병렬 처리 (Parallel Processing): 닀쀑 μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν•™μŠ΅ 속도λ₯Ό ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.
  3. μ‘°κΈ° μ’…λ£Œ (Early Stopping): 검증 λ°μ΄ν„°μ˜ μ„±λŠ₯ ν–₯상이 λ©ˆμΆ”λ©΄ ν•™μŠ΅μ„ μ‘°κΈ° μ’…λ£Œν•˜μ—¬ 과적합을 λ°©μ§€ν•©λ‹ˆλ‹€.
  4. λΆ„ν•  검색 μ΅œμ ν™”: 뢄할점을 효율적으둜 μ°ΎκΈ° μœ„ν•΄ νžˆμŠ€ν† κ·Έλž¨ 기반 접근법을 μ‚¬μš©ν•©λ‹ˆλ‹€.

파이썬 μ½”λ“œ 예제

μ•„λž˜λŠ” 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()

μ½”λ“œ μ„€λͺ…

  1. 데이터 λ‘œλ“œ 및 λΆ„ν• : load_iris() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•„μ΄λ¦¬μŠ€ 데이터λ₯Ό λ‘œλ“œν•˜κ³ , train_test_split()을 톡해 ν•™μŠ΅ 데이터와 ν…ŒμŠ€νŠΈ λ°μ΄ν„°λ‘œ λΆ„ν• ν•©λ‹ˆλ‹€.
  2. λͺ¨λΈ 생성 및 ν•™μŠ΅: XGBClassifierλ₯Ό μ‚¬μš©ν•˜μ—¬ XGBoost λͺ¨λΈμ„ μƒμ„±ν•˜κ³ , fit() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•™μŠ΅μ‹œν‚΅λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” 100개의 트리, ν•™μŠ΅λ₯  0.1, μ΅œλŒ€ 깊이 3으둜 μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€. use_label_encoder=FalseλŠ” μ΅œμ‹  λ²„μ „μ˜ XGBoostμ—μ„œ κ²½κ³ λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•œ μ„€μ •μž…λ‹ˆλ‹€.
  3. 예츑 및 평가: ν•™μŠ΅λœ λͺ¨λΈλ‘œ ν…ŒμŠ€νŠΈ 데이터λ₯Ό μ˜ˆμΈ‘ν•˜κ³ , 정확도λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  4. μ€‘μš” νŠΉμ§• μ‹œκ°ν™”: 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은 리프 쀑심 트리 λΆ„ν•  방식과 μ—¬λŸ¬ μ΅œμ ν™” 기법을 μ‚¬μš©ν•˜μ—¬ ν•™μŠ΅ 속도λ₯Ό 크게 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€. μ£Όμš” κ°œλ…μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. 리프 쀑심 트리 λΆ„ν•  (Leaf-wise Tree Growth): 트리의 리프λ₯Ό ν™•μž₯ν•˜λŠ” λ°©μ‹μœΌλ‘œ, 손싀을 κ°€μž₯ 많이 μ€„μ΄λŠ” 리프λ₯Ό μ„ νƒν•˜μ—¬ λΆ„ν• ν•©λ‹ˆλ‹€. μ΄λŠ” 깊이 쀑심 뢄할보닀 더 νš¨κ³Όμ μž…λ‹ˆλ‹€.
  2. Gradient-based One-Side Sampling (GOSS): μ€‘μš”ν•œ μƒ˜ν”Œμ„ 더 많이 μ‚¬μš©ν•˜κ³  덜 μ€‘μš”ν•œ μƒ˜ν”Œμ„ 쀄여 λ°μ΄ν„°μ˜ 크기λ₯Ό μ€„μž…λ‹ˆλ‹€.
  3. Exclusive Feature Bundling (EFB): μƒν˜Έ 배타적인 νŠΉμ§•μ„ ν•˜λ‚˜λ‘œ λ¬Άμ–΄ νŠΉμ§•μ˜ 수λ₯Ό μ€„μž…λ‹ˆλ‹€.
  4. 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()

μ½”λ“œ μ„€λͺ…

  1. 데이터 λ‘œλ“œ 및 λΆ„ν• : load_iris() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•„μ΄λ¦¬μŠ€ 데이터λ₯Ό λ‘œλ“œν•˜κ³ , train_test_split()을 톡해 ν•™μŠ΅ 데이터와 ν…ŒμŠ€νŠΈ λ°μ΄ν„°λ‘œ λΆ„ν• ν•©λ‹ˆλ‹€.
  2. LightGBM 데이터셋 생성: lgb.Datasetλ₯Ό μ‚¬μš©ν•˜μ—¬ LightGBM의 데이터셋 ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.
  3. λͺ¨λΈ νŒŒλΌλ―Έν„° μ„€μ •: params λ”•μ…”λ„ˆλ¦¬λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λΈμ˜ νŒŒλΌλ―Έν„°λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” 닀쀑 클래슀 λΆ„λ₯˜λ₯Ό μœ„ν•œ νŒŒλΌλ―Έν„°λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
  4. λͺ¨λΈ ν•™μŠ΅: lgb.train() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λΈμ„ ν•™μŠ΅μ‹œν‚΅λ‹ˆλ‹€. early_stopping_roundsλ₯Ό μ„€μ •ν•˜μ—¬ 검증 λ°μ΄ν„°μ˜ μ„±λŠ₯ ν–₯상이 λ©ˆμΆ”λ©΄ ν•™μŠ΅μ„ μ‘°κΈ° μ’…λ£Œν•©λ‹ˆλ‹€.
  5. 예츑 및 평가: ν•™μŠ΅λœ λͺ¨λΈλ‘œ ν…ŒμŠ€νŠΈ 데이터λ₯Ό μ˜ˆμΈ‘ν•˜κ³ , 정확도λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  6. μ€‘μš” νŠΉμ§• μ‹œκ°ν™”: 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λŠ” λ²”μ£Όν˜• λ³€μˆ˜μ˜ κ³ μœ ν•œ 처리 방법과 순차 λΆ€μŠ€νŒ… 기법을 톡해 예츑 μ„±λŠ₯κ³Ό ν•™μŠ΅ 속도λ₯Ό ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€. μ£Όμš” κ°œλ…μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. 순차 λΆ€μŠ€νŒ… (Ordered Boosting): 데이터 μˆœμ„œλ₯Ό λ¬΄μž‘μœ„λ‘œ μ„žμ–΄ λΆ€μŠ€νŒ… λ‹¨κ³„λ§ˆλ‹€ μƒˆλ‘œμš΄ μˆœμ„œλ₯Ό μ‚¬μš©ν•˜μ—¬ 과적합을 λ°©μ§€ν•©λ‹ˆλ‹€.
  2. λ²”μ£Όν˜• λ³€μˆ˜ 처리: 각 λ²”μ£Όν˜• λ³€μˆ˜μ— λŒ€ν•΄ κ³ μœ ν•œ ν†΅κ³„λŸ‰(평균 λͺ©ν‘œκ°’ λ“±)을 μ‚¬μš©ν•˜μ—¬ λ³€ν™˜ν•©λ‹ˆλ‹€.
  3. λŒ€μΉ­ 트리 (Symmetric Trees): κ· ν˜• 작힌 트리 ꡬ쑰λ₯Ό μ‚¬μš©ν•˜μ—¬ 예츑 속도λ₯Ό 높이고, λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ μ΅œμ ν™”ν•©λ‹ˆλ‹€.
  4. 기타 μ΅œμ ν™”: 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()

μ½”λ“œ μ„€λͺ…

  1. 데이터 λ‘œλ“œ 및 λΆ„ν• : load_iris() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•„μ΄λ¦¬μŠ€ 데이터λ₯Ό λ‘œλ“œν•˜κ³ , train_test_split()을 톡해 ν•™μŠ΅ 데이터와 ν…ŒμŠ€νŠΈ λ°μ΄ν„°λ‘œ λΆ„ν• ν•©λ‹ˆλ‹€.
  2. λͺ¨λΈ 생성 및 ν•™μŠ΅: CatBoostClassifierλ₯Ό μ‚¬μš©ν•˜μ—¬ CatBoost λͺ¨λΈμ„ μƒμ„±ν•˜κ³ , fit() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•™μŠ΅μ‹œν‚΅λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” 100번의 반볡(iterations), ν•™μŠ΅λ₯  0.1, μ΅œλŒ€ 깊이 3을 μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€.
  3. 예츑 및 평가: ν•™μŠ΅λœ λͺ¨λΈλ‘œ ν…ŒμŠ€νŠΈ 데이터λ₯Ό μ˜ˆμΈ‘ν•˜κ³ , 정확도λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  4. μ€‘μš” νŠΉμ§• μ‹œκ°ν™”: get_feature_importance() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 각 νŠΉμ§•μ˜ μ€‘μš”λ„λ₯Ό κ³„μ‚°ν•˜κ³ , seaborn을 μ‚¬μš©ν•˜μ—¬ λ°” κ·Έλž˜ν”„λ‘œ μ‹œκ°ν™”ν•©λ‹ˆλ‹€.

9. Histogram-based Gradient Boosting (HGBT)

좜처 : https://ars.els-cdn.com/content/image/1-s2.0-S0926580523000274-gr3.jpg

κ°œλ… 및 원리

νžˆμŠ€ν† κ·Έλž¨ 기반 κ·Έλž˜λ””μ–ΈνŠΈ λΆ€μŠ€νŒ…μ€ νžˆμŠ€ν† κ·Έλž¨μ„ μ‚¬μš©ν•˜μ—¬ μ—°μ†ν˜• νŠΉμ§•μ„ λ²„ν‚·μœΌλ‘œ κ·Έλ£Ήν™”ν•˜μ—¬ 뢄할점을 μ°ΎλŠ” 효율적인 λ°©λ²•μž…λ‹ˆλ‹€. 이 접근법은 계산 속도λ₯Ό 크게 ν–₯μƒμ‹œν‚€κ³  λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ 쀄이며, λŒ€μš©λŸ‰ 데이터셋을 μ²˜λ¦¬ν•˜λŠ” 데 μœ λ¦¬ν•©λ‹ˆλ‹€. μ£Όμš” κ°œλ…μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. νžˆμŠ€ν† κ·Έλž¨ λ³€ν™˜: μ—°μ†ν˜• νŠΉμ§•μ„ μΌμ •ν•œ 간격 λ˜λŠ” 데이터 뢄포에 따라 λ²„ν‚·μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.
  2. λΉ λ₯Έ 뢄할점 μ°ΎκΈ°: 각 버킷 λ‚΄μ—μ„œ 손싀 ν•¨μˆ˜λ₯Ό μ΅œμ†Œν™”ν•˜λŠ” 뢄할점을 λΉ λ₯΄κ²Œ μ°ΎμŠ΅λ‹ˆλ‹€.
  3. λŒ€μš©λŸ‰ 데이터 처리: νžˆμŠ€ν† κ·Έλž¨ 기반 접근법은 병렬 처리λ₯Ό 톡해 λŒ€μš©λŸ‰ λ°μ΄ν„°μ…‹μ—μ„œλ„ 높은 νš¨μœ¨μ„±μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

파이썬 μ½”λ“œ 예제

μ•„λž˜λŠ” 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()

μ½”λ“œ μ„€λͺ…

  1. 데이터 λ‘œλ“œ 및 λΆ„ν• : load_iris() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•„μ΄λ¦¬μŠ€ 데이터λ₯Ό λ‘œλ“œν•˜κ³ , train_test_split()을 톡해 ν•™μŠ΅ 데이터와 ν…ŒμŠ€νŠΈ λ°μ΄ν„°λ‘œ λΆ„ν• ν•©λ‹ˆλ‹€.
  2. λͺ¨λΈ 생성 및 ν•™μŠ΅: HistGradientBoostingClassifierλ₯Ό μ‚¬μš©ν•˜μ—¬ νžˆμŠ€ν† κ·Έλž¨ 기반 κ·Έλž˜λ””μ–ΈνŠΈ λΆ€μŠ€νŒ… λͺ¨λΈμ„ μƒμ„±ν•˜κ³ , fit() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•™μŠ΅μ‹œν‚΅λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” 100번의 반볡(iterations), ν•™μŠ΅λ₯  0.1, μ΅œλŒ€ 깊이 3을 μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€.
  3. 예츑 및 평가: ν•™μŠ΅λœ λͺ¨λΈλ‘œ ν…ŒμŠ€νŠΈ 데이터λ₯Ό μ˜ˆμΈ‘ν•˜κ³ , 정확도λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  4. μ€‘μš” νŠΉμ§• μ‹œκ°ν™”: 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 μ•Œκ³ λ¦¬μ¦˜ μ „λ°˜μ— λŒ€ν•΄μ„œ μ •λ¦¬ν•˜κ³ , 기본적인 μ½”λ“œκΉŒμ§€ μ μ–΄λ³΄λŠ” μ‹œκ°„μ„ κ°€μ Έλ΄€λŠ”λ°μš” πŸ“Š 저도 개인적으둜 ν•œλ²ˆμ―€ μ •λ¦¬ν•˜κ³  κ°€κ³  μ‹Άμ—ˆλ˜ κ°œλ…μ΄λΌ μœ μ΅ν–ˆλ˜ μ‹œκ°„μ΄μ—ˆλ˜ 것 κ°™μŠ΅λ‹ˆλ‹€!!

κ°μ‚¬ν•©λ‹ˆλ‹€ πŸ™



-->