어떤 교차 검증 방법이 가장 좋은지 어떻게 알 수 있습니까?


36

내 상황에 가장 적합한 교차 유효성 검사 방법을 찾으려고합니다.

다음 데이터는 문제를 해결하기위한 예제 (R)이지만 실제 X데이터 ( xmat)는 서로 상관 관계가 있으며 y변수 ( ymat)를 사용하여 다른 정도와 상관 관계가 있습니다. R 코드를 제공했지만 R에 대한 질문이 아니라 메서드에 대한 질문입니다. XmatX 변수 V1-V100을 ymat포함하고 단일 y 변수 를 포함합니다.

set.seed(1233)
xmat           <- matrix(sample(-1:1, 20000, replace = TRUE), ncol = 100)
colnames(xmat) <- paste("V", 1:100, sep ="")
rownames(xmat) <- paste("S", 1:200, sep ="")
  # the real y data are correlated with xmat
ymat           <- matrix(rnorm(200, 70,20), ncol = 1)
rownames(ymat) <- paste("S", 1:200, sep="")

y모든 변수를 기반으로 예측하기위한 모델을 만들고 싶습니다 xmat. 따라서 선형 회귀 모델이 y ~ V1 + V2 + V3+ ... + V100됩니다. 리뷰에서 다음 세 가지 교차 검증 방법을 볼 수 있습니다.

  1. 데이터를 약 절반으로 나누고 하나는 훈련에 사용하고 다른 하나는 테스트에 사용합니다 (교차 검증)

    prop       <- 0.5 # proportion of subset data
    set.seed(1234)
      # training data set 
    training.s <- sample (1:nrow(xmat), round(prop*nrow(xmat),0))
    xmat.train <- xmat[training.s,]
    ymat.train <- ymat[training.s,]
    
      # testing data set 
    testing.s <- setdiff(1:nrow(xmat), training)
    xmat.test <- xmat[testing.s,]
    ymat.test <- ymat[testing.s,]
    
  2. K 배 교차 검증 -10 배 교차 검증 사용 :

    mydata <- data.frame(ymat, xmat)
    fit    <- lm(ymat ~ ., data=mydata)
    library(DAAG)
    cv.lm(df=mydata, fit, m=10) # ten-fold cross validation 
    
  3. 한 번에 하나의 값 또는 몇 개의 값 마스킹 :이 방법에서는 데이터 세트 (y)의 값을 NA로 바꾸어 임의로 마스킹하고 예측합니다. 이 과정은 n 번 반복된다.

    n = 500 
    predicted.v <- rep(NA, n)
    real.v      <- rep(NA, n)
    
    for (i in 1:n){
      masked.id <- sample (1:nrow(xmat), 1)
      ymat1     <- ymat 
      real.v[i] <- ymat[masked.id,]
      ymat1[masked.id,] <- NA
      mydata            <- data.frame(ymat1, xmat)
      fit               <- lm(ymat1 ~ ., data=mydata)
      predicted.v[i]    <- fit$fitted.values[masked.id]
    }
    

어떤 상황에 가장 적합한 지 어떻게 알 수 있습니까? 다른 방법이 있습니까? Bootstrap validationvs CV? 작동하는 예는 감사하겠습니다.


데이터의 유효성을 확인하거나 예측 된 추정값 또는 b- 계수 값을 확인하는 데 관심이 있습니까?
Subhash C. Davar 2016 년

나는 b- 계수의 예측 또는 추정값을 검증하는데 관심이있다
rdorlearn

방법 # 1에서 내가 가진 문제는 샘플 크기가 실제로 가지고있는 것보다 훨씬 작다는 것입니다. 따라서 추정 신뢰 구간 / 변동성은 훨씬 클 것입니다. 또한 방법 # 2와 방법 # 3은 성능면에서 비슷하다고 생각합니다. 내가 당신이라면 K = 5,6, ..., 14,15에 대한 K- 폴드 교차 검증으로 시작하고 결과가 상당히 유사한 지 확인하십시오.
키안

또한 공변량의 수를 줄이기 위해 모형 선택을 하시겠습니까? 100은 꽤 많은 것 같습니다.
키안

@ user2432701 아니요 100을 모두 사용하고 싶습니다.
rdorlearn

답변:


34

OP가이 질문에 대해 현상금을 냈기 때문에 약간의주의를 기울여야하므로 OP에 직접 답변하지 않더라도 일반적인 아이디어를 논의 할 수있는 적절한 장소입니다.

먼저 이름 :

a) 교차 검증 은 열차 세트와 다른 테스트 세트를 사용하는 모든 추정 / 측정 기법의 총칭입니다. 동의어 : 샘플 외부 또는 샘플 외부 추정. 반의어 : 표본 내 추정.

표본 내 추정은 훈련 세트에 대한 일부 정보를 사용하여 모델 품질을 추정하는 기술입니다 (실수는 아님). 모델에 높은 편향이있는 경우, 즉 데이터에 대해 강력한 가정을하는 경우에 매우 일반적입니다. 문제의 예에서와 같이 선형 모델 (고 바이어스 모델)에서는 모델 품질의 척도로 R- 제곱, AIC, BIC, 편차를 사용합니다. 이는 모두 샘플 내 추정기입니다. 예를 들어 SVM에서 지원 벡터의 데이터 대 데이터 수의 비율 데이터는 모델의 오류에 대한 샘플 내 추정입니다.

