본문 바로가기

데이터와 함께 탱고를/커널 공부하기

[Predict Future Sales] playground 커널 리뷰 0

커널 개요

첫 번째로 리뷰해볼 커널은 Future Sales Prediction: playground 입니다.
대회 커널 중, voting 수도 많고, Public score 도 1.19747 (RMSE 기준) 로, 매우 높은 편입니다.

무엇보다, 다른 커널들보다, 내용이 간결하고 (물론 상대적입니다...) 직관적이라 리뷰해도 괜찮겠다 싶어 골라왔습니다.
각설하고, 핵심만 먼저 소개하면 다음과 같습니다.

  1. 모델은 lightgbm 을 사용합니다.
  2. 핵심은 Model Features 입니다. 즉 어떤 Feature들을 생성했는지가 관건입니다.

다 떠나서, 그럼 최종적으로 Model 에 들어간 Features만 살펴보면 다음과 같습니다.

최종적인 train dataset

 

기존에 데이터에 존재했던 Features
- 'date_block_num' : 월(0~33)
- 'item_price' : 아이템 가격

새롭게 만든 Features
- 'discount_rate' : 그 달의 해당 상점에서의 상품 할인율
- 'city' : shop이 위치한 도시 (category code로 되어있음)
- 'cnt_mean_shop' : 전 기간(13년 1월 - 15년 10월) 동안 해당 상점에서 상품이 팔린 갯수 평균
- 'cnt_med_shop' : 전 기간동안 해당 상점에서 상품이 팔린 갯수 중간값
- 'cnt_std_shop' : 전 기간동안 해당 상점에서 상품이 팔린 갯수 편차
- 'order_mean_shop' : 전 기간동안 해당 상점에서 상품의 주문 수(몇 번 사갔는지)
- 'cnt_mean_shop_cat' : 전 기간동안 해당 상점에서 상품의 카테고리 기준 팔린 상품 갯수 평균
- 'cnt_prev' : 해당 상점에서 상품의 한 달전 팔린 갯수
- 'order_prev' : 해당 상점에서 상품의 한 달전 주문 수
- 'cnt_prev2' : 해당 상점에서 상품의 두 달전 팔린 갯수
- 'order_prev2' : 해당 상점에서 상품의 두 달전 주문 수
- 'cnt_prev12' : 해당 상점에서 상품의 열두달 전 주문 수
- 'order_prev12' : 해당 상점에서 상품의 열두달 전 주문 수
- 'cnt_prev_cat' : 그 달의 해당 상점에서 한 달전 상품의 카테고리 기준 팔린 상품 갯수
- 'cnt_ema_s_prev' : 해당 상점에서 한 달전 이동평균 값(small window)
- 'cnt_ema_m_prev' : 해당 상점에서 한 달전 이동평균 값(middle window)
- 'cnt_ema_l_prev' : 해당 상점에서 한 달전 이동평균 값(large window)
- 'cnt_macd_prev' : 해당 상점에서 한 달전 macd 값
- 'cnt_sig_prev' : 해당 상점에서 한 달전 signal(macd 기준) 값 
- 'month' : 월(1~12)
- 'days' : 일(1~31)
- 'item_order' : 그 달의 해당 상점에서 상품 주문 수

총 24개의 Features 로 구성되어있고, 크게보면 아래와 같이 정리할 수 있습니다.

  • 해당 달의 할인율
  • 이전 달의 이동평균값과 macd, signal 값
  • 해당 달과 이전 달들의 상품 주문수와 팔린 갯수, 전 기간동안의 해당 상품의 평균, 편차
  • 이전 달과 전 기간동안의 상품 카테고리 기준 팔린 갯수

light gbm 으로 모델을 테스트 해본 뒤, 나온 피처의 중요도는 아래와 같았습니다.

피처 중요도

cnt_std_shop (전 기간동안의 해당 상점에서 각 상품별 팔린갯수의 편차) 가 제일 중요했고,
item_order (해당 달에 상품 주문 수) 가 그 뒤로 중요했습니다.

무엇보다, 만들어낸 Features 들이 꽤 중요한 중요도를 가지니, 나름 성공적인 Features 생성이었다고 할 수 있습니다.

Kernel 에서는 크게 다음과 같은 순서로 진행해나갑니다.

  1. 모델 input 으로 들어갈 base dataframe 을 만듭니다. 월/상점/상품을 기준으로 데이터프레임을 짜놓습니다.
  2. 기존 Feature들로 새로운 Feature들을 만듭니다. 다음의 Feature들을 순서대로 만듭니다.
    1. shop, item 기준 평균값, 중간값, 편차  
    2. shop, item_group 기준 평균값
    3. 1달, 2달, 12달 전, 상품이 팔린 갯수, 주문 수
    4. 이동평균값, MACD값, 시그널 값
    5. 할인율
  3. 만든 Features를 base dataframe에 모두 합칩니다.
  4. light gbm 으로 모델을 train 하고 test 합니다.

 

다음 글부터는 실제로 커널 코드를 하나씩 순서대로 보면서 리뷰해보겠습니다.