분석시각화 대회 코드 공유 게시물은
내용 확인 후
좋아요(투표) 가능합니다.
Data Leakage 너무 어려워요.. 차근 차근 정리해보려고 합니다.
한글로 해석하면 “정보의 누설”로 우리가 모른다고 가정하는 정보가 유출된 것을 의미합니다. 경진대회에서 학습에 사용해야하는 데이터인 train data가 아닌 test data에 대한 정보가 활용되면 이는 정보 누설로 볼 수 있는 것입니다. 시험으로 생각하면 편하게 이해하실 수 있을 것입니다. 수능을 준비하는데 이미 수능 문제에 대해 다 알고 있다면 안 될 것입니다. 외우기만 하면 만점이 나오겠지요.. 또한, 수능 시험에서 몇 번이 가장 많이 나온다, 1번이 몇 개, 2번이 몇 개 등과 같은 통계 정보도 누구도 미리 알고 있으면 안 될 것입니다. 이 역시 한 문제, 두 문제 모를 때 찍는 것에 도움을 줄 수 있으니까요..
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를 활용해 Train Data를 정제한 것도 아니고 이 부분이 왜 문제가 될지 의문을 가지실 수도 있습니다.
Train 데이터를 이용해 만든 결과를 새로운 데이터에 활용할 수 있어야합니다. 경진대회와 달리 새롭게 예측할 때에는 test 데이터가 없습니다. Test 데이터들의 통계치를 이용한다는 것은 실제 모델 예측 시, 예측 시점에 얻을 수 없는 데이터 사용입니다.
즉, Test Data는 ‘아예 볼 수 없다.’라고 생각하고 모델링을 진행해야 합니다.
위에서 언급한 부분과 비슷한 거 같긴 한데 데이콘 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월을 예측하고자 한다면 그 전에 올라와 있는 공공데이터만을 사용할 수 있는 것입니다.
데이터에 2022-01-11 11:40:00라는 날짜 데이터가 있어 이 정보를 버리고 싶지 않아서 분리를 시켰습니다. Year 특성으로 2022, Month 특성으로 01, Day 특성으로 11 등과 같이요.
또는 제가 수요예측을 하고자 합니다. 이 때 예측하고자 하는 target 정보를 그대로 활용하는 것이 아닌 다른 특성과 연산을 수행해 새롭게 예측하고자 하는 목표를 만들었습니다. 그리고 target 정보는 삭제하는 것 입니다. 즉, 예측하고자 하는 목표를 다른 값으로 바꾸는 것입니다.
위에 적은 두 가지 모두 Data Leakage로 분류될 것 같지는 않습니다. 첫번째의 경우 원래 있는 데이터를 나눠 새로운 특성으로 만들었을 뿐입니다. 데이터의 분포나 통계치가 활용되지는 않았습니다. 그렇다면 두 번째 경우는 어떨까요? 이 또한 데이터의 분포나 통계치를 활용한 것이 아닙니다. 예측하고자 하는 정보를 비틀었을 뿐입니다.
다 쓰고 읽어보니 너무 막 적은 것 같네요. 차근차근 내용 추가하면서 다듬어나가겠습니다.
읽어주셔서 감사합니다.🙇♂️
좋게 봐주셔서 감사합니다!
Data Leakage에 대해 새롭게 알게 되었네요 공유 감사합니다 🙂
감사합니다😄
정보 감사합니다 :D
정보가 되었다니 다행이네요!
정보 유출에 대해 정리할 수 있었습니다 감사합니다!
좋은 정보 감사합니다 :D
데이콘(주) | 대표 김국진 | 699-81-01021
통신판매업 신고번호: 제 2021-서울영등포-1704호
서울특별시 영등포구 은행로 3 익스콘벤처타워 901호
이메일 dacon@dacon.io | 전화번호: 070-4102-0545
Copyright ⓒ DACON Inc. All rights reserved
감사합니다.
데이터 리키지 중요성을 다시 생각하게 되었습니다.