여러 가지 교차 검증 기술이 있습니다.

b) 홀드 아웃 은 위의 방법 # 1입니다. 세트를 훈련과 하나의 테스트로 나눕니다. 훈련 및 테스트 세트의 상대적인 크기에 대한 토론과 실습의 오랜 역사가 있습니다.

c) k -fold – 위의 방법 # 2. 꽤 표준입니다.

d) 위- 방치 – 위의 방법 # 3.

e) 부트 스트랩 : 세트에 N 개의 데이터 가있는 경우 세트 에서 N 개의 샘플 포함 교체를 무작위로 선택 하고이를 훈련으로 사용하십시오. 샘플이 아닌 원래 세트의 데이터가 테스트 세트로 사용됩니다. 테스트 세트에 대한 오류 (샘플 없음)와 트레인 세트에 대한 오류 (샘플)를 모두 사용하는 모델 오류의 최종 추정값을 계산하는 방법에는 여러 가지가 있습니다. 예를 들어, .632 부트 스트랩을 참조하십시오. 또한 .632+ 공식이 있다고 생각합니다. 표본 외 및 표본 내 오류를 모두 사용하여 모델의 실제 오류를 추정하는 공식입니다.

f) 상기 방법의 선택과 직교하는 것은 반복 문제이다. 일회성 휴가를 제외하고 위의 모든 방법을 여러 번 반복 할 수 있습니다. 실제로 REPEATED 홀드 아웃 또는 REPEATED k- 폴드에 대해 이야기 할 수 있습니다 . 공평하게, 거의 항상 부트 스트랩 방법이 반복되는 방식으로 사용됩니다.


다음 질문은 "더 나은" 방법입니다 . 문제는 "더 나은"의 의미입니다.

1) 첫 번째 대답은 (각 미래의 데이터에 대해) 모델 오차를 추정하기 위해 이러한 각 방법이 바이어스 되는지 여부 입니다.

2) 두 번째 대안은 각 방법 이 실제 모델 오차에 얼마나 빨리 또는 얼마나 잘 수렴 되는지 (바이어스되지 않은 경우)입니다. 나는 이것이 여전히 연구 주제라고 생각합니다. 이 두 가지 논문 (유료 벽 뒤에 있음)에 대해 설명하겠습니다. 그러나 초록은 그들이 달성하려는 것에 대한 약간의 이해를 제공합니다. 또한 k -fold를 "교차 유효성 검사"라고 부르는 것이 매우 일반적 입니다.

이 주제들에 대한 다른 많은 논문들이있을 것입니다. 이것들은 몇 가지 예일뿐입니다.

3) "더 나은"의 또 다른 측면은 위의 기술 중 하나를 사용하여 모델 오류를 측정 한 경우 정확한 모델 오류가 얼마나 가까운 지 확실하게 알 수 있습니다.

일반적으로이 경우 많은 오차 측정 을 수행 하고 신뢰 구간 (또는 베이지안 접근 방식을 따르는 경우 신뢰할 수있는 구간)을 계산하려고 합니다. 이 경우 문제는 일련의 오류 측정 값의 분산을 얼마나 신뢰할 수 있는지입니다. 공지 휴가 - 한 - 아웃을 제외하고, 위의 모든 기술은 당신에게 (많은 다른 조치 줄 것이다 케이 A에 대한 조치 케이 -fold, N A에 대한 조치 , n은 버틸 -repeated) 따라서 당신이 분산 (또는 표준 편차를 측정 할 수 있습니다 )를 측정하고 오차 측정에 대한 신뢰 구간을 계산합니다.

여기서 상황이 다소 복잡해집니다. 에서 나는 신문에서 이해하지 무엇 의 분산의 어떠한 편견 추정 K 교차 검증 -fold , 하나는 당신이에서 얻을 분산 (안 페이 월 뒤) 믿을 수 없다 케이 -fold을 - 하나에서 좋은 신뢰 구간을 구성 할 수 있도록 K - 주름. 또한 감독 분류 학습 알고리즘 (페이 월 뒤가 아님) 을 비교하기위한 대략적인 통계 테스트 , 반복 측정을 사용하는 기술 (반복 k-반복 된 홀드 아웃 – 부트 스트랩에 대해 확실하지 않음)는 오차 측정의 실제 분산을 과소 평가합니다 (조회가 매우 쉽습니다) – 측정 값을 매우 큰 수로 반복하면 유한 세트에서 샘플링하기 때문에 종종 같은 값이 계속 반복되므로 평균은 동일하게 유지되지만 분산은 줄어 듭니다. 따라서 반복 측정 기법은 신뢰 구간에서 너무 낙관적입니다.

이 마지막 논문은 5 x 2 CV 라 불리는 5 번의 2 중 반복을 여러 측정 (10)의 균형이 맞지만 반복은 그리 많지 않다고 제안합니다.

편집하다:

