예측 모형에서의 클래스 불균형(class imbalance) 문제

최근 필자가 논문 리딩을 하는 와중에 클래스 불균형 문제(예측 대상이 되는 부류의 비율이 현저히 달라 생기는 문제)에 대한 논문을 보게 되면서 잠시 이쪽 방향에 대한 고민을 할 기회가 있었다. 실무적으로 많은 예측 업무가 몇개의 클래스들이 심하게 불균형된 상황에서 진행되다 보니 습관적으로 major class에 대한 under sampling을 통한 50:50 학습셋 비율을 맞추는 방향으로 업무를 진행했던게 사실이다. 물론 이 기준 역시 필자 경험에서 나온 나름의 기준이었다(이 때문에 팀내 많은 분들이 비판없이 이 방식을 따르는 폐해가 있긴 하지만…ㅠㅠ ). 하지만 이 기준이 맞는지는 한번도 생각해볼 기회가 없었던게 사실이다. 왜냐면… 데이터가 많았고…그런 고민을 할 만한  동기가 없었다.

클래스 불균형 문제가 왜 큰 문제인가 하면 …

  1. major class를 잘못 예측하는 것보다 minor class를 잘못 예측하는 것의 비용이 일반적으로 더 크다.
  2. 많은 경우 예측 정확도(accuracy)를 기반으로 예측 성능을 평가한다는 문제
    1. 전체 90%는 넘게 차지하는 major class를 예측하는건 상대적으로 매우 쉬운 일이다. 왜냐면 모든 데이터를 major class로 예측하면 90% 정확도는 확보 되기 때문이다. ㅎㅎ

 

과연 내가 잘 하고 있는가 하는 고민의 시발점이 되었던 논문[1]의 표가 있는데, 이를 확인해보면 아래와 같다.

screenshot_1여러가지 셋에서 검증한 결과 결코 major class를 minor class와 같은 비율로 언더 샘플링을 한게 결코 최적의 결과가 아니라는 것을 보여준다.  이는 로지스틱 회귀 관련 표였으나, 논문을 보면 randomForest 역시 유사한 현상이 일어나는 것을 알 수 있었다.

몇몇 연구들을 종합해보면, 일반적으로 under sampling과 training set에 weight을 주는 방식으로 회피하는 방안이 그나마 다른 것들보나 좋은 결과를 보여주고 있다고 하고 많은 분들이 알고 있는 SMOTE 방식과 같은 인공적으로 데이터를 생성하는 방식은 후행 연구들의 비판을 많이 받았다.

그 와중에 필자의 눈을 확~ 잡아당기는 방식이 있었으니, 그것은 앙상블에 기반한 방식[2]이었다.

어느정도 언더 샘플링을 해야 되는지 기준을 모르겠다면  여러번 셋을 만들어 앙상블 방식으로 결정하게 하면 된다는게 핵심 아이디어이다.

screenshot_2위 그림에서 방법론의 아이디어가 도출되었는데, 결국 N개 개별의 balanced bootstrap sample(boostrap sampling 이후 50:50의 비율로 언더 샘플링을 해서 얻는 학습셋)로 N개의 분류기를 만들고 이들의 예측치를 기반으로 예측을 하자는 이야기다.  개인적으로 이 방식은 Breiman교수님의 Balanced Random Forest의 개념과 매우 흡사하다고 생각하고 또한 weighted Random Forest와 맞닿아 있지 않나 하는 생각도 들게 한다.

이 방식 이외에 인공적으로 셋을 만드는 ROSE나 SMOTE 방식은 사실 컴퓨팅 파워만 쓰지 실무적으로 큰 효과를 보질 못했다. 물론 이러한 이야기는 이쪽 연구자들 사이에서도 왕왕 언급되는 부분이기도 하다.

뭔가 예측업무를 하려면 성능을 측정하는 metric을 정하는게 중요하다. 이걸 적절하게 정하지 않을 경우 흡사 나침반이 없이 여행하는것과 같다.  앞서 언급했지만 accuracy나 confusion matrix의 경우 심각하게 퍼포먼스를 왜곡할 가능성이 있으니 클래스 불균형 문제에서는 피하라 조언했었다. 이외에 사용할 수 있는 방법론은 아래와 같다.

  • Lift
  • AUC
  • F1-mesure
  • Cohen’s Kappa

