교차 검증, 학습 곡선 및 최종 평가를 위해 데이터 세트를 분할하는 방법은 무엇입니까?


69

데이터 세트를 분할하기위한 적절한 전략은 무엇입니까?

나는 다음과 같은 접근 방식에 대한 피드백을 요청 (안 같은 개별 매개 변수에 대한 test_size또는 n_iter,하지만 내가 사용하는 경우 X, y, X_train, y_train, X_test, 그리고 y_test적절하고 순서가 의미가있는 경우) :

( scikit-learn 문서 에서이 예제를 확장 )

1. 데이터 셋로드

from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target

2. 교육 및 테스트 세트로 분할 (예 : 80/20)

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

3. 견적자를 선택하십시오

from sklearn.svm import SVC
estimator = SVC(kernel='linear')

4. 교차 검증 반복자를 선택하십시오

from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)

5. 하이퍼 파라미터 조정

훈련 세트 에 교차 검증 반복자를 적용

from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)

6. 학습 곡선으로 디버그 알고리즘

X_train훈련과 테스트 세트로 무작위로 10 회 분할됩니다 ( n_iter=10). 훈련 점수 곡선의 각 지점은 모델이 첫 i 훈련 예제 에서 훈련되고 평가 된 평균 10 점 입니다. 교차 검증 점수 곡선의 각 지점은 모델이 첫 번째 i 훈련 예제에서 학습되고 테스트 세트의 모든 예제에서 평가 된 평균 10 점 입니다.

from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()

학습 곡선

plot_learning_curve () 는 현재 개발 버전의 scikit-learn (0.15-git)에서 찾을 수 있습니다.

7. 시험 세트에 대한 최종 평가

classifier.score(X_test, y_test)

7a. 중첩 교차 검증을 사용하여 모델 선택에서 오버 피팅 테스트 (전체 데이터 세트 사용)

from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)

추가 질문 : 7 단계를 중첩 교차 검증으로 대체하는 것이 합리적입니까? 또는 중첩 된 cv가 7 단계를 보완하는 것으로 간주되어야합니다.

(코드는 scikit-learn에서 k-fold cross validation으로 작동하지만 shuffle & split에서는 작동하지 않는 것 같습니다. 따라서 cv코드를 작동 시키려면 위의 코드를 변경해야합니다)

8. 전체 데이터 세트에서 최종 모델 훈련

classifier.fit(X, y)

편집 : 이제 7a 단계 가이 순서에서 의미가 없다는 맹세에 동의합니다. 그래서 나는 그것을 채택하지 않을 것입니다.


어떤 정확도 점수 규칙을 사용하고 있습니까? 분류 정확도 인 경우 이러한 부적절한 점수 지정 규칙은 수행 한 많은 작업을 취소합니다.
Frank Harrell

실제로 분류 정확도 인 기본값을 사용했습니다. 예를 들어 F1이 더 적합하다는 것을 알고 있습니다. 그러나 여기서는 분할이 잘 사용되는지 관심이 있습니다.
tobip

3
나는 F1이 오래된 개념의 새로운 이름이라고 거의 확신합니다. 나는 오래된 것들에 대한 새로운 이름을 발명하는 것이 비생산적이라고 생각합니다. 더 중요한 것은 잘못된 점수 지정 규칙으로 인해 잘못된 기능을 선택하고 전체 프로세스에 많은 노이즈를 추가하게됩니다.
Frank Harrell

3
... 어쨌든 F1은 @FrankHarrell이 다음과 같이 주장하는 정확성 문제를 공유합니다. 이는 하드 분류의 테스트 사례의 일부를 세는 것에서 비롯됩니다. Frank의 적절한 점수 규칙 중 하나를 얻으려면 SVM의 확률 적 출력으로 전환 한 다음 정확도 대신 Brier의 점수 (평균 제곱 오차)를 사용해야합니다. M1 유형의 F1 버전을 파생시킬 수도 있습니다. 이러한 조치는 실제로 튜닝 단계에 더 좋습니다. 최종 성과를 전달하려면 커뮤니티의 성과를 표현하는 일반적인 방법 (예 : 정확성, F1)이 필요할 수도 있습니다.
cbeleites

