앙상블 방법의 힘
그만큼 앙상블 방법 여러 개의 약한 모델을 결합하여 강력한 모델을 만듭니다. 직관 간단해요. 수많은 평범한 전문가들에게 의견을 묻고, 그 답을 종합하면 결과가 나옵니다. 전문가 한 명에게 의지하는 것보다 낫습니다. 가장 많이 이기는 기술입니다 Kaggle의 ML 대회는 프로덕션 중인 많은 시스템을 지원합니다. 앙상블의 세 가지 기둥 나는 배깅, 부스팅 e 스태킹.
Il 배깅 (Bootstrap Aggregating)은 무작위 하위 집합에 대한 독립 모델을 훈련합니다. 데이터를 수집하고 예측을 집계합니다. 감소시킨다 변화. 그만큼 부스팅 모델을 순차적으로 학습하며 각각의 새로운 모델은 이전 모델의 오류를 수정합니다. 감소시킨다 편견. 그만큼 스태킹 기본 모델 예측을 입력으로 사용합니다. 이를 최적으로 결합하는 방법을 학습하는 메타 모델입니다.
이 기사에서 배울 내용
- 배깅 및 랜덤 포레스트: 분산 감소
- AdaBoost: 최초의 부스팅 알고리즘
- 그라데이션 부스팅: 최첨단 기술
- XGBoost, LightGBM 및 CatBoost: 최신 구현
- 스태킹 및 투표: 이종 모델 결합
- 앙상블을 위한 하이퍼파라미터 튜닝
배깅과 랜덤 포레스트
Il 배깅 부트스트랩 샘플링을 통해 데이터 세트의 N 복사본을 생성합니다(샘플링 재삽입), 각 복사본에 대해 모델을 훈련하고 다수결로 예측을 집계합니다. (분류) 또는 평균(회귀). 그만큼 랜덤 포레스트 추가하여 배깅을 확장합니다. 기능 무작위화: 각 분할에서 기능의 무작위 하위 집합만 제공됩니다. 고려. 이 이중 무작위화는 상관 관계가 없는 트리를 생성하여 분산을 더욱 줄입니다.
AdaBoost: 적응형 부스팅
AdaBoost(적응형 부스팅) 이는 최초의 성공적인 부스팅 알고리즘이었습니다. 모델에 의해 잘못 분류된 샘플에 더 큰 가중치를 할당하여 모델을 순차적으로 학습합니다. 이전. 각각의 새로운 모델은 가장 어려운 실수에 중점을 둡니다. 모델이 결합되어 있습니다. 각 모델의 가중치는 정확도에 따라 달라지는 가중 평균을 사용합니다.
from sklearn.ensemble import (
BaggingClassifier, RandomForestClassifier,
AdaBoostClassifier, GradientBoostingClassifier,
VotingClassifier, StackingClassifier
)
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import numpy as np
data = load_breast_cancer()
X, y = data.data, data.target
# Modelli ensemble
models = {
'Decision Tree': DecisionTreeClassifier(random_state=42),
'Bagging (50 trees)': BaggingClassifier(
estimator=DecisionTreeClassifier(random_state=42),
n_estimators=50, random_state=42, n_jobs=-1
),
'Random Forest': RandomForestClassifier(
n_estimators=100, random_state=42, n_jobs=-1
),
'AdaBoost': AdaBoostClassifier(
n_estimators=100, learning_rate=0.1, random_state=42
),
'Gradient Boosting': GradientBoostingClassifier(
n_estimators=100, learning_rate=0.1,
max_depth=3, random_state=42
)
}
print("Confronto Ensemble Methods:")
for name, model in models.items():
scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
print(f" {name:<25s}: {scores.mean():.4f} (+/- {scores.std():.4f})")
그라디언트 부스팅: 경쟁의 왕
Il 그래디언트 부스팅 각각의 새로운 모델이 나오는 모델을 순차적으로 구축합니다. 훈련을 받은 잔류물 (오류) 이전 모델의. 경사하강법을 사용하여 임의의 손실 함수를 최소화합니다. 그 결과 매우 강력하면서도 강력한 모델이 탄생했습니다. 과적합을 방지하려면 하이퍼파라미터를 주의 깊게 조정해야 합니다.
XGBoost(eXtreme Gradient Boosting) 가장 널리 사용되는 구현은 다음과 같습니다. L1/L2 정규화, 기본 결측값 관리, 병렬화 및 지능형 가지치기. 라이트GBM Microsoft의 솔루션은 대규모 데이터 세트의 속도와 메모리에 최적화되어 있습니다. (나무를 수평 방향이 아닌 잎 방향으로 성장시킵니다). 캣부스트 Yandex는 기본적으로 관리합니다. 수동 인코딩이 필요 없는 범주형 기능입니다.
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import GridSearchCV, cross_val_score
from sklearn.datasets import load_breast_cancer
import numpy as np
data = load_breast_cancer()
X, y = data.data, data.target
# Gradient Boosting di scikit-learn con Grid Search
param_grid = {
'n_estimators': [50, 100, 200],
'learning_rate': [0.01, 0.05, 0.1],
'max_depth': [3, 5, 7],
'min_samples_split': [2, 5],
'subsample': [0.8, 1.0]
}
gb = GradientBoostingClassifier(random_state=42)
# Nota: GridSearchCV con molti parametri e' lento
# In pratica si usa RandomizedSearchCV
from sklearn.model_selection import RandomizedSearchCV
random_search = RandomizedSearchCV(
gb, param_grid,
n_iter=20, # 20 combinazioni random
cv=5,
scoring='accuracy',
random_state=42,
n_jobs=-1
)
random_search.fit(X, y)
print(f"Best score: {random_search.best_score_:.4f}")
print(f"Best params: {random_search.best_params_}")
# XGBoost (se installato)
try:
from xgboost import XGBClassifier
xgb = XGBClassifier(
n_estimators=200,
learning_rate=0.05,
max_depth=5,
subsample=0.8,
colsample_bytree=0.8,
reg_alpha=0.1, # L1 regularization
reg_lambda=1.0, # L2 regularization
random_state=42,
eval_metric='logloss'
)
scores_xgb = cross_val_score(xgb, X, y, cv=5, scoring='accuracy')
print(f"\nXGBoost: {scores_xgb.mean():.4f} (+/- {scores_xgb.std():.4f})")
except ImportError:
print("\nXGBoost non installato. Installa con: pip install xgboost")
스태킹 및 투표
Il 투표 분류기 다양한 모델의 예측을 결합합니다. 그만큼'하드 투표 다수결을 사용하세요. 그만큼 소프트 투표 예측 확률의 평균을 구합니다(일반적으로 더 효과적입니다). 그만큼 스태킹 더 나아가 기본 모델의 예측을 기능으로 사용합니다. 에 대한 입력의 메타학습자 최적의 조합을 학습하는 것입니다.
from sklearn.ensemble import (
VotingClassifier, StackingClassifier,
RandomForestClassifier, GradientBoostingClassifier
)
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.datasets import load_breast_cancer
data = load_breast_cancer()
X, y = data.data, data.target
# Modelli base
rf = RandomForestClassifier(n_estimators=100, random_state=42)
gb = GradientBoostingClassifier(n_estimators=100, random_state=42)
svm = make_pipeline(StandardScaler(), SVC(probability=True, random_state=42))
lr = make_pipeline(StandardScaler(), LogisticRegression(max_iter=10000))
# Soft Voting
voting = VotingClassifier(
estimators=[('rf', rf), ('gb', gb), ('svm', svm), ('lr', lr)],
voting='soft'
)
# Stacking con meta-learner LogisticRegression
stacking = StackingClassifier(
estimators=[('rf', rf), ('gb', gb), ('svm', svm)],
final_estimator=LogisticRegression(max_iter=10000),
cv=5
)
# Confronto
for name, model in [('RF', rf), ('GB', gb), ('Voting', voting), ('Stacking', stacking)]:
scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
print(f"{name:<12s}: {scores.mean():.4f} (+/- {scores.std():.4f})")
배깅 대 부스팅: 배깅은 독립적인 모델을 결합하여 분산을 줄입니다. (랜덤 포레스트). 부스팅은 오류를 순차적으로 수정하여 편향을 줄입니다(XGBoost). 배깅 병렬화가 가능하고 과적합에 더 강합니다. 부스팅은 일반적으로 더 많습니다. 강력하지만 더 세심한 조정이 필요합니다. 기본적으로 Gradient Boosting(XGBoost, LightGBM)은 종종 표 형식 데이터에 가장 적합한 선택입니다.
핵심 사항
- 배깅은 독립 모델을 결합하여 분산을 줄입니다(Random Forest).
- 부스팅은 오류를 순차적으로 수정하여 편향을 줄입니다(AdaBoost, Gradient Boosting).
- XGBoost/LightGBM은 표 형식 데이터를 위한 최첨단 기술입니다.
- 낮은 학습률 + 많은 추정기 = 더 나은 결과를 얻지만 훈련 속도가 느림
- 스태킹은 이기종 모델을 메타 학습기와 결합합니다.
- RandomizedSearchCV는 하이퍼파라미터가 많은 GridSearchCV보다 더 효율적입니다.







