기능 선택 및 교차 검증


76

나는 최근에이 사이트 (@Aniko, @Dikran Marsupial, @Erik)와 교차 검증에서 발생하는 과잉 적합 문제에 대해 많은 것을 읽었습니다. 제안은이다 모든 감독 기능 선택 (클래스 라벨 상관을 이용)을 초래할 수 overfitting 교차 검증 (또는 부트 스트랩으로 추정 방식의 다른 모델)을 사용하여 모델의 성능 평가의 외부에서 수행.

이것은 직관적이지 않은 것 같습니다. 특징 세트를 선택한 다음 교차 검증을 사용하여 선택한 기능 사용하여 모델을 평가 하면 해당 기능에 대해 일반화 된 모델 성능에 대한 편견이없는 추정값을 얻습니다 (연구중인 샘플이 대표적이라고 가정합니다) 인구의)?

이 절차를 통해 최적의 기능 세트를 청구 할 수 없지만 보이지 않는 데이터에 대해 선택된 기능 세트의 성능을 유효한 것으로보고 할 수 있습니까?

전체 데이터 세트를 기반으로 기능을 선택하면 테스트와 기차 세트 간의 일부 데이터 유출이 다시 발생할 수 있음을 인정합니다. 그러나 초기 선택 후 기능 세트가 정적이고 다른 조정이 수행되지 않은 경우 교차 검증 된 성능 메트릭을보고하는 것이 확실합니까?

제 경우에는 56 가지 기능과 259 가지가 있으므로 #cases> #features입니다. 기능은 센서 데이터에서 파생됩니다.

내 질문이 파생 된 것처럼 보이지만 이것은 명확히해야 할 중요한 포인트 인 것 같습니다.

편집 : 위에서 자세히 설명한 데이터 세트 (아래 답변 덕분에)에 대한 교차 유효성 검사 내에서 기능 선택을 구현할 때이 데이터 세트에서 교차 유효성을 검사하기 전에 기능을 선택하면 상당한 의미가 있음을 확인할 수 있습니다편견. 이러한 편향 / 과적 합은 2- 클래스 제형과 비교하여 3- 클래스 제형에 대해 그렇게 할 때 가장 크게 나타났다. 피처 선택에 단계적 회귀를 사용했다는 사실이이 과적 합을 증가 시켰다고 생각합니다. 비교 목적으로, 서로 다르지만 관련된 데이터 세트에서, 교차 검증 전에 수행 된 순방향 순방향 피쳐 선택 루틴을 이전에 CV 내에서 피쳐 선택으로 얻은 결과와 비교했습니다. 두 방법 사이의 결과는 크게 다르지 않았습니다. 이는 단계적 회귀가 순차 FS보다 과적 합하기 쉽다는 것을 의미하거나이 데이터 세트의 문제 일 수 있습니다.


7
나는 그것이 Hastie, et al. (quite)라고 생각하지 않습니다. 옹호하고 있습니다. 일반적인 선택은 기능 선택에서 응답사용 하는 경우 CV 절차의 일부로 포함하는 것이 좋습니다. 예를 들어 표본 분산을보고 작은 변동이있는 예측 변수를 제외하여 예측 변수 선별을 수행하는 경우 원샷 절차로 문제가 없습니다.
추기경

3
그러나 +1이지만이 경우에도 교차 유효성 검사는 기능 선택 프로세스의 편차를 나타내지 않으므로 기능 선택이 불안정한 경우 문제가 될 수 있습니다. 스크리닝을 먼저 수행하면 각 접기의 성능 변동이 실제 변동성을 나타내지 않습니다. 각 접기에서 선별 검사를 수행하면 각 접기의 성능 변동성이 적절하게 증가합니다. 계산 비용을 감당할 수 있다면 여전히 각 폴드마다 스크리닝을 수행합니다.
Dikran Marsupial

1
"교차 유효성 검사를 사용하여 모델 성능을 평가하기 전에 수행 한 모든 기능을 선택하면 과적 합이 발생할 수 있습니다." Hastie와 다른 사람들이 제안한 내용을 잘못 인용하거나 잘못 표현한 것입니다. "prior"라는 단어를 "without"으로 바꾸면 더 의미가 있습니다. 또한 문장 유효성 검사는 선택된 변수의 적합성을 합법적으로 테스트 할 수있는 유일한 방법이라고 제안하는 것 같습니다. .
마이클 Chernick

