본문 바로가기
Kaggle 대회

[Santander Product Recommendation] Baseline 구축하기②

by 사자처럼 우아하게 2019. 12. 25.

이번 포스팅에서는 앞서 언급한 치명적인 실수가 무엇인지 파헤쳐본 결과에 대한 것입니다.

열심히 Baseline을 구축하고 결과를 제출한 순간 LB Score 0.00698라는 처참한 결과를 얻었습니다.

무엇이 잘 못되었는지 아무리 뒤져봐도 모르겠어서 "머신러닝 탐구생활" 책에 제공된 Script를 한줄 한줄 필사 했습니다.

모델링까지 필사를 다하고 나니까 문제가 무엇인지를 깨달았네요. 제 사고가 문제였습니다. 머리를 개조해야했죠.

문제를 해결하기 위해 여러 방면으로 많은 시도(ex, fold 나눌때 Shuffle =True로 변경)를 했었는데 Valid log loss 1.5를

뚫지 못했었습니다.

 

[ 처참했던 LB Score ]

 


1. 보이는 Target값(Y)이 Target값이 아니다.

   - 문제를 제대로 이해하지 못해서 발생하는 문제였습니다. 그동안 Train 데이터에는 있고 Test 데이터에는 없는 컬럼,  그것이 곧 Target 값이라고 당연히 생각했습니다.  이번에도 Target 값으로 보여지는 상품 컬럼(24개)이 당연하게 Target일 것이라고 어림짐작하고 Baseline을 구축했죠. 그 결과는 처참했습니다.

 

   - 이 문제 소개로 다시 돌아가서 생각해보면  이 문제는 Test 데이터 날짜(2016-06-28)에 "보유하고 있을 상품"을 찾는게 아니라 "신규로 구매할 상품"을 찾는 문제입니다. 여기에서 첫번째 큰 실수가 나왔습니다. 이전의 Baseline은 "보유하고 있는" 상품을  맞추는데 초점이 맞춰져있었죠.

   

    - 이를 해결하기 위해 모든 컬럼에 대해 lag-1(지난달)의 컬럼값을 모두 옆에 붙였습니다. 그리고 이번달과 지난달의 컬럼값을 비교하여 신규로 발생한 상품을 "Y"라는 신규 컬럼을 만들어서 그 상품 번호를 기입했습니다. 그리고 추후에 이 Y값을 사용했습니다.(자세한 코드는 깃헙 을 참고하세요 바로가기)

 

 

2. Target 값으로 보이는 것도 Input 인자일 수 있다.

   - 앞선 문제를 해결하며 Training을 위한 "Y" 값은 잘 만들어내고 학습을 시켰는데도 학습이 전혀되지 않는 문제가 있었습니다. 여기서부터는 문제가 무엇인지 몰라 한참을 해맸는데요 결국 문제는 다른 코드를 필사하면서 깨닫게 되었습니다. 

   - 문제는 제가 X 인자를 다 지워버렸다는 데에 있었습니다. 신규 상품을 나타내는  "Y" 컬럼을 만들어낸 후에 보유 상품을 나타내는 컬럼 24개를 Train 데이터에서 지워버렸는데요. 이로 인해 학습은 age, 지역 등 상품이 아닌 고객 기본 데이터 24개를 가지고 학습을 하게되었습니다. Test 데이터에는 없으니까 지우는게 당연한거라고 생각했는데 그게 아니였습니다.

   - 이 대회 데이터의 특징은 TimeSeries 라는데에 있습니다. 즉 Train/Test 데이터셋을 Merge 하여 이전 보유 상품이 무엇이었는지 알아낼 수 있다는 거죠. 이점을 간과했던 저는 처참한 LB Score 늪에서 벗어나지 못하고 헤맸던겁니다.

   - 이를 해결하기 위해 Train/Test 데이터 셋을 Merge 하고(없는 컬럼은 신규로 만들어서 0을 기입했습니다.) Test set에도 이전 보유 컬럼을 X 인자로 만들었습니다.  이후에 학습을 하니 문제 없이 잘 됩니다. (LB Score : 0.006 → 0.01088)

(자세한 코드는 깃헙 을 참고하세요 바로가기)

 

댓글