물류 유통량 예측 경진대회

알고리즘 | 정형 | 회귀 | 운송량 | RMSE

  • moneyIcon 상금 : 총 100만원
  • 1,429명 마감

 

keypad, Private 1위, Private 점수 8.40763, DNN

2021.12.22 16:54 5,413 조회 language

SEND_SPG_INNB열의 unique 3000개 이상이기에 one-hot encoding은 무리라 생각하여 embedding을 하였습니다.
또한 REC_SPG_INNB열은 unique 수가 데이터 수와 비슷하게 존재하였기에 학습에 큰 영향을 주지 않을 것이라 판단을 하여 제거하였습니다.
모델은 간단한 DNN 모델을 구성하였습니다.

코드
로그인이 필요합니다
0 / 1000
datu
2021.12.22 17:07

저는 one-hot으로 변경하여 모델을 돌렸지만 모델 무게가 너무 무거워서 좋은 모델이라고 생각 안하고 있었는데 많은 걸 느끼게 되는 코드 공유였습니다. 좋은 코드 감사합니다!

keypad
2021.12.22 17:29

저도 아직 많이 모자란데 저를 통해 무엇인가 배워 가신다니 기분이 좋네요 !

신발아까워
2021.12.22 17:42

라벨 인코딩에서 pd.concat으로 test,train데이터를 묶은 이유가 따로 있나요?? 

keypad
2021.12.22 17:51

train / test에 모두 같은 unique값이 있는것이 아니기에 묶어서 라벨링을 해줘야 정상적으로 라벨링이 이루어집니다.
예를 들어 train - a,  b,  c,  d / test - a, c, d, e와 같은 경우 따로 라벨인코딩을 해주면
train - 1, 2, 3, 4 / test - 1, 2, 3, 4와 같이 되겠죠. 인코딩 전에는 같은 문자여도 인코딩 후에는 다른 번호를 가지게 됩니다.
반면, 한 데이터로 묶어서 라벨링을 하면
train - 1, 2, 3, 4 / test - 1, 3, 4, 5 와 같은 결과가 나와 인코딩 전 데이터와 인코딩 후 데이터가 모두 같은 것을 가르키게 됩니다.
이러한 이유로 묶어서 라벨 인코딩을 진행하였습니다.

범성
2021.12.23 00:00

train과 test를 concat하여 labeling하는 과정 자체가 저는 data leakage라고 생각해서 시도하다 말았는데, 위에 예시를 통해 확인해보면 fit하는 과정이 아닌 labeling하는 과정이기에 leakage는 아닌 것 같기도 하네요! 좋은 정보 공유 정말 감사합니다~ 

Jay Hong
2021.12.23 00:26

삭제된 댓글입니다

paul77ms
2021.12.23 00:59

train, test를 concat하여 라벨인코더로 fit하는 방법은 data leakage에 포함되지않나요?
저도 data leakage에 걸릴까봐 test데이터는 묶지않고 진행했는데..  궁금하네요

Jay Hong
2021.12.23 01:38

제가 삭제한 댓글이긴 합니다만...

단순 Label Encoder로 fit_transform하면 ABC를 기준으로 encoding 되기 때문에,
단순 선형 회귀 분석으로 계산 해도 test의 영향을 받습니다..
ex) train : [A,B,D,E], test : [A,B,C,D] 
원래라면 [0,1,2,3]이 되야 할 값이 [0,1,3,4]가 됐죠..
regression은 그 수치에 절대적 영향을 받기 때문에, 학습 과정에서 유의미한 영향을 끼쳤다고도 볼 수 있습니다..

그 뿐만 아니라 코드상에 Embedding하는 과정에서 
Label의 maximum 값을 concat해서 찾았기때문에 
Test 데이터에 UNK가 몇개 들어가있는지 간접적으로 반영이 되었습니다... 
거기서도 data leakage가 발생했죠...

아이구.. ㅠㅠ

keypad
2021.12.23 02:07

전자의 경우 따로 라벨링을 진행하였을 때, 같은 'A'를 보고 train에서는 0이라 생각하고, test에서는 1이라 생각하면 여기서 엄청난 오류가 발생한다 생각했습니다. 모델에게 'A'를 0이라 학습을 시켰는데 테스트에서는 'A'를 1이라 전처리를 해버리면 사실상 모델은 1을 보고 'A'라고 판단하지 않고 아예 다른 것으로 판단하기 때문이죠.
그래서 거시적 관점으로 봤을 때, 제공된 train/test 데이터가 아닌 정말 새로운 데이터가 들어왔을 때도 동일하게 적용되면 문제가 없다 판단했습니다.

"Embedding하는 과정에서 Label의 maximum 값을 concat해서 찾았기 때문에" 이 부분은 위에 설명한 것을 기반으로 생각하면 문제가 없습니다.

Jay Hong
2021.12.23 02:55

일반적인 경우에는 말씀하신게 다 맞습니다..
train과 test에 같은 수치인데 다른 의미를 가지면 추론과 해석에서 오류가 생깁니다..
또한 거시적인 관점에서는 train/test에 있는 모든 데이터 다 쓰면 좋습니다..
데이터 하나 하나가 소중하고, 그 데이터 하나로 인해서 학습되는 가중치가 달라질 수 있기 때문입니다..

다만 이번 알고리즘 경쟁 대회는 train만을 사용해서 test를 예측하는게 목적이었습니다. 
"대회안내" > "규칙" > 3번 "Test Dataset은 추론 과정에서만 사용 가능" 에서 유추 가능합니다..
즉, 이번 대회는 말씀하신 "정말 새로운 데이터" = "test 데이터"로 판단하고 모델을 구축하는게 맞지않았을까 싶습니다..

좀 더 예시를 들자면,
test에는 있지만 train에는 없는 송장 위치가 "거제시", "울진군", "양양군" 3군데가 있습니다. (외부데이터 병합시 확인 가능)
train 데이터만으로는 저 3군데에서 제주도로 택배가 들어올 것이라고 생각 못합니다.
다만 keypad님의 솔루션을 기반으로 학습한다면,  정확히 3군데(거제시, 울진군, 양양군)가 train에는 없으나 test에 존재할 것을 알고 embedding 차원에 3자리의 여유를 둔 것입니다.
따라서, 미래 시점에 해당하는 test 데이터가, 과거 ~ 현재 시점의 train 데이터의 Feature Engineering + Fitting에 반영된거죠..
그렇기 때문에, 이는 data leakage에 해당되며 "Test Dataset은 추론 과정에서만 사용 가능"이라는 규칙에 위반 된다고 생각합니다...

물론 규칙 위반 여부 판단은 Dacon에서 하실겁니다.
제 의견이니 자유롭게 이런 방면으로도 생각할 수 있구나 라고 봐주세요

keypad
2021.12.23 03:00

무슨 말씀이신지 잘 이해했습니다. 다만.. 제 생각에 해당 대회는 어떠한 연속된 시간이나 미래를 예측하는 것이 아닌 일정한 데이터가 들어왔을 때 그에 맞는 추측을 하는 것이라 생각을 하기에 시간적인 것을 예측하는 것에서의 data leakage와는 다르다 생각을 했습니다.

Ssk
2023.05.09 21:37

혹시 이때 컴퓨터 사양 알 수 있을까요?