Gradient Boosting 정규화

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 scikit-learn 을 사용하여 Gradient Boosting 에 대한 다양한 정규화 전략을 구현하는 방법을 배웁니다. 정규화는 머신러닝 모델에서 흔히 발생하는 과적합을 방지하는 데 도움이 되는 기술입니다. 이 실습에서는 이항 편차 손실 함수 (binomial deviance loss function) 와 make_hastie_10_2 데이터셋을 사용합니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근합니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업 검증을 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

라이브러리 가져오기

필요한 라이브러리를 가져오는 것으로 시작해 보겠습니다.

import numpy as np
import matplotlib.pyplot as plt

from sklearn import ensemble
from sklearn import datasets
from sklearn.metrics import log_loss
from sklearn.model_selection import train_test_split

데이터 로드 및 분할

make_hastie_10_2 데이터셋을 사용하여 학습 데이터와 테스트 데이터로 분할합니다.

X, y = datasets.make_hastie_10_2(n_samples=4000, random_state=1)

## 레이블을 {-1, 1}에서 {0, 1}로 매핑
labels, y = np.unique(y, return_inverse=True)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.8, random_state=0)

매개변수 정의

Gradient Boosting Classifier 의 매개변수를 정의합니다. 다음 매개변수를 사용합니다.

  • n_estimators: 부스팅 단계 수
  • max_leaf_nodes: 각 트리의 최대 리프 노드 수
  • max_depth: 트리의 최대 깊이
  • random_state: 일관성을 위한 난수 시드
  • min_samples_split: 내부 노드를 분할하는 데 필요한 최소 샘플 수
original_params = {
    "n_estimators": 400,
    "max_leaf_nodes": 4,
    "max_depth": None,
    "random_state": 2,
    "min_samples_split": 5,
}

정규화 전략 구현

이제 다양한 정규화 전략을 구현하고 성능을 비교합니다.

축소 없음

먼저 축소를 적용하지 않고 학습률을 1 로 설정합니다.

params = dict(original_params)
params.update({"learning_rate": 1.0, "subsample": 1.0})

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)
학습률 = 0.2

다음으로 학습률을 0.2 로, 샘플링 비율 (subsample) 을 1 로 설정합니다.

params = dict(original_params)
params.update({"learning_rate": 0.2, "subsample": 1.0})

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)
샘플링 비율 = 0.5

이제 샘플링 비율 (subsample) 을 0.5 로, 학습률을 1 로 설정합니다.

params = dict(original_params)
params.update({"learning_rate": 1.0, "subsample": 0.5})

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)
학습률 = 0.2 및 샘플링 비율 = 0.5

다음으로 학습률을 0.2 로, 샘플링 비율 (subsample) 을 0.5 로 설정합니다.

params = dict(original_params)
params.update({"learning_rate": 0.2, "subsample": 0.5})

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)
학습률 = 0.2 및 최대 특징 = 2

마지막으로 학습률을 0.2 로 설정하고 각 트리에 2 개의 특징만 사용합니다.

params = dict(original_params)
params.update({"learning_rate": 0.2, "max_features": 2})

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)

테스트 세트 편차 플롯

이제 각 정규화 전략에 대한 테스트 세트 편차를 플롯합니다.

plt.figure()

for label, color, setting in [
    ("축소 없음", "orange", {"learning_rate": 1.0, "subsample": 1.0}),
    ("학습률=0.2", "turquoise", {"learning_rate": 0.2, "subsample": 1.0}),
    ("샘플링 비율=0.5", "blue", {"learning_rate": 1.0, "subsample": 0.5}),
    (
        "학습률=0.2, 샘플링 비율=0.5",
        "gray",
        {"learning_rate": 0.2, "subsample": 0.5},
    ),
    (
        "학습률=0.2, 최대 특징=2",
        "magenta",
        {"learning_rate": 0.2, "max_features": 2},
    ),
]:
    params = dict(original_params)
    params.update(setting)

    clf = ensemble.GradientBoostingClassifier(**params)
    clf.fit(X_train, y_train)

    ## 테스트 세트 편차 계산
    test_deviance = np.zeros((params["n_estimators"],), dtype=np.float64)

    for i, y_proba in enumerate(clf.staged_predict_proba(X_test)):
        test_deviance[i] = 2 * log_loss(y_test, y_proba[:, 1])

    plt.plot(
        (np.arange(test_deviance.shape[0]) + 1)[::5],
        test_deviance[::5],
        "-",
        color=color,
        label=label,
    )

plt.legend(loc="upper right")
plt.xlabel("부스팅 반복 횟수")
plt.ylabel("테스트 세트 편차")

plt.show()

요약

이 실험에서는 scikit-learn 을 사용하여 Gradient Boosting 에 대한 다양한 정규화 전략을 구현하는 방법을 배웠습니다. 이 실험에서는 이항 편차 손실 함수와 make_hastie_10_2 데이터셋을 사용했습니다. 축소 없음, 학습률 = 0.2, 샘플링 비율 = 0.5, 최대 특징 = 2 와 같은 다양한 정규화 전략을 구현했습니다. 마지막으로 각 정규화 전략에 대한 테스트 세트 편차를 플롯하여 성능을 비교했습니다.