클래스 가능도 비율을 활용한 분류 성능 측정

Beginner

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

소개

이 실습에서는 scikit-learn 을 사용하여 이진 분류기의 예측력을 평가하기 위해 양성 및 음성 가능도 비율 (LR+, LR-) 을 계산하는 방법을 보여줍니다. 이러한 지표는 테스트 세트 내 클래스 비율과 무관하여 연구에 사용 가능한 데이터의 클래스 비율이 대상 응용 프로그램과 다른 경우 매우 유용합니다. 다음 단계를 거칠 것입니다.

VM 팁

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

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

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

데이터 준비

scikit-learn 의 make_classification 함수를 사용하여 합성 데이터 세트를 생성합니다. 이 데이터 세트는 질병을 가진 대상이 소수인 인구를 시뮬레이션합니다.

사전 검사 대 사후 검사 분석

데이터에 로지스틱 회귀 모델을 적합하고, 보류된 테스트 세트에서 성능을 평가합니다. 이 분류기가 질병 진단 도구로서의 유용성을 평가하기 위해 양성 가능도 비율을 계산합니다.

가능도 비율의 교차 검증

특정 경우에 대한 클래스 가능도 비율 측정의 변동성을 교차 검증을 통해 평가합니다.

유병률에 대한 불변성

질병 가능도 비율은 질병 유병률과 무관하며, 어떠한 클래스 불균형에도 관계없이 인구 집단 간에 외삽될 수 있음을 보여줍니다.

데이터 준비

make_classification 함수를 사용하여 scikit-learn 에서 합성 데이터 세트를 생성합니다. 이 데이터 세트는 질병을 가진 피험자의 비율이 적은 인구를 시뮬레이션합니다.

from sklearn.datasets import make_classification

X, y = make_classification(n_samples=10_000, weights=[0.9, 0.1], random_state=0)
print(f"질병을 가진 사람의 비율: {100*y.mean():.2f}%")

사전 검사 대 사후 검사 분석

데이터에 로지스틱 회귀 모델을 적합하고, 보류된 테스트 세트에서 성능을 평가합니다. 이 분류기가 질병 진단 도구로서의 유용성을 평가하기 위해 양성 가능도 비율을 계산합니다.

from sklearn.model_selection import train_test_split
from sklearn.metrics import class_likelihood_ratios
from sklearn.linear_model import LogisticRegression

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

estimator = LogisticRegression().fit(X_train, y_train)
y_pred = estimator.predict(X_test)
pos_LR, neg_LR = class_likelihood_ratios(y_test, y_pred)

print(f"LR+: {pos_LR:.3f}")

가능도 비율의 교차 검증

특정 경우에 대한 클래스 가능도 비율 측정의 변동성을 교차 검증을 통해 평가합니다.

import pandas as pd
from sklearn.model_selection import cross_validate
from sklearn.dummy import DummyClassifier

def scoring(estimator, X, y):
    y_pred = estimator.predict(X)
    pos_lr, neg_lr = class_likelihood_ratios(y, y_pred, raise_warning=False)
    return {"positive_likelihood_ratio": pos_lr, "negative_likelihood_ratio": neg_lr}

def extract_score(cv_results):
    lr = pd.DataFrame(
        {
            "positive": cv_results["test_positive_likelihood_ratio"],
            "negative": cv_results["test_negative_likelihood_ratio"],
        }
    )
    return lr.aggregate(["mean", "std"])

estimator = LogisticRegression()
extract_score(cross_validate(estimator, X, y, scoring=scoring, cv=10))

estimator = DummyClassifier(strategy="stratified", random_state=1234)
extract_score(cross_validate(estimator, X, y, scoring=scoring, cv=10))

estimator = DummyClassifier(strategy="most_frequent")
extract_score(cross_validate(estimator, X, y, scoring=scoring, cv=10))

유병률에 대한 불변성

질병 가능도 비율은 질병 유병률과 무관하며, 어떠한 클래스 불균형에도 관계없이 인구 집단 간에 외삽될 수 있음을 보여줍니다.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.inspection import DecisionBoundaryDisplay
from collections import defaultdict

## ... (나머지 코드 생략)

요약

이 실험에서 이진 분류기의 예측력을 평가하기 위해 양성 및 음성 가능도 비율을 계산하는 방법을 배웠습니다. 이러한 지표는 테스트 세트 내 클래스 비율과 무관하여 연구에 사용 가능한 데이터의 클래스 비율이 대상 응용 프로그램과 다른 경우 매우 유용합니다. 또한 교차 검증을 사용하여 특정 경우에 클래스 가능도 비율 측정의 변동성을 평가하고, 클래스 가능도 비율이 질병 유병률과 무관함을 보여주는 방법을 배웠습니다.