위 방법론은 클래스 불균형 여부에 상관없이 일정한 퍼포먼스 인덱스를 제공해 주니 예측업무에서 빠질 수 없는 통계량이다.

아마도 필자가 50:50 비율로 클래스 비율을 맞춰 학습을 했던 이유는 오래전에  이런 방식으로 나은 성능이 도출된 경험이 있어서였을 거란 생각을 해본다. 하지만 그간 한번도 그 방법이 맞을까 의심해 보지 않고 있었다는 것에 나 자신도 놀랐다.  결국 골든룰은 없다는 것이고, 실제 업무를 한다면 샘플링 비율 자체를 cross validation을 통해 스스로 정해야 될 수 있다는 것을 의미할 수도 있다. 물론 이 고민들이 그만한 가치가 있을까 라는 이야기를 할 수 있으나, 예측 모델의 품질은 분석가의 자존심 이라고 생각하는 분들에게는 한번쯤 고민해봐야 될 문제라 생각한다.

 

 

 

Reference

  1. Burez, J., & Van den Poel, D. (2009). Handling class imbalance in customer churn prediction. Expert Systems with Applications, 36(3 PART 1), 4626–4636. http://doi.org/10.1016/j.eswa.2008.05.027

  2. Wallace, B. C., Small, K., Brodley, C. E., Trikalinos, T. A., & Science, C. (2011). Class Imbalance , Redux. http://doi.org/10.1109/ICDM.2011.33

어떻게 하면 싱싱한 데이터를 모형에 바로 적용할 수 있을까? – Bayesian Online Leaning

예측 모형 운영의 문제점

Concept Drift

  • 예측 모델링이나 머신러닝 영역에서 쓰이는 용어로서 시간이 지나면서 예측 성능이 달라지는 목적변수의 통계적 특징을 의미함
  • 이런 특징은 시간이 지나면서 예측성능이 점차적으로 떨어지는 부작용을 일으킴

복잡한 사회 현상의 한 단면을 예측하자고 할 경우 사회현상에 대한 모든 변인을 고려해 모델링 하는 것은 불가능하기 때문에 이러한 실제 예측모형을 구축할때 점차적으로 성능이 달라지는 현상이 발생한다. 이런 현상은 대부분 피할 수 없는 것으로 판단되고 있으며 오히려 이러한 현상을 빠르지 인지하고 모형을 개선하는 방식으로 현상을 극복하곤 한다. 사실 이런 현상의 이면에는 overfitting이 존재하고 있다. 대부분 예측모델링에서 overfitting 때문에 시간이 가면 갈수록 예측모형의 성능이 하락하는데, 이를 피하기 위해 Concept Drift의 영향이 적은 변수들과 적은 수의 변수로 모델링을 하면서 좀더 Concept Drift의 영향을 줄이곤 한다.

이렇게 판단이 된다면 예측모형을 구축하는데 두가지 전략이 존재하는 것을 알 수 있다.

  1. Concept Drift의 영향이 적은 변수들과 적은 수의 변수들로 Robust한 모형을 구축해 운영한다.
  2. Concept Drift의 영향이 있던 없던 최대한 설명력이 좋은 변수들도 예측모형을 구축하고 성능이 떨어질 때마다 모형을 재 빌드한다.

1번의 경우 대부분의 예측모형을 구축하는 컨설팅 업체들이 접근하는 방식으로, 미션크리티컬한 모형에 주로 활용하는 방식이다. 2번의 경우 온라인 서비스에 관련된 예측 모형에 주로 사용된다. 예를 들면 검색 랭킹 모델이라든지 광고모델이 그렇다.

2번과 같은 방식으로 모형을 구축하고 싶다면, 이 또한 두가지 전략이 존재한다.

  1. 입력 변수가 되는 모집단의 성격이 바뀌는지 지속적으로 모니터링 하고 어느 한계점이 넘었을 경우 모형이 잘 동작하지 않을 것이기 때문에 모형을 재빌드 하는 방식
  2. 지속적으로 새로운 데이터를 모형에 적용해 모형이 항상 최신의 상태로 유지되기 하는 방식

