Data Leakage 너무 어려워요.. 차근 차근 정리해보려고 합니다.

2022.01.12 00:44 4,312 조회

📌Introduction

  • Data Leakage에 관한 문의 글이나 내용은 정형데이터가 올라오는 대회마다 올라오는 것 같습니다..
  • Data Leakage에 관해 정리된 글이 많이 있지 않다보니 개념을 이해하기 어려웠습니다.
  • 제가 해당 문제로 코드 검증 부분에서 수상이 취소된 만큼 앞으로 그런 문제가 없도록 하고 싶어 Data Leakage와 관련된 내용을 정리해봤습니다. 지속적으로 업데이트 해나가며 경진대회에서 주의해야할 점을 위주로 정리할 것입니다.
  • 제 생각과 다른 내용이 있다면 언제든지 댓글 달아주세요. 아직 많이 부족한 학생입니다. 여러분의 피드백과 조언을 얻고 싶습니다!
  • 본 포스팅은 JayHong님의 'Data Leakage에 대한 개인적인 정리입니다' 글을 바탕으로 제 생각을 넣어 정리했습니다. 감사합니다.
  • 본 포스팅은 데이콘 서포터즈 "데이크루" 1기 활동의 일환입니다.  


🔎Data Leakage??

한글로 해석하면 “정보의 누설”로 우리가 모른다고 가정하는 정보가 유출된 것을 의미합니다. 경진대회에서 학습에 사용해야하는 데이터인 train data가 아닌 test data에 대한 정보가 활용되면 이는 정보 누설로 볼 수 있는 것입니다. 시험으로 생각하면 편하게 이해하실 수 있을 것입니다. 수능을 준비하는데 이미 수능 문제에 대해 다 알고 있다면 안 될 것입니다. 외우기만 하면 만점이 나오겠지요.. 또한, 수능 시험에서 몇 번이 가장 많이 나온다, 1번이 몇 개, 2번이 몇 개 등과 같은 통계 정보도 누구도 미리 알고 있으면 안 될 것입니다. 이 역시 한 문제, 두 문제 모를 때 찍는 것에 도움을 줄 수 있으니까요..


🏆경진대회에서 주로 문제가 되는 Data Leakage??

Test Data의 노출

Test Data를 알 수가 없어야 하는데 Test Data의 특성에 해당 값이 있다, 없다를 판별하면 안 되는 것입니다. 또한, test Data의 통계 값을 사용하면 안 됩니다. 특성들의 누적 값, 평균, 최댓값 등이 해당됩니다.  

제가 대회에서 수상 실패한 경우를 예로 들어보겠습니다. Train과 Test 셋에 있는 같은 특성의 고유 값을 비교했습니다. 아파트 설계 시 주차 수요가 얼마나 될지를 예측하는 대회였는데 지역이라는 특성이 있었습니다. 이 값을 이용해 train에는 있고 test에는 없는 값을 찾아 제거했습니다. 즉, train과 test 사이의 고유값 차집합을 구해 제거한 것입니다. Train을 Test의 환경과 비슷하게 맞춰주려고 한 것이죠.. 하지만 test는 우리가 알 수 없는 정보입니다. 즉, test의 특성에 어떤 종류의 값이 들어있는 지 모르는 상태인 것입니다.

한참 진행 중인 대회인 '잡케어 추천 알고리즘 경진대회'에 train set에 있는 값인지 아닌지를 판별해 파생 데이터로 만들어도 data leakage가 아닌지에 관한 질문을 본 것 같습니다. 해당 경우는 test와 비교를 진행한 것이 아닌 train의 고유값 만을 가지고 판별할 수 있는 것이므로 문제가 될 것 같지 않습니다. 새로운 데이터가 들어오더라도 같은 특성을 기준으로 train에 존재하는 값이라면 존재한다로, 아니면 아니다로 판별만 하면 되니까요.

이와 더불어 label encoding, one-hot encoding 시에 test 데이터를 활용하는 것도 비슷한 문제입니다. Test에 어떤 값이 들어있는 지 모르니까 말이죠.

 

Test Data 간의 통계📊

Test Data를 활용해 Train Data를 정제한 것도 아니고 이 부분이 왜 문제가 될지 의문을 가지실 수도 있습니다.

Train 데이터를 이용해 만든 결과를 새로운 데이터에 활용할 수 있어야합니다. 경진대회와 달리 새롭게 예측할 때에는 test 데이터가 없습니다. Test 데이터들의 통계치를 이용한다는 것은 실제 모델 예측 시, 예측 시점에 얻을 수 없는 데이터 사용입니다.

즉, Test Data는 ‘아예 볼 수 없다.’라고 생각하고 모델링을 진행해야 합니다.

 

Test Data를 Train Data와 합쳐 Scaler사용 또는 각각 Scaler 사용

위에서 언급한 부분과 비슷한 거 같긴 한데 데이콘 basic 쪽에서는 문제가 있었던 부분인 것 같아 따로 분리했습니다.

