Machine Learning Academy · 강의

XGBoost: 정규화, 조기 중단, 특성 중요도

XGBClassifier를 훈련하고, 검증 세트에서 조기 중단을 활성화하며, 특성 중요도 점수를 그려 가장 예측력이 높은 열을 식별합니다.

레슨 2/413개 단계

XGBoost: 정규화, 조기 중단, 특성 중요도은(는) CoddyKit의 무료 Machine Learning Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Machine Learning Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Machine Learning Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

XGBoost란 무엇인가요

XGBoost(eXtreme Gradient Boosting)는 고도로 최적화된 그래디언트 부스팅 라이브러리로, 2014년 이후 Kaggle 대회를 석권했습니다. scikit-learn의 GradientBoostingClassifier를 세 가지 주요 방식으로 개선합니다. (1) 과적합을 줄이기 위해 트리 가중치에 L1 및 L2 규제를 기본으로 적용하고, (2) 더 정확한 그래디언트 추정값을 위해 손실의 2차 테일러 전개를 사용하며, (3) 수백만 개의 행이 있는 데이터 세트까지 확장할 수 있는 매우 효율적인 근사 히스토그램 기반 분할 탐색 알고리즘을 사용합니다.

XGBoost 설치 및 가져오기

XGBoost는 scikit-learn과 별도로 설치하는 독립 라이브러리입니다. XGBClassifier와 XGBRegressor를 통해 sklearn 호환 API를 제공하므로, 다른 scikit-learn 추정기와 마찬가지로 cross_val_score, GridSearchCV, 파이프라인과 함께 사용할 수 있습니다. 기본 XGBoost API는 xgb.DMatrix와 xgb.train()을 사용하며, 조기 종료와 사용자 지정 목적 함수에 대해 더 세밀하게 제어할 수 있습니다.

# Install: pip install xgboost
import xgboost as xgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = xgb.XGBClassifier(n_estimators=200, learning_rate=0.1, max_depth=3,
                           use_label_encoder=False, eval_metric='logloss', random_state=42)
model.fit(X_train, y_train)
print('XGBoost test accuracy:', model.score(X_test, y_test))

XGBoost 규제: lambda와 alpha

XGBoost는 두 가지 규제 항을 제공합니다. reg_lambda는 리프 가중치에 적용되는 L2 페널티(기본값=1)이고, reg_alpha는 리프 가중치에 적용되는 L1 페널티(기본값=0)입니다. L2 규제는 리프 가중치를 0을 향해 부드럽게 줄이고, L1 규제는 일부 리프 가중치를 정확히 0으로 만들 수 있습니다(희소한 트리 구조). 둘 다 잡음이 많은 데이터 세트의 과적합을 줄입니다. 또한 min_child_weight는 분할하기 전에 자식 노드에 포함된 인스턴스 가중치 합계가 최소값 이상이어야 하도록 하여, 리프당 최소 표본 수 제약과 유사하게 작동합니다.

import xgboost as xgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score

X, y = load_breast_cancer(return_X_y=True)
for lam in [0, 1, 5, 10]:
    model = xgb.XGBClassifier(n_estimators=100, reg_lambda=lam, eval_metric='logloss',
                               random_state=42, verbosity=0)
    score = cross_val_score(model, X, y, cv=5).mean()
    print(f'reg_lambda={lam:3d}: CV accuracy={score:.4f}')

조기 종료: 개선이 멈추면 중단하기

조기 종료는 각 부스팅 라운드 후 검증 지표를 모니터링하고, 지정된 라운드 수(early_stopping_rounds) 동안 지표가 개선되지 않으면 학습을 중단합니다. 이를 통해 과적합을 방지하고 계산량을 줄일 수 있습니다. n_estimators를 매우 높게(예: 1000) 설정한 후 조기 종료가 최적의 라운드 수를 찾도록 해도 안전합니다. 최적의 반복 횟수는 model.best_iteration에 저장되며 예측에 자동으로 사용됩니다.

import xgboost as xgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

X, y = load_breast_cancer(return_X_y=True)
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

model = xgb.XGBClassifier(n_estimators=1000, learning_rate=0.05, max_depth=3,
                           eval_metric='logloss', verbosity=0, random_state=42)
model.fit(X_train, y_train,
          eval_set=[(X_val, y_val)],
          early_stopping_rounds=20,
          verbose=False)
