검출 오류 트레이드오프 곡선

Beginner

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

소개

이 튜토리얼에서는 Detection Error Tradeoff (DET) 곡선과 Receiver Operating Characteristic (ROC) 곡선을 비교해 볼 것입니다. DET 곡선은 ROC 곡선의 변형으로, y 축에 True Positive Rate (TPR) 대신 False Negative Rate (FNR) 를 표시합니다. 머신 러닝을 위한 인기있는 파이썬 라이브러리인 scikit-learn 을 사용하여 합성 데이터를 생성하고, ROC 및 DET 곡선을 통해 두 분류기의 임계값별 통계적 성능을 비교해 보겠습니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습용 Jupyter Notebook에 접속하십시오.

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

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

합성 데이터 생성

scikit-learn 의 make_classification 함수를 사용하여 합성 데이터를 생성합니다. 이 함수는 n 개의 정보 특징, n 개의 중복 특징, 그리고 클래스당 n 개의 클러스터를 가진 무작위 n-클래스 분류 문제를 생성합니다. 2 개의 정보 특징과 난수 상태 1 을 사용하여 1000 개의 샘플을 생성합니다. 그런 다음 데이터를 훈련 세트와 테스트 세트로 60/40 비율로 분할합니다.

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

X, y = make_classification(
    n_samples=1_000,
    n_features=2,
    n_redundant=0,
    n_informative=2,
    random_state=1,
    n_clusters_per_class=1,
)

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

분류기를 정의합니다.

ROC 및 DET 곡선을 사용하여 임계값에 따른 두 개의 서로 다른 분류기의 통계적 성능을 비교할 것입니다. scikit-learn 의 make_pipeline 함수를 사용하여 StandardScaler를 사용하여 데이터를 스케일링하고 LinearSVC 분류기를 학습하는 파이프라인을 생성합니다. 또한 scikit-learn 의 RandomForestClassifier 클래스를 사용하여 최대 깊이 5, 추정자 10 개, 최대 1 개의 특징을 가진 랜덤 포레스트 분류기를 학습합니다.

from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import make_pipeline
from sklearn.svm import LinearSVC

classifiers = {
    "Linear SVM": make_pipeline(StandardScaler(), LinearSVC(C=0.025, dual="auto")),
    "Random Forest": RandomForestClassifier(
        max_depth=5, n_estimators=10, max_features=1
    ),
}

ROC 및 DET 곡선 플롯

scikit-learn 의 RocCurveDisplayDetCurveDisplay 클래스를 사용하여 각각 ROC 및 DET 곡선을 플롯합니다. RocCurveDisplay.from_estimator 함수는 ROC 곡선을 계산하고 지정된 축에 플롯합니다. 마찬가지로 DetCurveDisplay.from_estimator 함수는 DET 곡선을 계산하고 지정된 축에 플롯합니다. ROC 곡선용 하나와 DET 곡선용 하나의 두 개의 서브플롯을 생성하고 각 분류기의 곡선을 플롯합니다.

import matplotlib.pyplot as plt
from sklearn.metrics import DetCurveDisplay, RocCurveDisplay

fig, [ax_roc, ax_det] = plt.subplots(1, 2, figsize=(11, 5))

for name, clf in classifiers.items():
    clf.fit(X_train, y_train)

    RocCurveDisplay.from_estimator(clf, X_test, y_test, ax=ax_roc, name=name)
    DetCurveDisplay.from_estimator(clf, X_test, y_test, ax=ax_det, name=name)

ax_roc.set_title("수신자 작동 특성 (ROC) 곡선")
ax_det.set_title("검출 오류 트레이드오프 (DET) 곡선")

ax_roc.grid(linestyle="--")
ax_det.grid(linestyle="--")

plt.legend()
plt.show()

결과 해석

ROC 곡선보다 DET 곡선을 사용하여 다양한 분류 알고리즘의 전반적인 성능을 시각적으로 평가하는 것이 더 쉽습니다. DET 곡선은 작동 지점 분석을 지원하기 위해 검출 오류 트레이드오프에 대한 직접적인 피드백을 제공합니다. 사용자는 FPR(또는 그 반대) 의 비용으로 받아들일 수 있는 FNR 을 결정할 수 있습니다.

요약

이 튜토리얼에서는 검출 오류 트레이드오프 (DET) 곡선과 수신자 작동 특성 (ROC) 곡선에 대해 학습하고 비교했습니다. scikit-learn 을 사용하여 합성 데이터를 생성하고 ROC 및 DET 곡선을 통해 두 분류기의 임계값에 따른 통계적 성능을 비교했습니다. DET 곡선은 ROC 곡선의 변형으로, 거짓 양성 비율 (FPR) 대신 거짓 음성 비율 (FNR) 을 y 축에 플롯합니다. DET 곡선은 작동 지점 분석을 지원하기 위해 검출 오류 트레이드오프에 대한 직접적인 피드백을 제공하여 분류 알고리즘의 성능 평가에 유용한 도구입니다.