1
@ ta.ft : 접근 방식이 잘못된 지 여부는 잘못된 것으로 간주됩니다. 비율에 대한 그리드 검색은 엄청나게 많은 수의 독립적 인 사례가없는 한 분산 차이가 크게 줄어들 위험이 있습니다. 따라서 많은 상황에서 그리드 검색이 최적의 모델을 생성한다는 주장은 잘못되었습니다. 그러나 적절한 중첩 유효성 검사를 수행하는 경우 외부 유효성 검사는 선택된 "최적의"모델 성능을 정직하게 측정합니다. 그래서 그것은 잘못이 아닙니다. 그리드 검색에 최적의 모델이 있다는 보장은 없습니다. 문헌에 대해서는 답변을 업데이트하겠습니다.
cbeleites

답변:


41

7a 단계에서 수행 할 작업이 확실하지 않습니다. 지금 당장 이해하지만 이해가되지 않습니다.

설명을 이해하는 방법은 다음과 같습니다. 7 단계에서 홀드 아웃 성능을 4-6 단계를 포괄하는 교차 검증 결과와 비교하려고합니다.

이 비교가 의미가 없다고 생각하는 주된 이유는 다음과 같습니다.

  • 이 비교는 실제로 경험할 수있는 과도하게 낙관적 인 유효성 검사 결과의 두 가지 주요 원인을 감지 할 수 없습니다.

    • 계층 적 (일명 클러스터 된) 데이터 구조로 인해 발생하는 교육 데이터와 테스트 데이터 간의 데이터 유출 (종속성). 필자의 분야에서는 일반적으로 동일한 환자 또는 생물학적 복제 실험에 대한 여러 번 (때로는 수천 개)의 판독 값 (= 데이터 매트릭스의 행)이 있습니다. 이들은 독립적이지 않으므로 검증 분할은 환자 수준에서 수행되어야합니다. 그러나 이러한 데이터 유출이 발생하면 홀드 아웃 세트 분할과 교차 유효성 검사 분할 모두에서 데이터 유출이 발생합니다. 홀드 아웃은 교차 검증과 마찬가지로 낙관적으로 바이어스됩니다.

    • 전체 데이터 매트릭스에서 수행되는 데이터의 전처리. 계산은 각 행에 대해 독립적이지 않지만 많은 / 모든 행이 전처리에 대한 매개 변수를 계산하는 데 사용됩니다. 전형적인 예는 예를 들어 "실제"분류 이전의 PCA 투영 일 것이다.
      다시 말하지만, 이는 홀드 아웃 및 외부 교차 검증에 모두 영향을 미치므로이를 감지 할 수 없습니다.

    내가 작업하는 데이터의 경우 두 가지 오류로 인해 잘못 분류되는 부분이 쉽게 과소 평가 될 수 있습니다!

  • 이 계산 된 테스트 사례 유형의 성능 유형으로 제한되는 경우 모델 비교에는 매우 많은 수의 테스트 사례 또는 실제 성능의 엄청나게 큰 차이가 필요합니다. 무제한의 훈련 데이터를 가진 2 개의 분류기를 비교 하는 것이 더 읽기에 좋은 출발점이 될 수 있습니다.

그러나 모델 품질을 "최적"모델에 대한 내부 교차 검증 청구와 외부 교차 검증 또는 홀드 아웃 검증을 비교하는 것은 의미가 있습니다. 불일치가 높으면 그리드 검색 최적화가 작동했는지 여부에 의문이 생깁니다 ( 성능 측정의 높은 분산으로 인한 분산 차이). 내부 비교가 다른 것에 비해 엄청나게 좋은 경우 문제를 발견 할 수 있다는 점에서이 비교가 더 쉽습니다. 그렇지 않은 경우 최적화에 대해 그다지 걱정할 필요가 없습니다. 그러나 어쨌든 성능에 대한 외부 (7) 측정이 정직하고 건전한 경우, 획득 한 모델이 최적인지 아닌지에 대한 유용한 추정치가 있어야합니다.

