데이콘에서 대회를 참여하다 보면 규칙 중에 Data Laekage 부정행위가 있다.
머신러닝을 공부하며 대회에 처음 참가하는 초보자 입장에서는 이게 무엇을 의미하는지 잘 모를 수 있다고 생각한다.
(필자가 그랬기 때문이다..)
따라서 이 Data Leakage라는 부정행위에 대해 알아보고자 한다.
Data Leakage란?
Data Leakage는 train data 외의 정보가 모델을 만드는데 사용될 때 발생한다. 이러한 추가적인 정보를 통해 모델은 다른 방법으로는 알지 못하는 무언가를 배우거나 알 수 있으며, 생성되는 모델의 예측 성능을 무효화할 수 있다. 결론적으로 Data Leakge로 인해 엉뚱한 모델이 만들어지고, 이는 곧 해석이 무의미해짐을 의미한다.
간단하게 말하자면, test 데이터의 개수나 분포 등이 변화할 때마다 train을 진행할 때나 test를 진행할때 영향을 끼치게 되는 요소가 있다면, data leakage로 판단할 수 있다.
Data Leakage의 문제점
1. 데이터 분석 경진대회를 참가하는 경우 문제가 된다. 상위 모델은 기본 문제의 좋은 일반 모델이 아닌 누출 데이터를 사용한다.
2. 여러분들이 여러분들의 데이터를 제공하는 회사일 때 문제가 된다. 익명화 및 난독화를 되돌리는 것은 예상치 못한 개인 정보 침해로 이어질 수 있다.
3. 자신의 예측 모델을 개발할 때 문제가 된다. 실제로 쓸모없고 생산에 사용할 수 없는 지나치게 낙관적인 모델을 만들 수있다. 즉, 과적합이 발생할 수 있다.
위의 3가지 중 3번째 이유가 Data Leakage를 걱정하는 가장 큰 이유일 것이다. 과적합은 머신러닝에서 중요한 문제이기 때문이다.
경진대회에서의 Data Leakage
먼저 데이콘 경진대회의 규칙을 예시로 보자.
(물론 Kaggle 과 같은 경진대회에서도 크게 다를 바 없다.)
- label encoding, one-hot encoding 시 test 데이터 셋 활용
- data scaling 적용 시 test 데이터 셋 활용
- test 데이터 셋의 결측치 처리 시 test 데이터 셋의 통계 값 활용
- 위 예시 외에도 test 데이터 셋이 모델 학습에 활용되는 경우에 Data leakage에 해당됨.
대회 규정 중 "테스트 데이터를 학습에 사용" 한다는 규정에 대해 더 알아보자.
"테스트 데이터를 학습에 사용" 한다는 것은 어떠한 형태의 테스트 데이터 셋을 학습하는 행위를 포함한다.
따라서 Model 학습을 포함한 Encoder 를 테스트 데이터를 활용하여 학습시키는 행위, Scaler를 테스트 데이터를 활용하여 학습시키는 행위 또한 포함된다.
Encoder, Sclaer 뿐만이 아닌 테스트 데이터를 학습 시키는 모든 행위는 Data Leakage 부정행위에 해당한다.
이와 같이 대회에서 제공되는 테스트 데이터를 학습에 사용하는 경우 부정행위에 해당한다는 걸 알 수 있다.
Encoder를 사용하던, Scaler를 사용하던 어떠한 전처리 과정에서도 테스트 데이터를 '학습' 시키면 안된다.
좋다. 그럼 이 규정에 대해서는 이해를 했다. 단순히 학습에 테스트 데이터를 사용 안 하면 되는 거 아닌가?
실제 대회의 사례를 한 번 보자.
데이콘 경진대회 중 팔당댐 홍수 안전운영에 따른 한강 수위 예측 AI 경진대회의 규칙을 예시로 보겠다.
단, 결과를 추론함에 있어 다음과 같은 유의 사항을 인지해야 합니다.
정답 추론에는 해당 기간 이전에 획득할 수 있는 데이터만 활용할 수 있습니다.
예를 들어 2022년 6월 10일 00시 10분의 수위를 예측하기 위해서는 반드시 2022년 6월 10일 00시 10분 이전에 얻을 수 있는 데이터 만을 활용해야 합니다.
다음으로 2022년 6월 10일 00시 20분의 수위를 예측할 때에는 2022년 6월 10일 00시 10분의 데이터를 활용할 수 있습니다.
또한 2022년 6월 10일 00시 20분의 수위를 예측할 때, 해당 기간 이전에 얻을 수 있는 예보 데이터는 활용할 수 있습니다.
이상치 또는 결측치는 오류가 아닙니다. 이상치와 결측치는 참가자 여러분께서 직접 처리하시어 경진대회 문제를 풀어나가셔야 합니다.
특히 Test Data인 2022년의 이상치와 결측치를 처리하실 때 Data Leakage 규칙을 위반하지 않도록 주의하시기 바랍니다.
예를 들어 test 데이터 셋의 결측치가 존재해서 이 결측치들을 처리하는 상황을 생각해보자.
test 데이터 셋의 결측치들을 채워주고 싶은데, 이때 test 데이터셋의 통계 값을 활용하고 싶다.
시계열 데이터 셋이라고 생각을 했을 때, 이 결측치들을 해당 연도, 달의 평균으로 처리하고 싶다.
따라서 test data인 2022-06 ~ 2022-07까지의 X데이터의 결측치 처리하는 과정에서
2022-06의 결측치를 2022-06의 평균으로, 2022-07의 결측치는 2022-07의 평균으로 대체하려고 한다.
하지만 곰곰이 생각해보면 이렇게 되면 test data를 사용해서 결측치를 채워 넣는 것이기 때문에 Data Leakage가 발생할 것 같다는 생각이 든다.
결과적으로 이 방법은 Data Leakage에 해당한다.
예를 들어 6월 10일 17시 00분의 수위를 예측한다고 했을 때, 위의 결측치 처리방법을 활용하면 추론하고자 하는 기간 이후의 데이터를 활용한 것이 되기 때문이다.
- 데이콘의 한 유저분의 글 중 설명이 잘 되어있는 것 같아 내용을 추가한다.
기존 대회에서 data leakage 가장 빈번했던 부분은 정형 데이터 대회에서 스케일러를 사용할 때 train셋에 fit_transform, test셋에 fit_transform을 하는 부분이다. test셋에 fit_transform을 하는 행위가 data leakage인 경우는 다음과 같은 이유이다. minmax encoder를 사용한다고 가정할 경우, train셋에는 age에 대한 분포가 0~100까지 있지만, test셋에는 age에 대한 분포가 50~70까지 있고, 이를 minmax하여 train과 test셋에 fit_transform하면 train셋에서의 100은 1로, test셋의 70은 1로 대응되게 된다. 따라서 만약 다른 test셋이 주어지고, 그 셋에는 age에 대한 분포가 40~80이라면, 80이 1로 대응되어서 완전히 다른 결과가 나오게 된다.
마찬가지로 정형 데이터 train셋에서 train셋의 mean값을 활용해 나눈 변수를 test셋에서 test셋의 mean값을 활용해 나눈 결과물을 사용하거나 학습에 활용한다면, test셋의 분포가 바뀔 때마다 다른 결과물이 나오게 된다. (예를 들어 나이 50이라는 데이터가 test셋 1에서는 평균값 20으로 나누어져 2.5로 계산되고, test셋 2에서는 평균값 25로 나누어져 2로 계산되며, 같은 데이터에 대해 다른 결과를 예측함, data leakage)
경진대회에서 이러한 규정을 부정행위로 정해놓은 이유에 대해 다시 한번 생각해볼 필요가 있다.
결국 우리가 어떠한 모델을 만드는 이유는 실제 상황에서 적용하기 위함이 아닌가?
따라서 우리는 대회 측에서 제공하는 test데이터, 즉 현실 세계에서 마주하는 실제 모델이 예측해야 하는 데이터는 결코 모델의 학습에 사용이 될 수 없음을 인지해야 할 것 같다.