@MichaelChernick-동의했습니다. 내 의미를 더 잘 반영하기 위해 위에서 편집했습니다.
BGreene

1
@Bgreene :에서 읽을 수있는이 문제에 대한 최근의 논의가 goo.gl/C8BUa은 .
Alekk

답변:


68

모든 데이터에서 기능 선택을 수행 한 다음 교차 유효성 검사를 수행하는 경우 교차 유효성 검사 절차의 각 겹에있는 테스트 데이터도 기능을 선택하는 데 사용되었으며 이것이 성능 분석을 편향시키는 것입니다.

이 예를 고려하십시오. 우리는 동전을 10 번 뒤집고 머리 나 꼬리로 내려 오는지를 기록함으로써 목표 데이터를 생성합니다. 다음으로 우리는 각 기능에 대해 동전을 10 번 뒤집어서 20 가지 기능을 생성하고 우리가 얻는 것을 적습니다. 그런 다음 대상 데이터와 최대한 일치하는 기능을 최대한 선택하고이를 예측으로 사용하여 기능을 선택합니다. 교차 검증하면 예상 오차율이 0.5보다 약간 낮아집니다. 교차 검증 절차의 모든 부분에서 트레이닝 세트와 테스트 세트에 대한 상관 관계를 기반으로 기능을 선택했기 때문입니다. 그러나 목표 데이터가 단순히 임의이기 때문에 실제 오류율은 0.5가됩니다. 교차 검증의 각 겹에서 독립적으로 기능 선택을 수행하는 경우 예상되는 오류율 값은 0입니다.

핵심 검증은 교차 검증이 모델 작성 프로세스 의 일반화 성능을 추정하는 방법 이므로 각 프로세스마다 전체 프로세스를 반복해야한다는 것입니다. 그렇지 않으면 편향된 추정치 또는 추정치 분산의 과소 평가 (또는 둘 다)로 끝납니다.

HTH

다음은 56 가지 기능과 259 가지 경우로이 설정에 대한 몬테카를로 시뮬레이션을 수행하는 MATLAB 코드입니다.

바이어스 추정기 : 이율 = 0.429210 (0.397683-0.451737)

편견 추정치 : erate = 0.499689 (0.397683-0.590734)

편향 추정기는 교차 검증 전에 특징 선택이 수행되는 것이고, 편향 추정기는 교차 검증의 각 접힘에서 독립적으로 특징 선택이 수행되는 것이다. 이것은 학습 과제의 성격에 따라이 경우 편향이 상당히 심각 할 수 있음을 시사합니다.

NF    = 56;
NC    = 259;
NFOLD = 10;
NMC   = 1e+4;

% perform Monte-Carlo simulation of biased estimator

erate = zeros(NMC,1);

for i=1:NMC

   y = randn(NC,1)  >= 0;
   x = randn(NC,NF) >= 0;

   % perform feature selection

   err       = mean(repmat(y,1,NF) ~= x);
   [err,idx] = min(err);

   % perform cross-validation

   partition = mod(1:NC, NFOLD)+1;
   y_xval    = zeros(size(y));

   for j=1:NFOLD

      y_xval(partition==j) = x(partition==j,idx(1));

   end

   erate(i) = mean(y_xval ~= y);

   plot(erate);
   drawnow;

end

erate = sort(erate);

fprintf(1, '  Biased estimator: erate = %f (%f - %f)\n', mean(erate), erate(ceil(0.025*end)), erate(floor(0.975*end)));

% perform Monte-Carlo simulation of unbiased estimator

erate = zeros(NMC,1);

for i=1:NMC

   y = randn(NC,1)  >= 0;
   x = randn(NC,NF) >= 0;

   % perform cross-validation

   partition = mod(1:NC, NFOLD)+1;
   y_xval    = zeros(size(y));

   for j=1:NFOLD

      % perform feature selection

      err       = mean(repmat(y(partition~=j),1,NF) ~= x(partition~=j,:));
      [err,idx] = min(err);

      y_xval(partition==j) = x(partition==j,idx(1));

   end

   erate(i) = mean(y_xval ~= y);

   plot(erate);
   drawnow;