2번 방법이 바로 online learning이며 이번 포스팅에서 주로 설명을 할 내용이다.

Fresh 데이터의 유용성

Facebook의 논문을 참고로 한다면 ‘설명력 있는 변수 발굴’ > ‘모형의 개선’ > ‘fresh 데이터’활용 순으로 모형 퍼포먼스에 기여한다고 이야기 하고 있다. 하지만 모형 성능 개선 이외의 모형의 관리 측면에서 접근한다면 fresh 데이터로 모형을 지속적으로 관리하고 유지하는건 큰 리소스 절감을 가져올 수 있다. 필자가 주목한 부분이 바로 이 부분이다. 이 논문이 인용한 MS의 논문과 여러 리소스를 참고해 온라인 러닝을 수행하는 알고리즘을 구현해 테스트 해봤다.

Bayesian online learning scheme for probit regression

파라메트릭 모형의 경우 모형이 투명해 왜 특정 결과나 나왔는지 살펴볼 수 있고, 원인을 파악할 수 있는 장점이 존재한다. 물론 이런 장점은 모형을 온라인으로 업데이트하는데 큰 장점으로 작용한다. 모형 내부가 어떻게 동작되는지 모르는데, 이를 정확하게 업데이트하는건 어찌보면 말도 안되는 것일 수 있다. 논문에서는 Probit Regression(이하 PR)을 기반으로 모형을 업데이트하는 방법을 제안하고 있는데, PR의 경우 흔히 잘 아는 Logistic Regression에서 링크함수를 cumulative density function으로 바꾼것으로 생각하면 된다. 두 모형의 퍼포먼스는 거의 동일하며 단지 논문에서는 업데이트 편의성 때문에 PR을 선택했다. 여기서 β 는 Φ의 steepness를 조절하는 파라메터이다.

위 식에서 가장 중요한 부분은 개별 신규 데이터가 들어올때 모수를 어느정도 업데이트할지에 대한 것이다. 이는 Λ로 표시했으며, 모형이 정확한 예측을 하면 Λ는 양수를 가지게 되며 그렇지 않다고 하면 Λ는 음수를 가지게 되며,불확실성을 의미하는 Σ를 분모로 둬 불확실성에 따른 업데이트 조절을 하게끔 유도했다. 그러니까 불확실성이 클 수록 변동량은 적어지게 유도하게 되고 반대의 경우 큰 변동량을 유도한다. 쉽게 이야기 하면 모수에 대한 큰 확신을 가지고 있을때 새로운 데이터에서 정답과는 정 반대의 예측결과가 나왔다면 큰 폭으로 모수를 조정하게 된다는 것이다. 이렇게 새로운 관측치를 기반으로 기존에 믿고 있던 모수를 업데이트하는 방식은 전형적인 Bayesian 방식이다.

이런 변동량이 주어졌다면 아래의 수식으로 각 모수의 평균과 분산을 업데이트한다.

,

그럼 위 식에서 \(v()\), \(w()\) 함수의 특징을 알아보자!

함수의 주 아이디어는 예측모형에서 나온 결과가 놀라운 결과가 아닐경우 모수 업데이트는 적게 되고 반대의 경우 많이 되는게 함수의 핵심 아이디어다. Λ가 음수이면 $v(Λ)$는 커지며, m도 큰 폭으로 변화됨, 반면 Λ가 양수일 경우 거의 업데이트가 되지 않는다.
표준편차 역시 Λ가 음수이면 $w(Λ)$는 커지며, σ도 큰 폭으로 변화됨, 반면 Λ가 양수일 경우 거의 업데이트가 되지 않는다.
이들 업데이트과정은 모든 변수에 적용이 되며 개별 변수는 기여 정도와 해당 변수 파라메터 분포에 따라 업데이트가 되거나 혹은 되지 않는다.
이 과정이 합리적인 이유는, 예를 들어 관측과는 다르게 잘못된 예측을 모형이 했다고 한다면, 어떤 변수에 대한 업데이트를 주로 하는게 합리적일까 라는 질문에 적절한 답을 해주기 때문이다. 물론 위 함수는 단순히 CTR예측 모형에 사용된 함수이기 때문에 목적에 따라 다른 값으로 교체가 가능하다.

