교차 검증을 통한 ROC 분석

Beginner

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

소개

이 실습에서는 Python 에서 교차 검증을 사용하여 수신자 작동 특성 (ROC) 지표의 분산을 추정하고 시각화하는 방법을 배웁니다. ROC 곡선은 이진 분류에서 모델의 성능을 나타내는 데 사용되며, 참 양성률 (TPR) 을 거짓 양성률 (FPR) 에 대해 플롯합니다. Scikit-learn 라이브러리를 사용하여 아이리스 데이터셋을 로드하고, 노이즈가 있는 특징을 생성하며, 서포트 벡터 머신 (SVM) 으로 데이터셋을 분류합니다. 그런 다음 교차 검증으로 ROC 곡선을 플롯하고, 곡선 아래 면적 (AUC) 의 평균을 계산하여 훈련 세트가 서로 다른 하위 집합으로 분할될 때 분류기 출력의 변동성을 확인합니다.

VM 팁

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

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

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

데이터 로드 및 준비

먼저, Scikit-learn 라이브러리를 사용하여 아이리스 데이터셋을 로드합니다. 아이리스 데이터셋은 3 개의 아이리스 식물 종류를 포함하며, 하나의 종류를 제거하여 이진 분류 문제를 생성하여 데이터셋을 이진화합니다. 또한 문제를 더 어렵게 하기 위해 노이즈가 있는 특징을 추가합니다.

import numpy as np
from sklearn.datasets import load_iris

iris = load_iris()
target_names = iris.target_names
X, y = iris.data, iris.target
X, y = X[y != 2], y[y != 2]
n_samples, n_features = X.shape

## 노이즈 특징 추가
random_state = np.random.RandomState(0)
X = np.concatenate([X, random_state.randn(n_samples, 200 * n_features)], axis=1)

분류 및 ROC 분석

다음으로, 교차 검증을 사용하여 SVM 분류기를 실행하고 ROC 곡선을 폴드별로 플롯합니다. Scikit-learn 의 StratifiedKFold를 사용하여 교차 검증 분할을 생성합니다. 또한 ROC 곡선의 평균 AUC 를 계산하고 TPR 의 표준 편차를 플롯하여 분류기 출력의 변동성을 확인합니다.

import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.metrics import auc
from sklearn.metrics import RocCurveDisplay
from sklearn.model_selection import StratifiedKFold

n_splits = 6
cv = StratifiedKFold(n_splits=n_splits)
classifier = svm.SVC(kernel="linear", probability=True, random_state=random_state)

tprs = []
aucs = []
mean_fpr = np.linspace(0, 1, 100)

fig, ax = plt.subplots(figsize=(6, 6))
for fold, (train, test) in enumerate(cv.split(X, y)):
    classifier.fit(X[train], y[train])
    viz = RocCurveDisplay.from_estimator(
        classifier,
        X[test],
        y[test],
        name=f"ROC fold {fold}",
        alpha=0.3,
        lw=1,
        ax=ax,
        plot_chance_level=(fold == n_splits - 1),
    )
    interp_tpr = np.interp(mean_fpr, viz.fpr, viz.tpr)
    interp_tpr[0] = 0.0
    tprs.append(interp_tpr)
    aucs.append(viz.roc_auc)

mean_tpr = np.mean(tprs, axis=0)
mean_tpr[-1] = 1.0
mean_auc = auc(mean_fpr, mean_tpr)
std_auc = np.std(aucs)
ax.plot(
    mean_fpr,
    mean_tpr,
    color="b",
    label=r"Mean ROC (AUC = %0.2f $\pm$ %0.2f)" % (mean_auc, std_auc),
    lw=2,
    alpha=0.8,
)

std_tpr = np.std(tprs, axis=0)
tprs_upper = np.minimum(mean_tpr + std_tpr, 1)
tprs_lower = np.maximum(mean_tpr - std_tpr, 0)
ax.fill_between(
    mean_fpr,
    tprs_lower,
    tprs_upper,
    color="grey",
    alpha=0.2,
    label=r"$\pm$ 1 std. dev.",
)

ax.set(
    xlim=[-0.05, 1.05],
    ylim=[-0.05, 1.05],
    xlabel="거짓 양성률",
    ylabel="참 양성률",
    title=f"평균 ROC 곡선 및 변동성\n(양성 레이블 '{target_names[1]}')",
)
ax.axis("square")
ax.legend(loc="lower right")
plt.show()

요약

이 실험에서 파이썬을 사용하여 교차 검증을 통해 수신자 작동 특성 (ROC) 지표의 분산을 추정하고 시각화하는 방법을 배웠습니다. 아이리스 데이터셋을 로드하고 노이즈 특징을 생성한 후 SVM 으로 데이터셋을 분류했습니다. 그런 다음 교차 검증을 사용하여 ROC 곡선을 플롯하고 훈련 세트가 서로 다른 하위 집합으로 분할될 때 분류기 출력의 변동성을 확인하기 위해 평균 AUC 를 계산했습니다. ROC 곡선은 이진 분류기의 성능을 평가하고 참 양성과 거짓 양성 사이의 트레이드오프를 보여주는 데 도움이 될 수 있습니다. 교차 검증은 분류기 출력의 변동성을 추정하고 문제에 가장 적합한 모델을 선택하는 데 도움이 될 수 있습니다.