분류기 교정 비교

Beginner

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

소개

이 실습에서는 로지스틱 회귀, 가우시안 나이브 베이즈, 랜덤 포레스트 분류기, 선형 SVM 네 가지 모델의 교정을 비교합니다. 각 모델에 대한 교정 곡선이 그려질 것이며, 이는 예측 확률과 실제 결과 간의 관계를 보여줍니다. 이는 잘 교정된 모델이 정확하고 신뢰할 수 있는 확률을 생성하기 때문입니다.

VM 팁

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

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

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

라이브러리 가져오기 및 데이터셋 생성

필요한 라이브러리를 가져오고 100,000 개의 샘플과 20 개의 특징을 가진 합성 이진 분류 데이터셋을 생성합니다. 20 개의 특징 중 2 개는 정보적이고, 2 개는 중복되며, 나머지 16 개는 정보가 없습니다. 100,000 개의 샘플 중 100 개는 모델 학습에 사용되고 나머지는 테스트에 사용됩니다.

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

## 데이터셋 생성
X, y = make_classification(
    n_samples=100_000, n_features=20, n_informative=2, n_redundant=2, random_state=42
)

train_samples = 100  ## 모델 학습에 사용할 샘플 수
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    shuffle=False,
    test_size=100_000 - train_samples,
)

교정 곡선 플롯

작은 학습 데이터셋으로 네 가지 모델 각각을 학습하고 테스트 데이터셋의 예측 확률을 사용하여 교정 곡선을 플롯합니다. 교정 곡선은 예측 확률을 구간으로 나누고 각 구간의 평균 예측 확률을 관측된 빈도 ('양성 비율') 와 함께 플롯하여 생성합니다. 교정 곡선 아래에는 예측 확률의 분포를 보여주는 히스토그램 (보다 구체적으로 각 예측 확률 구간의 샘플 수) 이 플롯됩니다.

import numpy as np
from sklearn.svm import LinearSVC
from sklearn.calibration import CalibrationDisplay
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

## 분류기 생성
lr = LogisticRegression()
gnb = GaussianNB()
svc = NaivelyCalibratedLinearSVC(C=1.0, dual="auto")
rfc = RandomForestClassifier()

clf_list = [
    (lr, "Logistic"),
    (gnb, "Naive Bayes"),
    (svc, "SVC"),
    (rfc, "Random forest"),
]

fig = plt.figure(figsize=(10, 10))
gs = GridSpec(4, 2)
colors = plt.get_cmap("Dark2")

ax_calibration_curve = fig.add_subplot(gs[:2, :2])
calibration_displays = {}
markers = ["^", "v", "s", "o"]
for i, (clf, name) in enumerate(clf_list):
    clf.fit(X_train, y_train)
    display = CalibrationDisplay.from_estimator(
        clf,
        X_test,
        y_test,
        n_bins=10,
        name=name,
        ax=ax_calibration_curve,
        color=colors(i),
        marker=markers[i],
    )
    calibration_displays[name] = display

ax_calibration_curve.grid()
ax_calibration_curve.set_title("Calibration plots")

## 히스토그램 추가
grid_positions = [(2, 0), (2, 1), (3, 0), (3, 1)]
for i, (_, name) in enumerate(clf_list):
    row, col = grid_positions[i]
    ax = fig.add_subplot(gs[row, col])

    ax.hist(
        calibration_displays[name].y_prob,
        range=(0, 1),
        bins=10,
        label=name,
        color=colors(i),
    )
    ax.set(title=name, xlabel="평균 예측 확률", ylabel="개수")

plt.tight_layout()
plt.show()

교정 곡선 해석

교정 곡선은 각 모델의 예측 확률과 실제 결과 간의 관계를 보여줍니다. 잘 교정된 모델은 예측 확률이 실제 결과와 일치함을 나타내는 대각선을 따르는 곡선을 생성합니다. 네 가지 모델은 서로 다른 결과를 생성합니다.

  • 로지스틱 회귀는 로그 손실을 직접 최적화하기 때문에 잘 교정된 예측을 생성합니다.
  • 가우시안 나이브 베이즈는 주로 특징들이 조건부 독립이라는 가정이 성립할 때만 확률의 올바른 추정치를 제공하기 때문에 확률을 주로 0 또는 1 로 밀어붙이는 경향이 있습니다.
  • 랜덤 포레스트 분류기는 반대의 동작을 보입니다. 히스토그램은 약 0.2 와 0.9 의 확률에서 피크를 보여주는 반면, 0 또는 1 에 가까운 확률은 매우 드뭅니다.
  • 선형 SVM 은 랜덤 포레스트 분류기보다 더 극심한 시그모이드 곡선을 보여주는데, 이는 최대 마진 방법에 일반적인 특징입니다.

결론

이 실험에서는 로지스틱 회귀, 가우시안 나이브 베이즈, 랜덤 포레스트 분류기, 선형 SVM 등 네 가지 다른 모델의 교정 정도를 비교했습니다. 각 모델의 교정 곡선을 플롯하고, 잘 교정된 모델은 대각선을 따르는 곡선을 생성한다는 것을 관찰했습니다. 네 가지 모델은 서로 다른 결과를 보였으며, 로지스틱 회귀는 잘 교정되었지만 다른 모델은 다양한 정도의 편향을 보였습니다. 교정은 머신러닝 모델의 중요한 측면이며, 잘 교정된 모델은 정확하고 신뢰할 수 있는 확률을 생성합니다.

요약

축하합니다! 분류기 교정 비교 실험을 완료했습니다. LabEx 에서 더 많은 실험을 통해 기술을 향상시킬 수 있습니다.