위와 같은 업데이트 방식을 보자면 분산의 업데이트는 계속 값을 곱해주는 방식으로 수행되기 때문에 0에 수렴이 되게 된다.상식적으로 보자면 어떠한 메인 패턴 데이터가 엄청나게 많이 들어오게 되면 특정 모수에 수렴하게 되는게 당연하지만 이런 상황에서라도 suprising한 관측치가 올라올때 어느정도 이를 감안할 수 있는 정도의 유연성은 모형이 가지고 있는게 좋을 것이다. 칼만 필터의 경우 이러한 문제 때문에 특정 값을 강제적으로 분산에 더해주는 방식을 취하게 되는데 이렇게 될 경우 분산이 무한대로 갈 가능성이 있어 어떠한 관측치가 오더라도 쉽게 모수가 변화되는 현상을 유발 할 수 있게 된다. 논문에서는 이러한 문제를 해결하기 위해 각 모수별 초기 prior에 어느정도 관성을 가지게끔 아래와 같은 수식을 제안하고 있다.

위 수식의 주 아이디어는 과거 데이터에 대한 모형 효과를 점차적으로 잊게 만들기 위해 prior에 회귀하게 하는 방식을 활용한 것이다. ε이 커지면 빨리 잊어버리게 되고, 0이 되면 입력된 모든 데이터의 정보를 활용하게 된다.

BOPR(Bayesian online learning scheme for probit regression with R)

필자가 해당 과제 연구를 위해 BOPR 패키지를 구현했다. 현재 개발버전이여서 CRAN에 올리진 않았으나, github을 통해 아래와 같은 명령어로 설치가 가능하다.

install.packages('devtools')
library(devtools)
install_github('haven-jeon/BOPR')

그럼 ε에 대한 테스트를 해보자!

library(BOPR)
library(ggplot2)
library(pROC)

idx  <- sample(1:nrow(credit_approval))
first_train_set  <- credit_approval[idx[1:200],]
second_train_set  <- credit_approval[idx[201:400],]
test_set <- credit_approval[idx[401:690],]

bopr_mdl <- BOPR(A16 ~ A1 + A4 + A5 + A7 + A9 + A10 + A12 + A13 , first_train_set, epsilon = 0.03)
# test_set$pred_1  <- predict(bopr_mdl, test_set)[,1]
# ggplot(test_set, aes(pred_1)) + geom_density(aes(fill=factor(A16)), alpha=0.6) + xlim(0,1) + ggtitle("ε : 0.03")
# roc(test_set$A16, test_set$pred_1)

bopr_mdl_up  <- online_leraning(bopr_mdl, second_train_set)
## [1] "will added 3 features!"
test_set$pred_2  <- predict(bopr_mdl_up, test_set)[,1]
ggplot(test_set, aes(pred_2)) + geom_density(aes(fill=factor(A16)), alpha=0.6) + xlim(0,1) + ggtitle("ε : 0.03, with  online learning")

plot of chunk unnamed-chunk-1

roc(test_set$A16, test_set$pred_2)
## 
## Call:
## roc.default(response = test_set$A16, predictor = test_set$pred_2)
## 
## Data: test_set$pred_2 in 155 controls (test_set$A16 -1) < 135 cases (test_set$A16 1).
## Area under the curve: 0.8957
bopr_mdl <- BOPR(A16 ~ A1 + A4 + A5 + A7 + A9 + A10 + A12 + A13 , first_train_set, epsilon = 0.07)
# test_set$pred_1  <- predict(bopr_mdl, test_set)[,1]
# ggplot(test_set, aes(pred_1)) + geom_density(aes(fill=factor(A16)), alpha=0.6) + xlim(0,1) + ggtitle("ε : 0.07")
# roc(test_set$A16, test_set$pred_1)

bopr_mdl_up  <- online_leraning(bopr_mdl, second_train_set)
## [1] "will added 3 features!"
test_set$pred_2  <- predict(bopr_mdl_up, test_set)[,1]
ggplot(test_set, aes(pred_2)) + geom_density(aes(fill=factor(A16)), alpha=0.6) + xlim(0,1) + ggtitle("ε : 0.07, with  online learning")

plot of chunk unnamed-chunk-1

