분류를 위한 퍼뮤테이션 검정 점수

Beginner

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

소개

머신 러닝에서 우리는 종종 분류 모델의 성능을 점수를 사용하여 평가합니다. 그러나 모델 성능이 우연히 발생한 것인지 확인하기 위해 점수의 유의성을 테스트해야 합니다. 바로 이때 퍼뮤테이션 테스트 점수가 유용합니다. 이는 데이터 세트의 1000 개 다른 퍼뮤테이션에 대한 분류기의 정확도를 계산하여 널 분포를 생성합니다. 그런 다음 원본 데이터를 사용하여 얻은 점수보다 큰 점수를 얻은 퍼뮤테이션의 백분율로 경험적 p-값을 계산합니다. 이 실습에서는 sklearn.model_selectionpermutation_test_score 함수를 사용하여 퍼뮤테이션을 사용하여 교차 검증된 점수의 유의성을 평가할 것입니다.

VM 팁

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

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

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

데이터셋 로드 및 랜덤 피처 생성

붓꽃 (iris) 데이터셋을 사용할 것입니다. 이 데이터셋은 3 가지 종류의 붓꽃에서 측정된 값으로 구성되어 있으며, 붓꽃 데이터셋의 클래스 레이블과 상관관계가 없는 랜덤 피처 데이터 (즉, 20 개의 피처) 를 생성합니다.

from sklearn.datasets import load_iris
import numpy as np

iris = load_iris()
X = iris.data
y = iris.target

n_uncorrelated_features = 20
rng = np.random.RandomState(seed=0)
X_rand = rng.normal(size=(X.shape[0], n_uncorrelated_features))

원본 데이터에 대한 퍼뮤테이션 테스트 점수

다음으로, 원본 붓꽃 데이터셋과 SVC 분류기, 그리고 각 라운드에서 모델을 평가하기 위한 accuracy 점수를 사용하여 permutation_test_score를 계산합니다.

from sklearn.svm import SVC
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import permutation_test_score

clf = SVC(kernel="linear", random_state=7)
cv = StratifiedKFold(2, shuffle=True, random_state=0)

score_iris, perm_scores_iris, pvalue_iris = permutation_test_score(
    clf, X, y, scoring="accuracy", cv=cv, n_permutations=1000
)

랜덤 데이터에 대한 퍼뮤테이션 테스트 점수

다음으로, 피처와 레이블 간에 의존성이 없어야 하는 랜덤하게 생성된 피처와 붓꽃 레이블을 사용하여 permutation_test_score를 계산합니다.

score_rand, perm_scores_rand, pvalue_rand = permutation_test_score(
    clf, X_rand, y, scoring="accuracy", cv=cv, n_permutations=1000
)

결과 플롯

원본 붓꽃 데이터셋과 무작위 데이터 모두에 대한 퍼뮤테이션 점수 (널 분포) 의 히스토그램을 플롯합니다. 또한, 원본 데이터에 대한 분류기의 점수를 빨간색 선으로 표시하고 각 그래프에 p-값을 표시합니다.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

## 원본 데이터
ax.hist(perm_scores_iris, bins=20, density=True)
ax.axvline(score_iris, ls="--", color="r")
score_label = f"원본 데이터 점수: {score_iris:.2f}\n(p-값: {pvalue_iris:.3f})"
ax.text(0.7, 10, score_label, fontsize=12)
ax.set_xlabel("정확도 점수")
_ = ax.set_ylabel("확률 밀도")

plt.show()

fig, ax = plt.subplots()

## 무작위 데이터
ax.hist(perm_scores_rand, bins=20, density=True)
ax.set_xlim(0.13)
ax.axvline(score_rand, ls="--", color="r")
score_label = f"원본 데이터 점수: {score_rand:.2f}\n(p-값: {pvalue_rand:.3f})"
ax.text(0.14, 7.5, score_label, fontsize=12)
ax.set_xlabel("정확도 점수")
ax.set_ylabel("확률 밀도")

plt.show()

요약

이 실험에서 sklearn.model_selectionpermutation_test_score 함수를 사용하여 교차 검증된 점수의 유의성을 퍼뮤테이션을 통해 평가하는 방법을 배웠습니다. 데이터셋의 1000 개 다른 퍼뮤테이션에 대한 분류기의 정확도를 계산하여 널 분포를 생성했으며, 원본 데이터를 사용하여 얻은 점수보다 큰 점수를 얻은 퍼뮤테이션의 백분율로 경험적 p-값을 계산했습니다. 또한 결과를 플롯하여 널 분포와 원본 데이터에서 얻은 점수를 시각적으로 보여주었습니다.