학습 곡선을 측정하는 IMHO는 아직 다른 문제입니다. 아마 별도로 처리 할 것입니다. 학습 곡선이 필요한 것을 더 명확하게 정의해야한다고 생각합니다 ( 주어진 문제, 데이터 및 분류 방법 데이터 세트 또는 학습 곡선에 대한 학습 곡선이 필요합니까? 대한 ) 문제, 데이터 및 분류 mehtod 주어진 데이터 세트 및 추가 결정의 무리 (예 : 훈련 샘플 크기의 함수로 모델의 복잡성에 대처하는 방법? 최적화 다시 한번 고정 된 하이퍼 파라미터를 사용에 대한 결정 훈련 세트 크기에 따라 하이퍼 파라미터를 수정하는 기능?)

(내 데이터에는 실제로 실제로 사용하기에 충분히 정확한 학습 곡선 측정을 얻을 수있는 독립적 인 사례가 거의 없지만 1200 행이 실제로 독립적 인 경우 더 나을 수 있습니다)


업데이트 : scikit-learn 예제에서 "잘못된"것은 무엇입니까?

우선, 중첩 교차 검증에는 아무런 문제가 없습니다. 중첩 유효성 검사는 데이터 중심 최적화에 가장 중요하며 교차 유효성 검사는 매우 강력한 접근 방식입니다 (특히 반복 / 반복되는 경우).

그런 다음 문제가 전혀 없는지 여부는 관점에 따라 달라집니다. 정직한 중첩 유효성 검사 (외부 테스트 데이터를 엄격하게 독립적으로 유지)를 수행하는 한 외부 유효성 검사는 "최적의"모델 성능의 적절한 척도입니다. 아무 문제가 없습니다.

그러나 SVM의 하이퍼 파라미터 튜닝을위한 이러한 비례 유형 성능 측정에 대한 그리드 검색에는 몇 가지 문제가 발생할 수 있습니다. 기본적으로 그들은 (아마?) 최적화에 의존 할 수 없다는 것을 의미합니다. 그럼에도 불구하고 외부 분할이 올바르게 수행 된 경우에는 모델이 최상의 결과가 아니더라도 획득 한 모델의 성능을 정직하게 추정 할 수 있습니다.