end

erate = sort(erate);

fprintf(1, 'Unbiased estimator: erate = %f (%f - %f)\n', mean(erate), erate(ceil(0.025*end)), erate(floor(0.975*end)));

3
감사합니다-이것은 매우 도움이됩니다. 제안 된 접근 방식을 취하면 최종 모델을 어떻게 평가합니까? 여러 기능 세트가 있으므로 최종 기능 세트를 어떻게 선택합니까? 역사적으로 나는 선택된 모델 매개 변수와 기능을 가진 단일 교차 검증을 기반으로 결과를보고했습니다.
BGreene

15
모델 자체보다는 모델 피팅 절차의 성능을 평가하는 것으로 교차 검증을 보는 것이 가장 좋습니다. 가장 좋은 방법은 일반적으로 위와 같이 교차 유효성 검사를 수행 한 다음 교차 유효성 검사 절차의 각 접힘에서 사용 된 것과 동일한 절차를 사용하여 전체 데이터 집합을 사용하여 최종 모델을 작성하는 것입니다.
Dikran Marsupial

2
이 경우 교차 검증 (잠재적으로 많은 다른 기능 세트)을 기반으로 분류 결과를보고하지만 해당 기능 세트 중 하나만 포함하도록 모델을보고합니다. 즉, 교차 검증 된 분류 결과가 반드시 기능 세트와 일치하지 않습니까?
BGreene

10
본질적으로 그렇습니다. 교차 유효성 검사는 모델 자체가 아니라 모델 구축 프로세스의 예상 성능 만 추정합니다. 기능 세트가 교차 검증의 한 부분에서 다른 부분으로 크게 다를 경우, 기능 선택이 불안정하고 의미가 없을 수 있음을 나타냅니다. 특히 피처 선택이 불안정한 경우 피처 선택 대신 정규화 (예 : 릿지 회귀)를 사용하는 것이 가장 좋습니다.
Dikran Marsupial

3
이것은 중요한 게시물입니다. 얼마나 많은 사람들이 이것을 적용하지 않는지 놀랍습니다.
Chris A.

12

문제점에 대해 약간 다르고보다 일반적인 설명을 추가하려면 다음을 수행하십시오.

당신은 어떤 종류의 할 경우 데이터 중심의 전처리 , 예를

  1. 교차 검증 / 부트 아웃 부트 스트랩에 의해 유도되는 매개 변수 최적화
  2. 모델 입력을 생성하기 위해 PCA 또는 PLS와 같은 기술로 차원 축소 (예 : PLS-LDA, PCA-LDA)
  3. ...

교차 검증 / 부트 아웃 스트랩 (/ 홀드 아웃) 검증을 사용하여 최종 모델의 성능 을 추정 하려면 데이터 중심 전처리가 대리 훈련 데이터에 대해 수행되어야합니다 (예 : 각 대리 모델마다).

