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

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 K
    C

    γ

    K

    K=10

    K1

    K

  2. 이러한 각 ( , ) 쌍에 대해 1000 테스트 오류 의 평균과 분산을 계산합니다 .γ μ M , σ M
    C

    γ

    μM,σM

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

μM

σM

μM

σM

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

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



답변

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)을 생성하는 데 사용하는 모든 절차가 교차 검증 절차의 각 접힘에서 독립적으로 전체적으로 반복되어야한다는 것입니다.


답변

고정 하이퍼 파라미터 ( 및 ) 와 함께 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“일반화 오류의 적절한 추정치”가 있습니다 (위쪽으로 치우 치지 만 케이크를 먹을 수는 없습니다).


답변