print('Best iteration:', model.best_iteration)
print('Test accuracy:', model.score(X_val, y_val))

XGBoost 특성 중요도

XGBoost는 세 가지 특성 중요도를 제공합니다. 'weight'는 분할에서 특성이 사용된 횟수이고, 'gain'은 특성을 분할에 사용했을 때 손실이 평균적으로 개선된 정도(일반적으로 가장 많은 정보를 제공함)이며, 'cover'는 해당 특성에 대한 분할의 영향을 받은 표본 수의 평균입니다. model.feature_importances_를 통해 확인할 수 있으며, sklearn API에서는 기본적으로 gain을 사용합니다. 또는 model.get_booster().get_score(importance_type='gain')을 사용할 수도 있습니다.

import xgboost as xgb
import pandas as pd
from sklearn.datasets import load_breast_cancer

data = load_breast_cancer()
X, y = data.data, data.target

model = xgb.XGBClassifier(n_estimators=100, eval_metric='logloss', random_state=42)
model.fit(X, y)

importances = pd.Series(model.feature_importances_, index=data.feature_names)
print(importances.sort_values(ascending=False).head(5))

특성 중요도 시각화

XGBoost에는 특성 중요도의 가로 막대 차트를 생성하는 내장 시각화 도구 xgb.plot_importance(model)가 포함되어 있습니다. 더 세밀하게 사용자 지정하려면 model.feature_importances_의 Series를 사용하고 matplotlib으로 그리십시오. 부스팅의 특성 중요도는 랜덤 포레스트와 다르게 계산됩니다. 모든 트리에서 손실을 줄이는 데 각 특성이 얼마나 기여했는지를 사용 빈도 또는 평균 gain으로 가중하여 나타냅니다.

import xgboost as xgb
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt

data = load_breast_cancer()
model = xgb.XGBClassifier(n_estimators=100, eval_metric='logloss', random_state=42)
model.fit(data.data, data.target)
# xgb.plot_importance(model, max_num_features=10)  # uncomment in Jupyter
# plt.show()
print('Top feature:', data.feature_names[model.feature_importances_.argmax()])

XGBoost의 부분 표본 추출 매개변수

XGBoost는 추가적인 정규화를 위해 세 가지 하위 샘플링 매개변수를 제공합니다. subsample(트리마다 사용하는 학습 행의 비율, 예: 0.8), colsample_bytree(트리마다 사용하는 특성의 비율, 예: 0.8), colsample_bylevel(각 깊이 수준에서 사용하는 특성의 비율)입니다. 이 매개변수들을 함께 사용하면 랜덤 포레스트의 특성 하위 샘플링과 유사한 무작위성이 도입되어 트리 간 상관관계가 줄어듭니다. 일반적인 시작값은 subsample=0.8, colsample_bytree=0.8입니다.

import xgboost as xgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score

X, y = load_breast_cancer(return_X_y=True)
model = xgb.XGBClassifier(
    n_estimators=200,
    learning_rate=0.1,
    max_depth=4,
    subsample=0.8,
    colsample_bytree=0.8,
    reg_lambda=2,
    eval_metric='logloss',
    random_state=42
)
print('XGBoost with subsampling CV:', cross_val_score(model, X, y, cv=5).mean().round(4))

회귀를 위한 XGBoost

XGBRegressor는 동일한 엔진을 사용하지만 회귀 손실 함수(기본값은 제곱 오차이며 Tweedie, gamma, quantile 등도 지원)를 최적화합니다. 회귀 지표(예: RMSE)를 사용하는 조기 중단도 동일한 방식으로 작동합니다. XGBoost는 결측값을 기본적으로 처리하고(트리를 구성할 때 결측값이 있는 노드를 어느 방향으로 보낼지 가장 적절한 방향을 학습함), 도메인별 특성 관계에 대한 단조성 제약 조건을 지원하므로 표 형식의 회귀 작업에서 특히 경쟁력이 있습니다.

import xgboost as xgb
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import cross_val_score
import numpy as np

X, y = fetch_california_housing(return_X_y=True)
model = xgb.XGBRegressor(n_estimators=200, learning_rate=0.1, max_depth=4,
                          subsample=0.8, eval_metric='rmse', random_state=42)
rmse = np.sqrt(-cross_val_score(model, X, y, scoring='neg_mean_squared_error', cv=3).mean())
print('XGBoost Regression RMSE:', round(rmse, 4))

