주차수요 예측 AI 경진대회

Data Leakage에 대한 개인적인 정리입니다

2021.07.28 23:43 16,329 Views

0. Before Dealing with "Data Leakage"


  • 이틀 뒤면면 Dacon의 "주차수요 예측 AI 경진대회"가 종료되는 이 시점에서 "Data Leakage"와 관련된 문의가 많이 올라오고 있습니다.
  • Data Leakage의 경우에는 저도 가장 첫 ML 공모전에 참여했을 때, 이 문제로 인해서 수상이 취소되었던 만큼, ML을 시작하는 많은 분들에게 있어 오해가 될 수 있는 부분이 있습니다.
  • 그래서 제가 탈락 이후 공부했던 부분을 정리하며, 다른 분들이 실수하지 않으시도록 글을 써봅니다... ㅠㅠ


  • 저와 이견이 있으신 분들, 혹은 다른 질문이 있으신 분들의 피드백도 환영입니다 !




1. ❔Data Leakage란 무엇인가❔

Data Leakage (= "정보의 누설")

우리가 모른고 가정된 "정보가 누설"된 경우를 의미합니다.


우리가 공모전에 참가할 때 받는 데이터는 train data 이며,

우리가 공모전에 제출하는데 사용하는 데이터는 test data입니다.


여기서 한 가지 가정이 이루어집니다.

우리가 알고 있는 정보는 "train data"이며,

우리가 모르는 정보는 "test data"입니다.

그렇기 때문에, 우리가 모르는 정보인 "test data"의 통계치가 test data들 사이에서 반영될 수 없습니다.


조금 더 직관적으로 설명해보겠습니다.

우리는 "과거"를 지나 "현재"에 살고 있습니다. 이게 Train data입니다.

우리는 "미래"를 알고 싶습니다. 이게 Test data입니다.

그래서 우리는 "과거와 현재"의 데이터를 지지고 볶아서, "미래"를 예측하는게 목표입니다.


그런데, 미래는 개별적으로 다가옵니다.

이틀 뒤의 날씨를 내일 알 수 없습니다.

한달 뒤의 날씨를 내일 알 수 없습니다.

물론 예측이야 가능하겠지만, 그게 정확한 "관측치"는 아닙니다.

따라서, "미래"를 의미하는 Test data들의 통계값을 파생 변수로 생성할 수 없습니다.


이 개념을 기억하면서 더 글을 내려가봅시다.


(물론 원인 제공도 제가 한 것 같은 죄책감에 글을 쓰고 있지만요... 여기 링크 3-2번 코드)




2. ❕Data가 Leakage 되는 것들❕


2-1. Test Data의 노출


알 수 없는, 혹은 알아서는 안될 정보가 누출되는 경우가 있습니다.

= "알 수 없는 정보가 예측에 반영되었을 때 나타나는 문제" 입니다.

이 사례는 "시간"의 개념이나 "순서"의 개념이 도입되어 있는 부분에서 자주 등장합니다.


제가 대회에서 탈락한 사례로 말씀 드리겠습니다.

과거의 전 1시간 단위로 기록된 train, test data에 "일 평균 온도"라는 Feature를 만들었습니다.

지금까지의 내용만 가지고 본다면, 가능할까요?

네. 불가능합니다.

우선, Test data는 "시간"의 개념을 가지고 "연대성"을 가지고 등장합니다.

기초 전제부터 잘못된 것이죠.

당장 "한시간 뒤의 온도"도 모르는데, "일 평균 온도"를 어떻게 만들겠습니까...


"알 수 없는 정보가 예측에 반영되었을 때 나타나는 문제"가 무엇인지 조금 이해가 되셨나요?


2-2. Train-Test 를 통합해서 발생하는 문제


마찬가지로 Test Data는 우리가 모르는 데이터입니다.

"미래의 온도"를 현재 시점에서 함께 통계량을 반영하는 것에 해당합니다.

즉, 현재 시점에서 "2021년의 평균 온도"라는 변수를 만드는 사례가 있을 수 있겠습니다.