roc(test_set$A16, test_set$pred_2)
## 
## Call:
## roc.default(response = test_set$A16, predictor = test_set$pred_2)
## 
## Data: test_set$pred_2 in 155 controls (test_set$A16 -1) < 135 cases (test_set$A16 1).
## Area under the curve: 0.8696

테스트를 해보면, ε 이 커질수록 모형 Divergence가 좋아지는 것을 볼 수 있다. 이는 각 예측 확률값들의 분포가 극명하게 갈리게 되어 예측력이 좋아질 수 있다는 것을 의미할 수 있지만 AUC를 보면 실제 classification 관점에서는 테스트인 0.03의 경우와 비교해볼때 큰 성능향상을 있을거라 생각하기 어렵다. 반면 ε이 0.03을 가지는 경우 어떠한 예측값이든 모형이 변화가 되면 성능이 유연하게 바뀔 수 있을 가능성이 많다는 것을 알 수 있다. 물론 사용 목적에 따른 최적값은 발굴될 필요가 있다.

패키지 개발 방향

현재 패키지는 초기학습을 위한 함수와 온라인러닝을 위한 함수 그리고 예측함수로 크게 구성되어 있다. 앞으로 구현될 기능은 초기 모형에 없는 변수에 대해서 온라인 러닝시 적절한 판단을 수행해 모형에 적용하거나 빼는 Pruning기능과 각 변수의 prior를 개별적으로 설정할 수 있게 하고 Bayesian Probit Regression 파라메터로 셋팅하는 기능까지 구현할 예정이다.

생각들

실시간으로 생성되는 데이터의 종류와 양이 매우 많아지고 있고 이에따라 실시간 데이터 수집, 처리에 대한 플랫폼들은 상당히 많이 고민되어 왔다. 반면 이런 fresh한 데이터를 어떻게 바로 분석, 모델링에 활용할 수 있는지에 대한 논의는 생각보다 많이 되어 있지 않다. 학계에서는 그러한 데이터를 구하기 어려워서겠고, 업계에서는 검색이나 온라인 광고 등 사용자 행동에 따라 액티브하게 모형이 변화되어야 많은 수익을 올릴 수 있는 몇몇 분야에서나 연구가 그나마 되어 있는지도 모르겠다. 하지만 이 영역도 개인화나 IoT가 활성화 되면서 반드시 필요한 부분으로 부상할 것이라 예상해본다. 개인적인 관점에서는 현재 학계에서 유행하는 Deep Learning보다는 Online Learning에 대한 연구가 오히려 가까운 시점의 현업에서 더 활용도가 높지 않을까 하는 생각을 조심스래 해본다.

Reference

  • Com, R. M. (2010). Web-Scale Bayesian Click-Through Rate Prediction for Sponsored Search Advertising in Microsoft ’ s Bing Search Engine. Search, (April 2009), 13–20. Retrieved from http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.165.5644&amp;rep=rep1&amp;type=pdf
  • He, X., Bowers, S., Candela, J. Q., Pan, J., Jin, O., Xu, T., … Herbrich, R. (2014). Practical Lessons from Predicting Clicks on Ads at Facebook. Proceedings of 20th ACM SIGKDD Conference on Knowledge Discovery and Data Mining – ADKDD’14, 1–9. http://doi.org/10.1145/2648584.2648589
  • Nicol, O., Mary, J., & Preux, P. (2012). ICML Exploration & Exploitation challenge: Keep it simple!, 26, 62–85. Retrieved from http://eprints.pascal-network.org/archive/00009618/

 

Overfitting을 피해보자!

Overfitting은 노이즈와 시그널을 구분하지 못하고 노이즈를 과도하게 학습에 사용하게 됨으로써 미래의 데이터에 대한 예측 퍼포먼스를 갉아 먹는 모형 상태를 의미한다.  이런 부분이 최근 빅 데이터 시대에 문제가 되는건 바로 다양한 데이터 때문이다.  필자는 지난번 포스팅에서 데이터가 부족해서 일어났던 과거의 오버피팅이 속성이 다양해지면서 발생하는 오버피팅문제로 전환 시켰다고 언급했는데, Lasso와 같은 Regularization 이외의 방식으로 오버피팅을 피하는 방안들을 정리해 보기 위해서 글을 써본다.

 