교차 검증 및 GridSearch를 사용하는 XGBoost

XGBClassifier는 scikit-learn 추정기 인터페이스를 구현하므로 GridSearchCV와 원활하게 작동합니다. 조정할 때 가장 큰 영향을 미치는 하이퍼파라미터는 learning_rate, n_estimators(조기 중단 사용), max_depth, subsample, colsample_bytree입니다. 다음과 같은 2단계 전략이 효과적입니다. 먼저 낮은 학습률(0.05)과 높은 n_estimators를 설정하고 조기 중단을 사용하여 적절한 트리 개수를 찾습니다. 그런 다음 해당 트리 개수를 고정한 상태에서 다른 매개변수에 대해 격자 탐색을 수행합니다.

XGBoost의 결측값 처리

XGBoost는 대치 없이 결측값(NaN)을 기본적으로 처리합니다. 트리를 구성하는 동안 일부 학습 사례에서 특성값이 결측이면 XGBoost는 결측값을 왼쪽 자식과 오른쪽 자식 중 어느 방향으로 보낼지 모두 시도하고, 이득을 최대화하는 방향을 선택합니다. 학습된 방향은 트리에 저장되며 예측 시 적용됩니다. 이는 적합 전에 명시적인 대치가 필요한 scikit-learn 모델에 비해 상당한 장점입니다.

XGBoost의 병렬 처리와 속도

트리는 순차적으로 구축되지만 XGBoost는 각 트리 내부의 분할 탐색 단계를 병렬화합니다. 여러 CPU 스레드를 사용하여 모든 특성에 대한 후보 분할을 동시에 평가합니다. 사용 가능한 모든 코어를 사용하려면 n_jobs=-1(또는 네이티브 API에서는 nthread)을 설정합니다. GPU 가속을 사용하려면 CUDA 지원 버전을 설치하고 device='cuda'를 설정합니다. 최신 GPU에서는 대규모 데이터셋에서 XGBoost가 CPU보다 5~50배 빠를 수 있어 수백만 개의 행이 있는 데이터셋에도 실용적입니다.

import xgboost as xgb
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import cross_val_score
import numpy as np

X, y = fetch_california_housing(return_X_y=True)
# Use all CPU threads
model_parallel = xgb.XGBRegressor(n_estimators=100, n_jobs=-1, eval_metric='rmse',
                                   verbosity=0, random_state=42)
rmse = np.sqrt(-cross_val_score(model_parallel, X, y, scoring='neg_mean_squared_error', cv=3).mean())
print('XGBoost parallel RMSE:', round(rmse, 4))

빠른 확인

이 단원에서 배운 XGBoost 기능에 대한 이해도를 확인해 보세요.

단원 요약

이 단원에서는 다음을 배웠습니다. XGBoost는 표준 그래디언트 부스팅에 L1/L2 정규화와 2차 그래디언트를 추가합니다. 조기 중단은 학습 중 검증 지표를 모니터링하여 과적합을 방지합니다. 또한 모든 트리에서 특성 중요도를 가중치, 이득 또는 커버리지로 측정할 수 있습니다. 다음에는 LightGBM의 리프 단위 성장 전략과 속도상의 장점을 살펴보겠습니다.

무료로 시작

AI 튜터와 함께 Python을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
30
레슨
120

자주 묻는 질문

“XGBoost: 정규화, 조기 중단, 특성 중요도” 강의는 무료인가요?

네 — “XGBoost: 정규화, 조기 중단, 특성 중요도” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Machine Learning Academy 강의 전체를 잠금 해제할 수 있습니다. Machine Learning Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“XGBoost: 정규화, 조기 중단, 특성 중요도”에서 뭘 배우나요?

XGBClassifier를 훈련하고, 검증 세트에서 조기 중단을 활성화하며, 특성 중요도 점수를 그려 가장 예측력이 높은 열을 식별합니다. 브라우저에서 직접 실행하는 실습 코드로 Machine Learning Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Machine Learning Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Machine Learning Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“XGBoost: 정규화, 조기 중단, 특성 중요도” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Machine Learning Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Machine Learning Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 부스팅 직관: 순차적 오차 보정
  2. XGBoost: 정규화, 조기 중단, 특성 중요도
  3. LightGBM: 잎 기준 성장과 속도상의 이점
  4. 핵심 하이퍼파라미터: 학습률, n_estimators, max_depth
← Machine Learning Academy(으)로 돌아가기