Adversarial validation
Adversarial validation이 왜 필요한가?
모델을 구축할 때, 가장 일반적인 절차는 train/test를 분리하는 것입니다. train 데이터를 이용해서 모델을 학습하고, 최종적으로 unseened data인 test 데이터를 이용해서 일반화 성능을 평가합니다. 이 절차 안에서 부차적으로 hold-out 혹은 cross validation 등의 테크닉이 추가적으로 이용될 수 있습니다. train/test를 분리할 때, 가정은 “train/test 데이터의 분포가 같다”라는 믿음에서 출발합니다. 실제로 raw data를 기준으로 random split을 할 경우에 대체로 같은 분포를 띄는 경우가 대부분입니다. 분포가 같은지를 확인하기 위해서는 k-s test나 j-s distance, kl-divergence, PCA 등을 활용해서 확인해볼 수 있습니다.
그렇다면 train/test 데이터의 분포가 다르면 어떻할까요?
예를 들어, kaggle competition에 참가했다고 생각해보겠습니다. 종종 train/test의 분포가 다른 경우가 존재합니다(실제로는 일반적인 현상일 수 있다). 이 경우 모델을 구축한 후 결과를 제출하면 public score에서는 점수가 높았지만 private score에서는 점수가 매우 낮게 나올 것입니다. 보통 시계열 예측 혹은 class imbalance가 있는 분류 문제를 풀 경우 일반적인 현상일 것입니다. 생각해보면 train/test의 분포가 다른 문제는 기존에 train 데이터를 이용해서 hold out, cross validation 등의 테크닉을 통해 보정을 하더라도 피해갈 수 없는 부분입니다. 이러한 문제 인식에서 생겨난 것이 adversarial validation 입니다.
Adversarial validation이 무엇인가?

- train/test set를 결합해서 all_data set 구축
- train/test set을 구분하는 새로운 target variable 생성
- 새로운 target variable을 예측하는 adversarial classifier 학습
classifier의 성능이 \(AUC\approx 0.5(=threshold)\)일 경우
- 기존 feature를 학습에 이용
classifier의 성능이 \(AUC > 0.5\) 일 경우
- feature importance를 보고, feature importance가 높은 변수 제거
classifier의 성능이 \(AUC\approx 0.5\) 에 가까워질 때까지 반복
adversarial validation의 아이디어는 비교적 간단합니다. train/test set의 분포가 서로 같을 경우 구분하기 어렵기 때문에 adversarial classifier의 성능은 매우 안좋을 것이고, train/test set의 분포가 다른 경우 구분이 쉽기 때문에 adversarial classifier의 성능은 좋을 것입니다.
성능이 좋을 경우(즉, train/test의 분포가 다를 경우), 모형의 예측에 크게 영향을 미치는 변수(train/test의 분포를 다르게 하는 원인이 되는 변수)를 제거하면, train/test 분포의 동일성이 확보될 것입니다.
해당 테크닉을 통해서 fraud detection 관련 kaggle 대회에서 우승한 경우가 있습니다.
kaggle 링크 : https://www.kaggle.com/c/ieee-fraud-detection/discussion/111284
ADP 시험에서는 모델의 운영 방안, 모델의 일반화 성능 측정, 모델의 향후 개선 방안 등에 대해 작성할 때, 활용해볼 수 있을 것 같습니다.
참고 자료
paper : https://arxiv.org/abs/2004.03045
blog : https://www.kdnuggets.com/2020/02/adversarial-validation-overview.html
Citation
@online{don2024,
author = {Don, Don and Don, Don},
title = {Adversarial Validation},
date = {2024-03-09},
url = {https://dondonkim.netlify.app/posts/2023-04-10-adversal-validation/adversarial.html},
langid = {en}
}