모델 선택 및 교차 검증 : 올바른 방법


34

CrossValidated에는 모델 선택 및 교차 검증 주제에 대한 수많은 스레드가 있습니다. 몇 가지가 있습니다 :

그러나 이러한 스레드에 대한 답변은 상당히 일반적이며 교차 검증 및 모델 선택에 대한 특정 접근 방식의 문제를 강조합니다.

같은 일을하기 위해 가능한 한 콘크리트 , 우리는 RBF 커널과 SVM으로 작동하는지 예를 들어 말 : , 그리고 나는 기능의 데이터 세트가 X 와 라벨의 Y를 , 내가 원하는 것을K(x,x)=(γ|xx|)2

  1. 내 모델의 가능한 가장 좋은 값을 찾으십시오 ( andCγC )
  2. 내 데이터 세트로 SVM 교육 (최종 배포)
  3. 이 오차에 대한 일반화 오차와 불확실성 (분산)을 추정하십시오.

그렇게하기 위해 개인적으로 그리드 검색을 수행합니다. 예를 들어 와 의 가능한 모든 조합을 시도합니다 . 간단히하기 위해 다음 범위를 가정 할 수 있습니다.γCγ

  • C{10,100,1000}
  • γ{0.1,0.2,0.5,1.0}

더 구체적으로, 전체 데이터 세트를 사용하여 다음을 수행합니다.

  1. 모든 (들어 , 의) 한 쌍, 나는 반복 (예를 들어 100 임의 반복)를 반복 할 교차 검증을 -fold (예 : ), 내 데이터 세트, 즉 내가 내 SVM 훈련에 주름 및 평가 폴드 왼쪽에 오류가 발생하여 모든 폴드를 반복합니다 . 전반적으로 100 x 10 = 1000 테스트 오류를 ​​수집합니다.γ K K = 10 K - 1 KCγKK=10K1K
  2. 이러한 각 ( , ) 쌍에 대해 1000 테스트 오류 의 평균과 분산을 계산합니다 .γ μ M , σ MCγμM,σM

이제 전체 데이터 세트에서 최종 SVM을 교육하는 데 사용할 최상의 모델 (최상의 커널 매개 변수)을 선택하고 싶습니다. 내 이해는 오류 평균가장 낮고 분산이 및 모델을 선택하는 것이 옳은 선택 모델의 이 경우 훈련시 모델의 일반화 오류 바이어스 및 분산에 대한 최선의 추정치입니다 전체 데이터 세트.σ M μ M σ MμMσMμMσM

그러나 위의 스레드에서 답변을 읽은 후 배포 및 / 또는 오류 (일반화 성능)를 추정하기위한 최상의 SVM을 선택하기위한이 방법에 결함이 있으며 더 나은 방법을 선택할 수 있다는 인상을 받았습니다 최고의 SVM 및 오류보고. 그렇다면 무엇입니까? 구체적인 답변을 찾고 있습니다.

이 문제에 집착, 어떻게 구체적으로 내가 선택할 수있는 최선의 모델을 하고 적절하게 그 일반화의 오류를 추정 ?


가능한 한 구체적으로 작성하려면 다음을 알려주십시오. 데이터 세트에 통계적으로 독립적 인 사례가 몇 개 있습니까? 최적화를 위해 평가할 대상 함수는 무엇입니까? 어떤 종류의 오류 측정을 사용하십니까? 실제로 매개 변수 그리드에서 선택한 오류 측정의 일관된 동작을 관찰합니까? 분류에 대해 이야기하고 오류 측정에서 허용하는 경우 : 반복 된 교차 검증 결과는 유한 표본 크기로 인해 예상되는 분산과 비교하지만 측정 할 수없는 방법과 어떻게 비교됩니까?
cbeleites는


2
데이터 과학 커뮤니티에 대한 매우 명확하고 상세한 질문과 관련성이 높은 질문에 +1합니다.
NickBraunagel

답변:


20

JMLR의 저의 논문은이 정확한 질문을 다루며, 질문에서 제안 된 절차 (또는 적어도 하나는 매우 유사 함)가 낙관적으로 편향된 성능 추정치를 초래하는 이유를 보여줍니다.

Gavin C. Cawley, Nicola LC Talbot, "성능 평가에서 모델 선택 및 후속 선택 바이어스에 과적 합", 기계 학습 연구 저널, 11 (Jul) : 2079-2107, 2010. ( www )

기억해야 할 중요한 점은 교차 검증은 모델 자체가 아니라 모델 생성 방법의 일반화 성능을 추정하는 기술이라는 것입니다. 따라서 커널 매개 변수를 선택하는 것이 모델 생성 프로세스의 일부인 경우 모델 선택 프로세스를 교차 검증해야합니다. 그렇지 않으면 제안 된 절차에서와 같이 낙관적으로 편향된 성능 추정치가 나타납니다.

속성 X와 원하는 응답 Y로 구성된 데이터 세트를 가져오고 하이퍼 매개 변수 튜닝 (이 경우 커널 및 정규화 매개 변수)을 포함하여 해당 데이터 세트에 적합한 모델을 리턴하는 fit_model 함수가 있다고 가정하십시오. 이러한 하이퍼 파라미터의 튜닝은 여러 가지 방법으로 수행 할 수 있습니다 (예 : X 및 T에 대한 교차 검증 오류 최소화).

1 단계-fit_model 함수를 사용하여 모델을 사용 가능한 모든 데이터에 맞 춥니 다. 이를 통해 작동에 사용할 모델이 제공됩니다.

