인코딩 및 교차 검증
최근 나는 교차 검증 체계 내에서 인코딩을 적절하게 사용하는 것에 대해 생각하고 있습니다. 일반적으로 권장되는 인코딩 기능 방법은 다음과 같습니다.
- 데이터를 훈련 및 테스트 (홀드 아웃) 세트로 분할
- 기차 세트에 인코더 (
LabelEncoder
또는OneHotEncoder
)를 장착합니다. - 장착 된 인코더를 사용하여 기차와 테스트 세트를 모두 변환합니다.
이 방법은 데이터 유출을 방지하기 위해 주장됩니다. 그러나 이것은 교차 검증 중에 종종 생략되는 것 같습니다. 앞서 언급 한 기차 세트에 대해 교차 검증을 수행한다고 가정 해 보겠습니다. 기차 세트를 인코딩 한 다음 교차 검증을 수행하면 위의 단계를 실제로 모방하지 않습니다. 인코딩은 교차 검증 "내에서"수행되어야하지 않습니까? 예를 들어, 5 겹 교차 검증을 수행한다고 가정하면 인코더를 4 겹으로 맞추고 각 교차 검증 단계에서 5 겹으로 변환해야하지 않습니까? 나는 그것이 일반적으로 대상 인코딩에서 수행되는 것이라고 생각하지만 실제로는 레이블 또는 원-핫 인코딩이 아닙니다.
따라서 내 질문은 다음과 같습니다.
- 과적 합을 정말로 방지하려면 각 교차 검증 단계에서 5 번째 검증 폴드가 아닌 4 배에 인코더를 장착해야하는 필요성에 대해 제가 맞습니까?
- 그렇지 않은 경우 기차 및 테스트 (홀드 아웃) 세트를 처리하는 동안 앞서 언급 한 3 단계를 모두 수행해야하는 이유는 무엇입니까?
답변
맞습니다. 인코딩 단계 자체가 데이터 유출의 원인이 될 수 있으며 일반적으로 설명하는대로 현재 학습 세트 만 사용하여 CV 루프 내에서 수행해야합니다.
그 이유는 실제로 댓글에서 언급 한 것입니다. CV 중에 특정 학습 세트에서 우연히 나타나지 않는 클래스 레이블 또는 기능 카테고리가있는 경우 모델은이 클래스 / 카테고리가 존재합니다.
일반적으로이 문제는 테스트 세트의 성능을 저하시킬 뿐이므로 다른 종류의 데이터 유출만큼 심각하지 않을 수 있습니다. 그럼에도 불구하고 훈련 세트만을 사용하여 인코딩하는 것은 확실히 더 깨끗한 실험 설계입니다.
NLP에서 밀접하게 관련된 문제는 시스템이 OOV (Out-of-vocabulary) 단어를 처리하도록 설계되지 않은 경우입니다. 학습 및 테스트 세트의 모든 단어가 인코딩 된 경우 (동일한 실수) 다음과 같이 잘못 보입니다. 모든 텍스트는 완전히 인코딩 될 수 있으므로 나중에 심각한 결과를 초래할 수 있습니다.
즉, 일반적으로 희귀 한 기능이나 레이블 값을 버리는 것이 좋습니다. 이렇게하면 적절한 방법이나 조잡한 방법을 사용하여 결과가 동일해야합니다.