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