기본 k-겹 교차 검증 방법보다 좀 더 향상된 방법은 계층적 k-겹 교차 검증(stratified k-fold cross-validation)입니다. 좀 더 나은 편향과 분산 추정을 만듭니다. 특히 앞에서 언급한 론 코하비가 보인 것처럼 클래스 비율이 동등하지 않을 때입니다. 계층적 교차 검증은 각 폴드에서 클래스 비율이 전체 훈련 데이터셋에 있는 클래스 비율을 대표하도록 유지합니다. 사이킷런의 StratifiedKFold 반복자를 사용하여 예시를 만들어 보겠습니다. StratifiedKFold 클래스의 shuffle 매개변수를 True로 지정하면 폴드를 나누기 전에 샘플을 섞습니다. 기본값은 False입니다. shuffle=False일 때 random_state 매개변수를 지정하면 경고가 발생하며 사이킷런 0.24 버전부터는 에러가 발생합니다.
>>> import numpy as np
>>> from sklearn.model_selection import StratifiedKFold
>>> kfold = StratifiedKFold(n_splits=10).split(X_train, y_train)
>>> scores = []
>>> for k, (train, test) in enumerate(kfold):
... pipe_lr.fit(X_train[train], y_train[train])
... score = pipe_lr.score(X_train[test], y_train[test])
... scores.append(score)
... print('폴드: %2d, 클래스 분포: %s, 정확도: %.3f' % (k+1,
... np.bincount(y_train[train]), score))
폴드: 1, 클래스 분포: [256 153], 정확도: 0.935
폴드: 2, 클래스 분포: [256 153], 정확도: 0.935
폴드: 3, 클래스 분포: [256 153], 정확도: 0.957
폴드: 4, 클래스 분포: [256 153], 정확도: 0.957
폴드: 5, 클래스 분포: [256 153], 정확도: 0.935
폴드: 6, 클래스 분포: [257 153], 정확도: 0.956
폴드: 7, 클래스 분포: [257 153], 정확도: 0.978
폴드: 8, 클래스 분포: [257 153], 정확도: 0.933
폴드: 9, 클래스 분포: [257 153], 정확도: 0.956
폴드: 10, 클래스 분포: [257 153], 정확도: 0.956
>>> print('\nCV 정확도: %.3f +/- %.3f' %
... (np.mean(scores), np.std(scores)))
CV 정확도: 0.950 +/- 0.014