2021년 7월 28일까지의 온도는 알고 있으나, 2021년 7월 29일부터의 날씨는 모르기 때문입니다.


2-3. Target 값의 누수

쉽게 말해서 결과 값이 하나의 파생 변수로 함께 학습 되는 것을 의미합니다.

예를 들자면, "암 환자 여부"라는 것을 예측할 때, 파생 변수로 "악성 암 세포 여부"라는 파생변수가 들어가면 안되겠죠? (의학적 지식이 부족한 사람이기 때문에, 문제가 있다면 말씀해주세요 ㅠㅠ)




3. 또 자주 헷갈리는 부분은 무엇인가?

3.1 "Target Encoding(= bin encoding = effect encoding = mean encoding)" 입니다...

2016년? 그 즈음부터 kaggle에서 자주 사용된 Encoding 기법이 있습니다.

바로 Target Encoding (Feature Engineering 5장 참조)입니다.

Target encoding은 쉽게 말해서, Encoding을 할 때 "Train Data의 Target 값의 통계치를 활용하자" 입니다.


아래의 예시를 들며 말씀드리겠습니다.

남성의 생존률은 몇 %인가요? → 5명의 남성 중, 3명이 생존했습니다. 즉, 생존률은 60%입니다.

여성의 생존률은 몇 %인가요? → 5명의 여성 중, 2명이 생존했습니다. 즉, 생존률은 40%입니다.


그러면, 우리가 가지고 있는 train data의 통계치를 활용해 "성별"이라는 Feature를

{'남성':0.6, '여성':0.4}로 새롭게 mapping 할 수 있게 되었습니다.


그러던 중, 바다에서 새로운 사람을 발견했습니다!

그러면 모델에게 사람의 성별을 통해서 대충 예측할 수 있도록 도움을 주는 것입니다.

그 사람이 "남성이라면, train data에 기반해 예측하건데 생존률이 60%야."

그 사람이 "여성이라면, train data에 기반해 예측하건데 생존률이 40%야."

와 같이 말입니다.


"2-3"에서 다룬 "Target 값의 누수"와 연관지어 의문이 들 수 있습니다.


엄밀히 말하면, Target Encoding은 Data Leakage에 있어서 "우려가 높다."라고 표현합니다.

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

## 추가(1차 수정) ##

Training 과정에서도 Data Leakage의 우려를 줄이기 위해서는,

CV 과정에서도 train-valid split의 파생 변수의 target encoding을 적용해야 한다고 소개합니다.

다만, 저는 최종적으로 예측하기 위한 "test"를 위해서 training과정에서는 train data를 모두 사용해도 괜찮다고 생각합니다.

이견이 있으시면 댓글이나 새로운 토크를 올려주세요!



4. 대회 문의를 바탕으로 한 FAQ에 대한 생각

LH에서 만드는 다양한 아파트나, 행복주택 등등은 어느날 갑자기 ⚡빡⚡ 하고 등장하지 않습니다.

정확한 프로세스는 모르지만,

어떤 인구 분포가 있는 어떤 지역에 어떤 주거단지를 "하나" 만들려고 할 때, 그 때 "주차 수요"가 얼마나 될지 의문을 가지는 것입니다.

그렇기 때문에 Test Data의 파생 변수를 생성하는데 있어서 우리가 알지 못하는 "미래의 주거 단지들 사이의 통계치"를 반영할 수 없습니다.


<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

## 추가(2차 수정) ##

대회 문의 글들과 데이터를 다시 보니, 제가 조금 다른 맥락을 짚었던 것 같기도 합니다.

현재 문의는 2가지 종류가 있는 듯 보입니다.


동일 단지코드 데이터 사이의 통계치 반영

  • 이 경우는 Data Leakage가 아닌 것으로 보입니다.
  • EX)  "동일 단지 코드 내 평균 전용면적"은 가능할 것으로 보입니다.

