소개
이 실습에서는 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 곡선은 이진 분류기의 성능을 평가하고 참 양성과 거짓 양성 사이의 트레이드오프를 보여주는 데 도움이 될 수 있습니다. 교차 검증은 분류기 출력의 변동성을 추정하고 문제에 가장 적합한 모델을 선택하는 데 도움이 될 수 있습니다.