2 단계-성능 평가 사용 가능한 모든 데이터를 사용하여 반복 교차 검증을 수행하십시오. 각 접기에서 데이터는 훈련 세트와 테스트 세트로 분할됩니다. 트레이닝 세트를 사용하여 모델을 맞추고 (적합한 모델의 하이퍼 파라미터 값을 기록) 테스트 세트의 성능을 평가하십시오. 모든 테스트 세트의 평균을 성능 추정치로 사용하십시오 (그리고 값의 확산도 살펴보십시오).

3 단계-하이퍼 파라미터 설정의 다양성-3 단계에서 수집 한 하이퍼 파라미터 값의 분석을 수행합니다. 그러나 하이퍼 파라미터에는 특별한 것이 없다는 점을 지적해야합니다. ) 데이터에서. 계산 / 수학적 편의를 위해 매개 변수가 아닌 하이퍼 파라미터로 취급되지만 반드시 그럴 필요는 없습니다.

교차 검증을 사용할 때의 문제점은 훈련 및 테스트 데이터가 독립적 인 샘플이 아니며 (데이터를 공유 할 때) 성능 추정치와 하이퍼 파라미터의 편차 추정치가 편향 될 수 있음을 의미합니다 (예 : 각 폴더에서 실제로 독립적 인 데이터 샘플보다 작습니다). 교차 검증을 반복하는 대신 부트 스트랩을 대신 사용하고 계산 가능한 경우 결과 모델을 백킹합니다.

핵심은 편견없는 성능 추정치를 얻으려면 최종 모델 (fit_model)을 생성하는 데 사용하는 모든 절차가 교차 검증 절차의 각 접힘에서 독립적으로 전체적으로 반복되어야한다는 것입니다.


이것은 좋은 대답입니다. 당신이 말할 때 rather than repeated cross-validation you would go for bootstrapping-정확히 차이점은 무엇입니까? 모두에 데이터를 나누어 여러 번 반복 포함 train하고 test다음에 교육 train과에 평가를 test그들은하지 않습니다?
Josh

4
부트 스트랩 (대체로 샘플링)은 반복 된 교차 검증보다 무작위 화되므로 많은 수의 재 샘플링을 수행하는보다 자연스러운 방법으로 보입니다. 부트 스트랩의 경우 포장 된 앙상블의 사용은 성능 추정치로서 가방 부족 오류와 함께 멋진 기능입니다. 둘 중에서 선택할 수있는 금액은 많지 않습니다.
Dikran Marsupial

Thanks @Dikran-부트 스트랩 핑을 사용한다고 가정하면 반복에 대한 평균과 분산 을 고려하여 어떻게 좋은 모델을 선택 하겠습니까? (즉, 어떤 모델 선택 프로토콜을 따르시겠습니까?). 이 질문정확하게이 질문을 제기 합니다 . 해당 스레드에서 입력을 얻는 것이 매우 중요합니다!
Josh

@DikranMarsupial 1-3 단계에 대한 코드 (예 : Python 또는 R)를 게시 할 수 있습니까? 구체적인 코드를 볼 때 그러한 절차를 이해하는 것이 훨씬 쉽다는 것을 알았습니다.
tobip

1
핵심 메시지 : "중요한 성능 추정값을 얻으려면 최종 모델 (fit_model)을 생성하는 데 사용하는 모든 절차 가 교차 검증 절차의 각 겹마다 독립적으로 반복되어야합니다 ." 이 정확한 메시지는 통계 학습의 요소 (7.10.2 섹션 참조)에도 전달됩니다. web.stanford.edu/~hastie/Papers/ESLII.pdf
NickBraunagel

0

고정 하이퍼 파라미터 ( 및 ) 와 함께 SVM을 사용하는 것은 기계 학습 알고리즘입니다.CγC

이러한 하이퍼 파라미터를 최적화하고 이것으로 SVM을 훈련시키는 절차 는 기계 학습 알고리즘 일뿐입니다 . SVM (지원 벡터)의 내부 매개 변수 만 최적화하는 대신 하이퍼 파라미터도 최적화합니다.

이제 두 가지 문제가 있습니다 [독립적으로 해결할 수 있습니다] :

교차 검증 오용 (최고의 하이퍼 파라미터 값에 대한 성능보고)을 읽고 혼동 하지 않도록하십시오.


질문의 구체적인 문제에 대한 특정 (아마도 최적이 아닌) 솔루션 :

k = 5
loss_CV = zeros(k)
for i in 1:k 
    Xi_train, Xi_test = folds(X,k)[i]
    loss = zeros((3,3))
    for lambda in {0.1,0.2,0.5,1.0}
        for C in {10,100,1000}
            for j in 1:k
                Xj_train, Xj_test = folds(Xi_train,k)[j]
                model = SVM(Xj_train,lambda, C)
                loss[lambda,C] += test_error(model,Xj_test)
    lambda, C = argmax(loss)
    model = SVM(Xi_train,lambda, C)
    loss_CV += test_error(model,Xi_test)

loss = zeros((3,3))
for lambda in {0.1,0.2,0.5,1.0}
    for C in {10,100,1000}
        for j in 1:k
            Xj_train, Xj_test = folds(Xi_train,k)[j]
            model = SVM(Xj_train,lambda, C)
            loss[lambda,C] += test_error(model,Xj_test)
lambda, C = argmax(loss)
model = SVM(Xi_train,lambda, C)

여기에는 model"최상의 모델"과 loss_CV"일반화 오류의 적절한 추정치"가 있습니다 (위쪽으로 치우 치지 만 케이크를 먹을 수는 없습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.