수백여개의 변수 사용

필자가 지난번 포스팅에서 다양한 속성 때문에 발생한다고 한 문제는 아래와 같은 방식으로 해결 가능하다.  뭐… 가장 일반적으로 일어나는 오버피팅은 아래와 같은 조치로 대부분 해결 가능하다.

  • 좀더 많은 데이터를 구한다
    •  – 필자 경험상 효과는 있지만 속성 자체를 줄이는 것만큼 큰 효과를 주지는 않았다.
  • 적은 수의 변수를 사용한다.
    •  – 경험이 많은 사람들은 알고 있다. 오히려 변수를 줄임으로써 out of time validation 퍼포먼스가 test set 퍼포먼스보다 더 좋아질 수 있다는 것을…
    •  – 70년 전통의 역사상 가장 상업적으로 성공한 예측모형인 신용평가모형은 10개 내외의 변수를 사용하라고 필드 메뉴얼에 언급하고 있고, 메뉴얼 대로 작성한 모형은 2년이 넘어도 안정적인 성능을 보여준다.

잘못된 테스트 데이터 선택

전체 데이터의 부분으로 학습하고 나머지 부분으로 테스트하는 행위는 전혀 오버피팅을 검출할 수 없게 하고 모형의 잘못된 퍼포먼스만을 보여준다. 반드시 예측 목적에 맞게 out of time validation셋으로 평가해야 된다.  종종 학습시 training AUC, error 가 모형 결과로 도출되어 희망에 부풀곤 하는데, 앞에 training ~ 이라 붙은 성능 지표 결과는 무시하는게 정신 건강상 좋다.

 

상식적이지 않은 변수 관계

알려져 있는 상식은 잘 깨지지 않고, 위배되는 경우가 거의 없으며 그런 상식은 앞으로 1,2년 내에 변할 가능성은 없을 것이다. 예를 들어 최근 1년 동안의 가스요금 체납 횟수가 많으면 많을 수록 향후 90일동안의 채무불이행 확률은 늘어날 것이라는걸 상식적으로 알 수 있다. 만일 모형에서 이와는 반대 방향으로 설명한다든지 비선형적인 패턴을 보인다면 해당 변수는 일단 면밀히 살펴볼 필요가 있다.  과연 그러한 패턴이 그 전과 후에도 발견이 되는지와 앞으로도 그럴 것이라는 확신이 들때 비로소 해당 변수를 사용할 수 있으며 만일 그럴지 아닐지 계속 의문이 든다면 심한 경우 모델에서 제외하는 것도 고려해 봐야 된다.

아쉽게도 이런 변수간의 관련성을 black-box 모형에서는 알기 어려운 경우가 많다. 물론 관련 연구가 없는 것은 아니다. 예를 들어 SVM의 경우 support vector만을 가지고 tree 모형으로 학습해 모형을 해석하는 연구도 되어 있기 때문이다. 하지만 명확히 검증된 방법은 없기 때문에 지금도 regression  혹은 트리모형이 많이 사용된다. regression이 많이 쓰이는건 내부를 면밀하게 들여다 볼 수 있는 장점 때문에 흡사 나침반을 들고 모델링을 하는 느낌을 주기 때문이다.

 

엄청난 파라메터들…

GBM알고리즘의 구현체 중에서 최근 가장 많이 사용하는 xgboost의 경우 굉장히 많고 다양한 모형 파라메터를 제공하고 있다. 이들을 caret과 cross-validation을 이용해 최적의 파라메터를 찾았다고 한다면 과연 이 파라메터가 미래 데이터에서도 최적일지 반드시 고민해야 된다. 결국 이 파라메터도 현재 데이터에 오버피팅 하는데 일조하고 있을지 모른다.  역시 적절한 validation 셋으로 파라메터를 설정해야 될 것이다.

 

변수 종류에 따른 표현…

기계학습 변수에는 크게 두가지 변수가 존재한다.

  1. contextual feature
  2. historical feature