최적화가 어려울 수있는 이유를 직관적으로 설명하려고합니다.

  • 수학적으로 / 통계적으로 말하면, 비율의 문제는 측정 된 비율 가 유한 테스트 샘플 크기 (모델의 실제 성능 에 따라 다름) 으로 인해 큰 차이를 겪을 수 있다는 것입니다 . N, P의VR( P은 )=P(1-P)p^np
    Var(p^)=p(1p)n

    리콜, 정밀도 (머신 러닝 성능 감지)를 추정하는 데 필요한 정밀도 (바이어스 / 분산 감지)를 달성하려면 엄청나게 많은 수의 케이스 (적어도 내가 일반적으로 가질 수있는 케이스 수와 비교)가 필요합니다. 이것은 물론 이러한 비율로 계산 한 비율에도 적용됩니다. 이항 비율에 대한 신뢰 구간을 살펴보십시오. 그들은 놀랍게도 크다! 하이퍼 파라미터 그리드에 비해 성능이 실제로 향상되는 것보다 더 큽니다. 통계적으로 말하면 그리드 검색은 대규모 다중 비교 문제입니다. 그리드의 포인트가 많을수록 실수로 평가하는 열차 / 테스트 분할에 매우 좋은 하이퍼 파라미터 조합을 찾을 위험이 높아집니다. 이것이 스키밍 차이에 대한 의미입니다.

  • 직관적으로 하이퍼 파라미터의 가상 변화를 고려하면 모델이 서서히 저하 될 수 있습니다. 한 테스트 사례가 의사 결정 경계를 향해 이동합니다. '하드'비율 성능 측정은 케이스가 경계를 넘고 반대쪽에 올 때까지이를 감지하지 못합니다. 그러나, 그들은 하이퍼 파라미터의 무한한 작은 변화에 대해 즉시 전체 오류를 할당합니다.
    수치 최적화를 수행하려면 성능 측정 값이 제대로 작동해야합니다. 즉, 비례 유형 성능 측정의 급격한 (계속 구별 할 수없는) 부분이나 실제로 발생하는 변경이 감지되지 않는다는 사실이 최적화에 적합하지 않습니다.
    적절한 점수 규칙은 최적화에 특히 적합한 방식으로 정의됩니다. 예측 확률이 문제의 클래스에 속하는 각 사례의 실제 확률과 일치 할 때 전체 최대 값을 갖습니다.

  • SVM의 경우 성능 측정뿐만 아니라 모델이이 뾰족한 방식으로 반응한다는 추가 문제가 있습니다. 하이퍼 파라미터를 조금만 변경해도 아무런 변화가 없습니다. 하이퍼 파라미터가 어떤 경우에 서포트 벡터가되지 않거나 서포트 벡터가 될 수있을 정도로 변할 때만 모델이 변경됩니다. 다시, 이러한 모델은 최적화하기가 어렵습니다.

문학:


업데이트 II : 스키밍 차이

모델 비교 측면에서 감당할 수있는 것은 분명히 독립적 인 사례의 수에 달려 있습니다. 스키밍 분산의 위험에 대한 빠르고 더러운 시뮬레이션을 작성해 보겠습니다.

scikit.learndigits데이터에 1797 개가 있다고합니다 .

  • 100 개의 모델, 예를 들어 2 개의 매개 변수에 대해 그리드를 비교한다고 가정합니다 .10×10
  • 두 매개 변수 (범위)가 모델에 전혀 영향을 미치지 않는다고 가정합니다.
  • 즉, 모든 모델의 97 % ( digits데이터 세트의 일반 성능)와 동일한 실제 성능을 갖습니다 .

  • 데이터 세트 에서 표본 크기 = 1797 행으로 "이 모델 테스트"에 대한 시뮬레이션 실행104digits

    p.true = 0.97 # hypothetical true performance for all models
    n.models = 100 # 10 x 10 grid
    
    n.rows = 1797 # rows in scikit digits data
    
    sim.test <- replicate (expr= rbinom (n= nmodels, size= n.rows, prob= p.true), 
                           n = 1e4)
    sim.test <- colMaxs (sim.test) # take best model
    
    hist (sim.test / n.rows, 
          breaks = (round (p.true * n.rows) : n.rows) / n.rows + 1 / 2 / n.rows, 
          col = "black", main = 'Distribution max. observed performance',
          xlab = "max. observed performance", ylab = "n runs")
    abline (v = p.outer, col = "red")
    

최상의 성능을위한 분포는 다음과 같습니다.

스키밍 분산 시뮬레이션

빨간색 선은 모든 가상 모델의 실제 성능을 나타냅니다. 평균적으로, 우리는 100 개의 비교 된 모델 중 가장 겉보기에는 실제 오류율의 2/3 만 관찰합니다 (시뮬레이션의 경우 모두 97 % 정확한 예측과 동일하게 수행됨을 알고 있습니다).

