모델 선택을 위한 중첩 교차 검증

Beginner

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

소개

중첩 교차 검증 (Nested cross-validation) 은 모델의 일반화 오류와 하이퍼파라미터를 추정하는 기술입니다. 특히, 서로 다른 모델을 선택하거나 하이퍼파라미터를 최적화해야 할 때 유용합니다. 이 튜토리얼에서는 아이리스 데이터셋을 사용하여 서포트 벡터 분류기 모델에서 중첩 교차 검증과 비중첩 교차 검증을 비교하고, 두 방법 간의 성능 차이를 시각화할 것입니다.

VM 팁

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

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

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

데이터셋 로드

첫 번째 단계는 scikit-learn 에서 아이리스 데이터셋을 로드하는 것입니다.

from sklearn.datasets import load_iris

## 데이터셋 로드
iris = load_iris()
X_iris = iris.data
y_iris = iris.target

하이퍼파라미터 정의

다음으로, 서포트 벡터 분류기를 위해 최적화할 하이퍼파라미터를 정의합니다. 이 경우 비용 매개변수 C와 커널 계수 gamma를 최적화합니다.

## 최적화할 매개변수의 가능한 값 설정
p_grid = {"C": [1, 10, 100], "gamma": [0.01, 0.1]}

모델 정의

반경 기저 함수 (radial basis function) 커널을 사용하는 서포트 벡터 분류기를 사용합니다.

from sklearn.svm import SVC

## "rbf" 커널을 사용하는 서포트 벡터 분류기를 사용합니다.
svm = SVC(kernel="rbf")

중첩되지 않은 교차 검증

하이퍼파라미터를 조정하고 모델의 성능을 평가하기 위해 중첩되지 않은 교차 검증을 사용합니다. GridSearchCV 함수는 추정기의 지정된 매개변수 값에 대한 철저한 검색을 수행합니다. 4-겹 교차 검증을 사용합니다.

from sklearn.model_selection import GridSearchCV

## 중첩되지 않은 매개변수 검색 및 점수 계산
clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=4)
clf.fit(X_iris, y_iris)
non_nested_score = clf.best_score_

중첩 교차 검증

모델과 그 하이퍼파라미터의 일반화 오차를 추정하기 위해 중첩 교차 검증을 사용합니다. 내부 루프에서 각 학습 집합에 대한 최상의 하이퍼파라미터를 찾기 위해 그리드 검색을 수행합니다. 외부 루프에서 테스트 집합에 대한 모델의 성능을 평가합니다.

from sklearn.model_selection import KFold, cross_val_score

## 임의 시도 횟수
NUM_TRIALS = 30

## 점수 저장을 위한 배열
non_nested_scores = np.zeros(NUM_TRIALS)
nested_scores = np.zeros(NUM_TRIALS)

## 각 시도에 대한 루프
for i in range(NUM_TRIALS):
    ## 데이터셋과 독립적으로 내부 및 외부 루프에 대한 교차 검증 기법을 선택합니다.
    inner_cv = KFold(n_splits=4, shuffle=True, random_state=i)
    outer_cv = KFold(n_splits=4, shuffle=True, random_state=i)

    ## 매개변수 최적화를 포함한 중첩 CV
    clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=inner_cv)
    nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv)
    nested_scores[i] = nested_score.mean()

score_difference = non_nested_score - nested_scores.mean()

결과 시각화

중첩되지 않은 교차 검증과 중첩 교차 검증의 결과를 막대 그래프로 시각화합니다.

from matplotlib import pyplot as plt

## 차이를 나타내는 막대 그래프를 생성합니다.
plt.bar(["중첩되지 않은", "중첩된"], [non_nested_score, nested_scores.mean()])
plt.ylim([0.9, 1.0])
plt.ylabel("점수")
plt.title("중첩되지 않은 및 중첩 교차 검증 점수")
plt.show()

요약

중첩 교차 검증은 모델과 하이퍼파라미터의 일반화 오차를 추정하는 강력한 기법입니다. 과적합을 방지하고 모델이 새로운 데이터에서 잘 작동하도록 하는 데 도움이 될 수 있습니다. 이 튜토리얼에서는 아이리스 데이터셋을 사용하여 서포트 벡터 분류기 모델에 대해 중첩되지 않은 교차 검증과 중첩 교차 검증을 비교했습니다. 두 방법 간의 성능 차이를 막대 그래프를 사용하여 시각화했습니다.