contextual feature는 성별, 나이, 주소 등 시간이 지나도 잘 변하지 않는 속성을 의미한다. historical feature는 이와는 반대로 사용성을 의미하는 속성들이 속하게 되는데, 예를 들어 어제 특정 번호에 전화를 몇번 했는지, 1시간전에 특정 광고를 몇번 클릭 했는지 등 예측의 대상이 되는 개체의 행동을 포괄하고 있는 속성을 의미한다.  최근 다양한 종류의 데이터가 수집되면서 historical feature가 예측력에 기여하는 정도가 매우 커지고 있는 상황임에도 불구하고 일반 contextual feature와 같은 방식으로 모형에 적용하다가 오버피팅의 수렁에 빠지는 경우를 많이 목격하곤 한다.

아래와 같은 변수 전환이 필요하다.

1시간전 광고 클릭수 -> 3시간 동안의  총 광고 클릭수 대비 최근 1시간  광고 클릭수 비율

클릭수의 경우 수치의 variation이 0~무한대 인 반면, 비율의 경우 0~100% 사이에서 변동하기 때문에 변수 변동성이 적어 시점에 따라 크게 변화하지 않는다.

결국 contextual feature의 경우 그대로 사용해도 시점에 따른 변동성만 적당히 체크하면 그대로 사용할 수 있으나, historical feature의 경우 시점에 따라 변동이 심할 가능성이 많아 변동이 적은 방향으로 변수를 변환하여 사용해야 된다.

 

좋은 패키지

 

model_complexity_error_training_test

유명한 오버피팅에 대한 설명중에 하나인데, 위 컨셉 그대로 몇몇 기계학습 패키지는 적절한 시점에 학습을 멈추게끔 설계되어 있기도 하다. 물론 학습시 test set을 별도 입력해줘야 되는 불편함이 있는데, 나중에 발생할 사태에 비해면 매우 적은 비용이다.  당연히 test set은 예측 목적에 맞는 out of time set 이여야 될 것이다.

 

면밀하고 비판적인 모델링

단 1회의 모델링에 AUC 0.9 이상의 모형이 나올 가능성은 거의 없다. 설령 나왔다고 한다면 그게 진짜인지 오버피팅에 의한 결과인지(혹은 데이터가 오염된 것인지…) 모형을 비판적으로 바라봐야 된다.  10%의 시간을 모델링 하는데 썼다면 나머지 90%의 시간은 성능에 대한 확신을 가지는데 써야 된다.

 


실무 모델링에서 오버피팅은 매우 자주 발생한다. 따라서 발생했다고 해서 당황할 필요는 없으며, 오히려 그런 과정을 통해 모델링의 목적을 다시 상기시킬 수 있는 좋은 계기가 된다.

필자가 생각하는 오버피팅의 가장 큰 부작용은 오버피팅이 무서워서 neural net과 같은 알고리즘을 거들떠도 보지 않는 상황이다. 특히 관련된 심한 트라우마가 존재하는 사람일 수록  neural net 사용을 피하고 더 나아가서 Deep Learning 역시 피하곤 하는데, 이는 정말 잘못된 자세라 생각한다. 어떠한 방법론이든 충분히 사용해보지 못하면 문제를 발견하기 어렵고 장점 역시 발견하기 어렵다.

필자의 경우 NN와 RandomForest 애호가로 예측 모델링에 발을 들여 놓았다가 inference가 가능한 regression류의 방법론에 심취하여 사용했고, 이후  Boosting기법의 파워에 매료되어 한동안 Boosting만을 사용하였다가 최근엔 Lasso 등의 방법론을 활용중에 있다. 결국 Variance가 큰 모형 <-> Bias가 큰 모형 사이를 오간 것이다. 그러다 보니 필요에 따라 모형선택의 폭이 넓어지며 성격이 다른 모형을 깊게 사용하면서 서로의 장단점을 두드러지게 느끼게 되어 이해의 깊이도 깊어지게 되었으며, 최근엔 두 모형의 장점을 결합한 하이브리드 모델링 기법을 사용하기도 하면서 재미를 보기도 했다. 결국 이런 유연성은 깊은 이해를 통해 얻어지게 되는 것인데, 그런 좋은 경험의 기회를 오버피팅이라는 흔히 발생하는 문제 때문에 잃지 않길 바랄 뿐이다. 오버피팅은 당연히 발생할 수 있는 문제이며 이를 해결하는 것은 모델링 과정의 일환이라는 걸 이해해야 될 필요가 있다.