[νΈλ¦¬] νΈλ¦¬ κΈ°λ° 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 μκ³ λ¦¬μ¦ μ λ°μ λν΄μ μ 리νκ³ , κΈ°λ³Έμ μΈ μ½λκΉμ§ μ μ΄λ³΄λ μκ°μ κ°μ Έλ΄€λλ°μ π μ λ κ°μΈμ μΌλ‘ νλ²μ―€ μ 리νκ³ κ°κ³ μΆμλ κ°λ μ΄λΌ μ μ΅νλ μκ°μ΄μλ κ² κ°μ΅λλ€!!
κ°μ¬ν©λλ€ π