# 전처리
EDA 단계에서 판단하기로 모든 범주가 변수형이고 피쳐 수가 많지 않다. 피쳐 엔지니어링을 할 것은 없어 보인다. 또한, 애초에 컬럼이 적은데, 시군구 단위에서 세종시에 결측치가 많다. 결측치를 채울 방법이 딱히 생각나지 않기 때문에, 결측치가 있는 피쳐는 drop한다. 범주형 변수인 것만 categorical로 잘 바꿔주면 될 듯하다.
# Baseline 코드 분석
대부분의 Dacon Baseline 코드가 그러하듯 RandomForest 알고리즘을 사용했다. 훈련에는 범주형 변수 7개만 사용했다. 범주형 변수를 사용했기 때문에 Scikit-learn의 LabelEncoder를 사용해 인코딩하고, 제출 파일에 디코딩하는 과정이 중요했다. 그 외에 특이한 점은 학습 및 예측을 log scale로 변환하여 진행한다는 것이었다.
Baseline 코드에서 중요하게 이해하고 넘어가야 할 점은 '예측 템플릿'에 대한 이해라고 생각한다. 도대체 '예측 템플릿'이라는 게 무엇일까 생각했는데 팀원들의 집단 지성 덕분에 이해할 수 있었다! 그 결과로 그 동안 EDA고, 모델 구상이고 머릿 속에서 떠오르는 건 많았는데, 어떻게라도 코드를 돌려볼 수 있었다.
예측 템플릿이라는 것이 결과적으로는 submission에 사용할 테스트 데이터를 만드는 과정이라고 이해해야 할 듯하다. SQL로 치면 7개의 범주형 변수가 하나의 키가 되고(=유일무이한 조합의 레코드이다), 그 레코드에 대해 사용량(AMT)이 얼마일지 예측해야 한다. 다시 말해 7개의 범주형 변수 각각에 대한 product로 만들어진 하나의 레코드가 test data인 것이다. 대회 주최 측에서 그 test data를 안 줬기 때문에, 직접 템플릿을 만들어 예측하고 제출 파일을 만들어야 한다.
그렇게 본다면, 그 간 팀에서 머리를 싸매고 고민했던 CSTMR_CNT, CNT는 어떻게 보면 독립변수라기 보다는 그 조합에 대한 종속변수라고도 볼 수 있다.
# CANCEL 피쳐 추가
EDA 과정에서 CSTMR_CNT, CNT 변수가 분명 사용량과 관계가 있는 것 같았기 때문에, 어떻게든 활용해 보려고 했다. 이용 고객 수가 이용 건수보다 많으면 취소한 고객 수가 많고, 반대로 그렇지 않다면 단골 고객 수가 많다는 의미이다. 따라서 CSTMR_CNT에서 CNT를 빼서 CANCEL 변수를 만들고, 3개의 범주로 나눴다.
이후 기존의 Baseline 코드에서 아무 것도 수정하지 않고, CANCEL 변수만 추가해 RandomForestRegressor 모델을 훈련시켰다. 피쳐 중요도를 분석했다.
기존에 가장 중요하다고 나타난 3개의 변수(HOME_SIDO_NM, STD_CLSS_NM, CARD_SIDO_NM) 외에 CANCEL의 중요도가 그 다음으로 높은 것으로 나타났다.
그런데 예측 템플릿에 해당 변수를 추가하여 예측하는 과정에서, CANCEL의 범주가 3개이므로, 예측해야 할 레코드 수가 더 많아지는 현상이 발생했다. 일단 1차 시도로 모든 레코드에 대해 예측한 후에, groupby를 사용해 평균을 내줬다. 매우 naive한 접근이었는데, 제출해 보니 Baseline RMLSE 점수인 7.09518보다 낮은(^^) 7.27486점이 나왔다. 잘못된 접근인 것 같다.
1. 피쳐를 추가하여 예측하면 안 되는 것인지?
2. CANCEL 변수를 만들어 확인해 보니, 취소한 경우가 압도적으로 많았다. 단순히 3범주로 나누면 안 되는 것이었나?
3. 예측 시 단순히 average를 취하는 것 말고 지역, 업종별로 CANCEL의 가중평균을 취해준다든지, 아니면 애초에 예측 템플릿을 pd.merge 등을 활용해 CANCEL 변수만 join해주는 방법을 사용해야 할 듯하다.
'AI > 제주 신용카드 빅데이터 경진대회' 카테고리의 다른 글
[4] GAN으로 데이터 늘리기 (feat.행복) (14) | 2020.08.18 |
---|---|
[3] LSTM으로 시계열 모형 만들기 (feat.시행착오) (0) | 2020.08.17 |
[2] Gradient Boosting 알고리즘 적용해 보기 (0) | 2020.07.22 |