물론이 질문들 중 일부에 대해서는 Cross Validated에 큰 답변이 있습니다 (때로는 그들 자신이 동의하지는 않지만). 여기 몇 가지가 있습니다 :

분류 성능을 평가하기위한 교차 검증 또는 부트 스트랩?

예측 오차를 추정하기위한 교차 검증과 부트 스트랩의 차이점

분류 성능을 평가하기위한 교차 검증 또는 부트 스트랩?

검증 및 모델 선택을위한 부트 스트랩 이해

일반적으로 태그 는 당신의 친구입니다.


가장 좋은 해결책은 무엇입니까? 모르겠어요 나는 매우 엄격해야 할 때, 특히 출판물에서 한 기술이 다른 기술보다 낫다는 것을 확신해야 할 때 5x2 CV를 사용하고 있습니다. 분산 또는 표준 편차를 측정 할 계획이 없거나 시간 제약이있는 경우 홀드 아웃을 사용 합니다. 홀드 아웃 에는 하나의 모델 학습 만 있습니다.


교차 검증의 복잡한 분산 속성에 대해서는 분산을 측정 할 때주의해야한다고 생각합니다. IIRC, Bengio et al. 현재 문제에 대한 크기 n 데이터 세트에 대한 분산에 중점을 둡니다 . 내가 가지고 있는 데이터 세트 에 대해 훈련 된 모델의 예측에 대한 임의의 불확실성과는 다릅니다 (그리고 더 큼) . 위에 링크 된 Dietterich 논문의 문제 분류를 참조하십시오.
cbeleites는 Monica를 지원합니다.

7

메소드 정의 는 wikipedia 페이지 를 참조하십시오 (여기서 내가 할 수있는 것보다 훨씬 더 나은 작업을 수행합니다).

해당 페이지를 살펴본 후 다음이 도움이 될 수 있습니다. 모델링 프로세스를 위해 이러한 방법 중 하나를 선택하려는 질문 부분에 중점을 두겠습니다. 이것은 매우 빈번한 선택이므로 추가 지식을 통해 도움을 얻을 수 있으므로 다음 두 가지 상황에 대한 대답입니다.

  1. 모든 상황 : k-fold cross validation적절한 반복 횟수 (예 : 5 또는 10)를 사용하십시오.

    • 데이터를 절반으로 나누고 전반에 대한 훈련과 나머지에 대한 검증은 어쨌든 2 배 교차 검증의 한 단계입니다 (다른 단계는 두 개의 절반을 교환하면서 동일한 연습을 반복 함). 따라서 '데이터를 반으로 나누는'전략을 배제하십시오.

    • 많은 머신 러닝 및 데이터 마이닝 페이퍼는 k- 폴드 교차 검증을 사용하므로 (인용하지 않음)이 단계에서주의를 기울이지 않으면 사용하십시오.

    • 이제, ' out p out '과 ' random split and repeat '(본질적으로 위에서 설명한 프로세스와 같은 부트 스트랩) 과 같은 다른 방법은 좋은 방법으로 남습니다 .

    • 데이터 크기가 N이면 N- 폴드 교차 검증은 본질적으로 하나를 생략하는 것과 동일합니다.

    • 'leave p out'과 'bootstrap'은 k 폴드 크로스 검증과 약간 다르지만, 본질적으로 폴드를 정의하는 방법과 발생하는 반복 횟수 'k'에 차이가 있습니다.

    • Wiki 페이지에서 알 수 있듯이 k-fold 및 ' leave p out '은 모두 ' 예상 성능 / 적합성 ' 에 대한 적절한 추정치입니다 (이러한 추정치의 분산과 관련하여 베팅이 해제되어 있음).

  2. 상황 : 피처 수 (100)와 비교하여 샘플 크기는 200입니다. 동일한 성능을 제공하는 선형 모델이 여러 개있을 가능성이 매우 높습니다. > 10 회 반복으로 k- 폴드 교차 검증을 사용하는 것이 좋습니다 . 3 또는 5의 ak 값을 지정하십시오.

    • k 값의 이유 : 일반적인 선택.

    • 반복 값의 이유 : 단일 k- 폴드 교차 검증 계산의 출력이 우리가 소개하는 분할 분할 가변성 / 랜덤 성을 접할 수 있기 때문에 반복에 대한 높은 값이 중요 할 것입니다.

추가 생각 :

  • 어쩌면 k-fold cross validation 방법의 출력이 올바르게 보이는지 확인하기 위해 동일한 성능 / 적합성 측정을 위해 'k-fold cross validation 과 같은 랜덤 분할 반복 '방법 과 같은 ' leave p out '과 ' bootstrap '을 사용할 것입니다.

  • 100 가지 기능을 모두 사용하고 싶지만, 누군가가 제안한 것처럼 다중 공선 성 / 상관에 주의를 기울이고 기능 수를 줄이십시오.


또한이 답변을 확인하십시오 : stats.stackexchange.com/questions/69291/…
Theja

R rms패키지 validatecalibrate함수에 구현 된대로이 작업을 많이 수행하고 Efron-Gong 낙관론 부트 스트랩으로 직접 이동 합니다.
Frank Harrell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.