각종 Scaler를 사용해 표준화를 진행할 때도 test는 모르는 값이니 train의 분포만을 활용해야 합니다. Train과 Test Data를 concat으로 합쳐 scaler를 사용하는 것 역시 train의 분포만을 활용하는 것이 아닙니다. 또한,

scaler = StandardScaler()

train_sc = scaler.fit_transform(train_data)

test_sc = scaler.fit_transform(test_data)

이런 식으로 train과 test 표준화를 분리해서 진행하면 안 되는 것입니다. fit은 train에 한 번만 진행해 분포를 학습하고 transform은 train으로만 학습한 scaler를 통해 train과 test 모두 적용해야 하는 것입니다.

 

🔜시계열, 순서가 있는 데이터에서의 문제

시계열 데이터를 많이 알지도, 많이 모델링해보지도 않았지만 Data Leakage에 관한 총 정리 글을 만들고자 작성 중이니 추가하겠습니다. 제가 잘못 알고 있는 개념이 있거나 추가되었으면 하는 점도 알려주세요.

이 역시 Test Data 개념과 비슷합니다. 알 수 없는 정보가 예측에 반영되면 안 되는 것입니다. 예시로 1시간 단위로 시세가 업데이트 되는 농산물 가격을 예측하고자 합니다. 1월 11일 오전 11시 인 지금, 오후 12시의 농산물가격을 예측하고자 일 평균, 월 평균 농산물 가격이라는 파생 데이터를 만들어내면 될까요?? 안됩니다. 내가 오후 12시의 가격을 몰라서 예측하고자 하는데 어떻게 해당 일의 평균 값을 만들어낼 수 있을까요?? 다만, 1월 10일인 전날 가격으로 전일 평균 값을 만드는 것은 괜찮을 것 같습니다.

또한, 이런 시계열 데이터로 예측을 하는 대회들은 공공 데이터를 가져올 때도 조심해야합니다. 같은 원리로 내가 21년 1월의 농산물 가격을 예측하고자 합니다. 그런데 공공 데이터로 22년도 1월에 올라온 데이터를 사용할 수 있을까요?? 안 됩니다.

21년도 1월을 예측하고자 한다면 그 전에 올라와 있는 공공데이터만을 사용할 수 있는 것입니다.

 

❓이것은 Data Leakage 일까요❗

데이터에 2022-01-11 11:40:00라는 날짜 데이터가 있어 이 정보를 버리고 싶지 않아서 분리를 시켰습니다. Year 특성으로 2022, Month 특성으로 01, Day 특성으로 11 등과 같이요.

또는 제가 수요예측을 하고자 합니다. 이 때 예측하고자 하는 target 정보를 그대로 활용하는 것이 아닌 다른 특성과 연산을 수행해 새롭게 예측하고자 하는 목표를 만들었습니다. 그리고 target 정보는 삭제하는 것 입니다. 즉, 예측하고자 하는 목표를 다른 값으로 바꾸는 것입니다. 

위에 적은 두 가지 모두 Data Leakage로 분류될 것 같지는 않습니다. 첫번째의 경우 원래 있는 데이터를 나눠 새로운 특성으로 만들었을 뿐입니다. 데이터의 분포나 통계치가 활용되지는 않았습니다. 그렇다면 두 번째 경우는 어떨까요? 이 또한 데이터의 분포나 통계치를 활용한 것이 아닙니다. 예측하고자 하는 정보를 비틀었을 뿐입니다. 


결론적으로 Test Data는 아예 모르는 데이터입니다. 새로운 값이 들어오더라도 같은 방식을 적용해 값을 예측할 수 있어야합니다. 또, 시계열 문제에서는 공공데이터 조차 조심해서 사용해야합니다.


다 쓰고 읽어보니 너무 막 적은 것 같네요. 차근차근 내용 추가하면서 다듬어나가겠습니다.

읽어주셔서 감사합니다.🙇‍♂️

로그인이 필요합니다
0 / 1000
이대권
2022.01.12 07:56

감사합니다. 
데이터 리키지 중요성을 다시 생각하게 되었습니다.

장어
2022.01.12 19:17

좋게 봐주셔서 감사합니다! 

동화책
2022.01.12 11:23

Data Leakage에 대해 새롭게 알게 되었네요 공유 감사합니다 🙂

장어
2022.01.12 19:17

감사합니다😄

existcastle
2022.01.12 13:20

정보 감사합니다 :D

장어
2022.01.12 19:17

정보가 되었다니 다행이네요! 

백남진
2022.01.13 08:26

정보 유출에 대해 정리할 수 있었습니다 감사합니다!

kkubuck
2022.08.03 15:26

좋은 정보 감사합니다 :D

이전 글
선형모델 1
대회 -
좋아요 6
조회 1,033
댓글 1
2년 전
현재 글
Data Leakage 너무 어려워요.. 차근 차근 정리해보려고 합니다.
대회 -
좋아요 30
조회 4,312
댓글 8
3년 전
다음 글
팀 병합
대회 -
좋아요 7
조회 1,063
댓글 4
2년 전