단지코드들 사이의 통계치 반영 방법

  • 이 경우에는 Test Data들 사이의 통계값을 이용하면 Data Leakage로 보입니다.
  • EX)  test data들의 "서로 다른 단지 코드 내 평균 전용면적"은 불가능해 보입니다.

판단 근거

  • Submit 해야 하는 파일은 "단지 코드" 단위로 제출해야 합니다.
  • 동일 주거 단지 내부의 구성은 다 마련해둔 후 (전용 면적, 전용 면적별 세대수 등),

  이러한 특징을 가진 주거 단지가 있을 때, 해당 단지의 "주차 수요"를 예측하는 문제로 파악됩니다.

  • 동일한 질문이 있었네요 (링크)


## 추가(3차 수정) ##

목차 수정

이 내용을 4번으로 따로 가져와서 정리하는 것이 보기에 좋아 보이네요


## 추가(4차 수정) ##

공공데이터 관련 문의

이번 데이터에는 "시점"과 관련된 데이터가 없습니다.

즉, "현재 시점까지 공개된 모든 데이터"를 활용할 수 있습니다.



이미 종료된 "LH  식수 예측"과 관련된 공모전은 시계열 데이터이기 때문에

공공데이터를 사용하더라도, 해당 시점 이후에 생성된 공공데이터는 활용할 수 없다고 규정되어있습니다.

하지만 "LH-주차 수요"와 관련된 공모전은 특징들을 기반으로 목표를 알아내는 공모전이기 때문에, 시점에 관계없이 활용할 수 있겠습니다.

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<





여기까지, Data Leakage에 대한 내용을 쭉 정리해봤습니다.

도움이 되셨길 바랍니다 ㅎㅎ


5. 참고 자료






예시를 들며 설명하려다 보니, 내용이 길어졌네요 ㅎㅎ

이견이 있으시면 댓글이나 새로운 토크를 올려주세요!

도움이 되었다면, 추천 부탁드려요 :D

로그인이 필요합니다
0 / 1000
이대권
2021.07.29 00:28

감사합니다. 이해가  ⚡빡⚡되었습니다.

Jay Hong
2021.07.29 01:08

감사합니다. ㅎㅎ

Mather
2022.09.25 17:46

🤜🏿🤛🏼

민규jeRRy
2022.10.18 17:25

test 데이터의 예측치와 train 데이터를 병합해서 사용하는 pseudo labeling 은 Data Leakage 에 해당하는 걸까요?

Jay Hong
2022.10.19 15:56

결론 먼저 적자면, 저는 Data Leakage라고 생각합니다.

제가 예전에 공부했던 Pseudo Labeling은
1. Train Data로 학습한다.
2. Test Data를 예측한다.
3. 예측한 Test Data의 Label이 정답인지는 관심 없이, Train과 Test를 병합하여 다시 학습한다.
4. 다시 학습한 결과로 Test Label을 업데이트한다.
5. 3~4 과정을 Test Label이 수렴할 때까지 반복한다.
로 기억하고 있습니다.

이 경우, 3번 과정에서 Test Data를 학습에 사용하였기 때문에 Data Leakage에 해당한다고 생각합니다!

플로라도
2023.06.08 21:08

좋은글 감사합니다 ~!

antony
2023.08.29 16:33

Experienced template creator skilled in designing visually appealing and user-friendly templates for job search sites. Proficient in utilizing xtiles, I specialize in crafting customizable boards that streamline the job search process, organize applications, and track progress. Passionate about enhancing user experience and maximizing efficiency, I bring creativity and expertise to deliver high-quality templates that help job seekers stand out in their career endeavors. Let's collaborate and create impactful templates to empower job seekers on their path to success.

My templates on oficial website xTiles:
https://xtiles.app/en/templates/weekly-planning-template
https://xtiles.app/en/templates/company-one-pager-template
https://xtiles.app/en/blog/how-to-create-an-ideal-mood-board-the-ultimate-guide
https://xtiles.app/en/templates/brainstorming-template
https://xtiles.app/en/templates/character-profile-template