데이터 중심 전처리의 유형이 1 인 경우 이는 "이중"또는 "중첩"교차 검증으로 이어집니다. 매개 변수 추정은 "외부"교차 검증의 학습 세트 만 사용하여 교차 검증에서 수행됩니다. ElemStatLearn에는 그림이 있습니다 ( https://web.stanford.edu/~hastie/Papers/ESLII.pdf 222 페이지 중 5 페이지).

사전 처리는 실제로 모델 작성의 일부라고 말할 수 있습니다. 수행되는 전처리 만

  • 각 경우에 독립적으로 또는
  • 실제 데이터 세트와 독립적으로

계산 루프를 통해 계산을 저장합니다.

다른 방법으로 : 모델이 특정 데이터 세트 외부의 지식에 의해 완전히 구축 된 경우 (예를 들어 측정 채널 63-79가 문제를 해결하는 데 도움이 될 수 없다는 전문가의 지식에 의해 미리 결정하면 물론 이러한 채널을 제외 할 수 있습니다. PLS 회귀 분석을 수행하고 경험에 따라 3 개의 잠재 변수가 합리적인 선택이라는 결정을 내리면 (그러나 2 또는 5lv가 더 나은 결과를 제공하는지 여부를 결정 하지 않음) 동일한 방법으로 모델을 빌드하고 교차 검증합니다. 일반적인 부트 스트랩 / 크로스 검증으로 진행하십시오.


불행히도 ElemStatLearn 도서의 인쇄 5에 대한 링크가 작동하지 않습니다. 당신이 언급 한 그림이 여전히 같은 페이지에 있는지 궁금합니다. 캡션도 언급하십시오.
rraadd88

따라서 두 세트의 데이터가 있으면 그중 하나에서 기능 선택 / 엔지니어링을 수행하고 다른 하나에서 CV를 수행해도 문제가 없습니까?
Milos

1
@Milos : 아니요, 이러한 기능이 교차 검증 모델의 고정 매개 변수가되는 한 괜찮습니다. 이는 적절한 가설 생성 (= 데이터 세트 A의 기능 개발) / 가설 테스트 (= 데이터 세트 B를 사용하여 현재 수정 된 기능의 성능 측정) 설정입니다.
cbeleites

@cbeleites 예, 그것이 제가 의도 한 것입니다. A의 피처를 결정한 다음 해당 피처를 수정하고 B의 모델에 대해 교차 검증을 수행하십시오. 감사합니다. :)
Milos

@Milos : 그러나 A에서 모델을 완전히 훈련시킨 다음 테스트 에만 B를 사용하면 달성 된 성능에 대한 논증이 훨씬 낫다는 점을 명심하십시오 .
cbeleites

5

조금 직관적으로 만들어 봅시다. 이 예제를 고려하십시오. 2 진 종속 및 2 진 2 진 예측자가 있습니다. 예측 변수가 하나만있는 모형이 필요합니다. 두 예측 변수 모두 95 %가 부양 가족과 같고 5 %가 부양 가족과 동의하지 않을 가능성이 있습니다.

이제 우연히 데이터에 대한 예측 변수는 시간의 97 %에서 전체 데이터에 의존하고 다른 예측 변수는 시간의 93 %에서만 같습니다. 97 %로 예측 변수를 선택하고 모형을 작성합니다. 교차 검증의 각 겹에서 거의 항상 옳기 때문에 모델 의존 = 예측 변수가 있습니다. 따라서 97 %의 교차 예측 성능을 얻습니다.

자, 당신은 말할 수 있습니다. 그것은 단지 운이 좋지 않습니다. 그러나 예측 변수가 위와 같이 구성된 경우 전체 데이터 세트에서 정확도가 95 %를 초과하는 확률 중 적어도 하나가 75 % 일 가능성이 있으며 이것이 선택하는 것입니다. 따라서 성능을 과대 평가할 확률이 75 %입니다.

실제로, 효과를 추정하는 것이 결코 쉬운 것은 아닙니다. 전체 데이터 세트에서 수행 한 것처럼 기능 선택시 각 폴드에서 동일한 기능을 선택하면 편향이 없습니다. 더 많은 샘플이 있지만 기능이 있으면 효과도 작아집니다. 데이터에 두 가지 방법을 모두 사용하고 결과가 어떻게 다른지 확인하는 것이 도움이 될 수 있습니다.

또한 데이터 양 (20 %)을 따로 설정하고 80 %를 교차 검증하여 성능 추정치를 얻는 올바른 방법과 올바른 방법을 모두 사용하여 모델을 20으로 전송할 때 어떤 성능 예측이 더 정확한지 확인할 수 있습니다 따로 따로 자료 세트의 %. 이 기능을 사용하려면 CV 전에 기능 선택을 수행해야 데이터의 80 % 만 수행해야합니다. 그렇지 않으면 모델을 샘플 외부의 데이터로 전송하는 것을 시뮬레이션하지 않습니다.


직관적 인 예제를 통해 기능 선택을 수행하는 올바른 방법에 대해 더 자세히 설명해 주시겠습니까? 감사합니다.
uared1776
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.