이 시뮬레이션은 분명히 매우 단순화되었습니다.

  • 테스트 표본 크기 분산 외에도 모형 불안정성으로 인한 분산이 있으므로 여기에서 분산을 과소 평가합니다
  • 모델 복잡성에 영향을 미치는 튜닝 파라미터는 일반적으로 모델이 불안정하고 분산이 높은 파라미터 세트를 포괄합니다.
  • 예제의 UCI 숫자의 경우 원래 데이터베이스에는 ca. 44 명이 쓴 11000 자리 숫자. 쓴 사람에 따라 데이터가 묶이면 어떻게됩니까? (즉, 그 사람이 3을 쓰는 방법을 알고 있다면 누군가가 쓴 8을 더 쉽게 인식 할 수 있습니까?) 효과적인 표본 크기는 44만큼 낮을 수 있습니다.
  • 튜닝 모델 하이퍼 파라미터는 모델간에 상관 관계를 유발할 수 있습니다 (사실 수치 계산 관점에서 잘 작동하는 것으로 간주 됨). 그 영향을 예측하기는 어렵습니다 (실제 분류기 유형을 고려하지 않고는 불가능하다고 생각합니다).

그러나 일반적으로 독립 테스트 사례 수가 적고 비교 모델 수가 많으면 편향이 증가합니다. 또한 Cawley와 Talbot 논문은 경험적으로 관찰 된 행동을 보여줍니다.


@cbleites : 그리드 검색이 최적 모델을 찾는 데 적합한 방법이 아닌 경우 어떤 방법을 선택해야합니까?
초에 tobip

1
@ ta.ft : 두 가지 접근 방식은 a) 비교해야 할 모델 수를 대폭 줄이기 위해 응용 프로그램 및 데이터에 대한 많은 외부 지식을 모델링에 통합합니다 (= 최적화 대신 하이퍼 파라미터 결정). 본질적으로 의미있는 하이퍼 파라미터가있는 분류기로 변경하는 것이 좋습니다. 예를 들어 응용 프로그램 및 데이터 유형에서 하이퍼 파라미터가 무엇인지 알 수 있습니다. b) 몇 가지 남은 모델을 적절한 점수 규칙으로 비교합니다. 예를 들어 Briers 점수는 많은 분류 자에 대한 분산 특성이 훨씬 뛰어납니다.
cbeleites

1
의사 결정을 통해 전혀 최적화를 거부 할 수도 있습니다 (a). 충분히 좋은 분류기를 얻고 사용 가능한 표본 크기가 주어지면 다른 분류 자의 우위를 입증 할 기회가 없다고 주장 할 수있는 경우 (예 : 일부 데모 McNemar 계산 수행) 가설 적으로 더 나은 분류자를위한 비율 비교를 위해 필요한 표본 크기를 찾아보십시오. 엄청나게 큰 가상의 개선에도 불구하고 이것들이 엄청나게 클 가능성이 큽니다.) 최적화가 의미가 없으며 과적 합의 위험을 초래한다고 주장 할 수 있습니다.
cbeleites

"스키밍 편차"에 대해서는 동의하지 않습니다. 하이퍼 파라미터 최적화를 위해 그리드에 많은 포인트가있는 경우, 포인트는 CV의 한 배에서 기회가 될 수 있습니다. 그러나 10 배 CV라고하더라도 CV의 10 배 모두에서 우연히 매개 변수 세트가 운이 좋지 않을 수도 있습니다.
RNA

1
@RNA : 모든 접힘에서 "운이 좋을"확률은 총 사례 수 (모든 10 접음)에 직접 연결되며 일반적으로 모든 접힘에 대한 평균 만 고려됩니다. 나는 예제 시나리오에 대한 상당한 편견 (오류 비율이 1/3만큼 낮음)과 이미 관련이있는 100 가지 모델 중 가장 좋은 모델 (예 : 각 10 단계의 2 개의 하이퍼 매개 변수)을 시뮬레이션하여 답변을 업데이트했습니다. . 여기에있는 많은 사람들이 수 천 건의 독립 사례를 거의 가지고 있지 않습니다. 예를 들어, 전체 UCI 숫자 데이터 세트에 숫자를 쓴 44 명의 개인조차 거의 없습니다.
cbeleites
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.