• Home

어떻게 하면 싱싱한 데이터를 모형에 바로 적용할 수 있을까? – 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가 큰 모형 사이를 오간 것이다. 그러다 보니 필요에 따라 모형선택의 폭이 넓어지며 성격이 다른 모형을 깊게 사용하면서 서로의 장단점을 두드러지게 느끼게 되어 이해의 깊이도 깊어지게 되었으며, 최근엔 두 모형의 장점을 결합한 하이브리드 모델링 기법을 사용하기도 하면서 재미를 보기도 했다. 결국 이런 유연성은 깊은 이해를 통해 얻어지게 되는 것인데, 그런 좋은 경험의 기회를 오버피팅이라는 흔히 발생하는 문제 때문에 잃지 않길 바랄 뿐이다. 오버피팅은 당연히 발생할 수 있는 문제이며 이를 해결하는 것은 모델링 과정의 일환이라는 걸 이해해야 될 필요가 있다.

Lasso 그리고 고차원 문제와 오버피팅

Lasso

속성의 숫자가 레코드보다 더 많은 경우 발생할 수 있는 문제는 오버피팅(overfitting)이다. 이는 레코드에서 sparse하게 나타난 패턴을 적절하지 않은 속성으로 과대 해석하게 됨으로써 발생하게 된다. 이 때문에 속성 선택 과정을 거치거나 혹은 더 많은 데이터를 구하는 과정을 거치게 된다.

위와 같은 경우는 앞으로 IoT(Internet of Things)가 일반화되어 특정 단위 시간에 다양한 종류의 데이터가 쏟아지게 되면서 더 큰 이슈로 부상할 것이며, 이미 바이오정보학에서는 일반화된 문제이다.

최근 이런 이슈때문에 주목을 받고 있는 방법론이 Lasso (least absolute shrinkage and selection operator)이다.

Lasso는 모형의 Bias를 다소 올리면서 Variance error를 줄이는 방식을 취하는데, 이때문에 모형이 다소 복잡해지는 측면이 있으나 Variance 에러가 획기적으로 줄기 때문에 전체 에러를 줄이게 되는 효과를 발휘해 실무에서 많이 활용되고 있다.

Lasso

위 식에서 $\lambda$는 추정해야 될 부분으로 대부분의 경우 cross-validation으로 최적값을 찾게 된다. $\lambda$가 0이면 일반적인 최소제곱법을 제공하게 되고 \(\lambda\) 충분히 크다면 모든 추정치가 0인 intercept만 존재하는 모형이 만들어진다.

lasso_fig

위 그림은 Lasso를 설명하는 가장 유명한 그림으로 왼쪽이 Lasso, 오른쪽이 Ridge 방법을 의미한다. 등고선은 RSS가 일정한 부분을 의미하고 푸른 영역은 $\lambda$가 포함된 constraint function을 의미한다. Ridge와 Lasso의 가장 큰 차이점은 $l_1$norm이냐 $l_2$norm이냐의 차이인데, $l_1$일 경우 manhattan distance와 형태의 함수를 제공하고, $l_2$일 경우 euclidean distance 형태의 함수를 제공하는 차이를 보여주는데, 이 부분이 그래프에 표현 되어 있다. Lasso의 경우 최적값은 모서리 부분에서 나타날 확률이 Ridge에 비해 높아 몇몇 유의미하지 않은 변수들에 대해 계수를 0에 가깝게 추정해 주어 변수 선택 효과를 가져오게 된다. 반면 Ridge의 경우 어느정도 상관성을 가지는 변수들에 대해서 pulling이 되는 효과를 보여줘 변수 선택보다는 상관성이 있는 변수들에 대해서 적절한 가중치 배분을 하게 된다. 따라서 Ridge의 경우 PCA와 상당한 관련성이 있다.

필자의 경우 Lasso는 stepwise elimination의 훌륭한 대안으로 활용하고 있다. 실제 stepwise elimination은 이 방법을 구동할때마다 다른 변수 선택이 이루어져 일관성을 보여주지 못한다. 하지만 Lasso의 경우 모델 메트릭스가 general position일 경우 항상 동일한 값을 보여준다는 것이 증명되어 있다. 게다가 느린 stepwise elimination에 비해 상당히 빠르다.

고차원 문제와 오버피팅

위 Lasso와 Ridge 모두 변수가 많은 경우 모델 오버피팅을 피하기 위한 방법중에 하나이며, 이곳에 존재하는 \(l_1\), \(l_2\) norm의 경우 딥러닝에서 오버피팅을 방지하기 위한 용도로까지 활용되고 있다. 하지만 방법론 자체가 오버피팅을 완전히 피할 수 있게 하지는 않는다. 필자가 지금까지 모델링을 결과를 보면서 가장 애를 먹은 부분은 오버피팅문제이고, 지금도 이 이슈는 나를 가장 곤혹스럽게 한다. 단순히 학습셋에서 테스트셋을 쪼개 검증하는 과정을 반복하면서 MSE가 0에 가깝게 나왔다고 엄청난 성능 개선을 했다고 좋아하다가 나중에 실제 미래 데이터에서 성능이 엉뚱하게 나오는 경우에 오버피팅이 발생한 걸 뒤늦게 발견하고 후회해본 경험이 있다면 필자의 마음을 이해할 수 있을 것이다. 참고로 10개의 속성으로 단 두개의 학습셋에 피팅을 해서 MSE 0이 도출되는건 매우 쉽다. 그러나 그렇게 나온걸 여러분이 목적으로 삼은 모형이라 할 수 있는가? 더 많은 데이터 혹은 내일 생성될 데이터를 입력할때 동일한 성능을 보여줄 것으로 생각할 수 있을 것인가?

이런 오버피팅을 피할 수 있는 가장 좋은 방법은 적절한 검증셋을 구축하는 것이다.
많은 분들이 검증셋과 테스트셋을 구분하지 못하는데, 검증셋은 모형이 구축될 당시의 어떠한 관련 정보가 포함되어 있지 않은 셋으로 구성된 셋을 의미한다. 필자의 경우 모형에 쓰일 변수를 선택하는데 Information Value(IV)값을 주로 참고하고, 실제 날짜 정보(예를 들어 년월)를 모형에 넣지는 않지만 날짜정보도 함께 IV값으로 확인한다. 만일 날짜 정보의 IV가 높다면 검증셋은 반드시 out-of-time 데이터로 구축해야 된다고 판단한다(초심자들은 날짜를 변수로 그대로 넣어 성능향상을 했다고 이야기하기도 하는데, 이럴 경우 spurious regression 문제가 발생한다. 날짜를 바로 넣기 보다는 그러한 효과를 일으킨 원인 변수를 찾는 작업을 통해 해당 원인 변수를 적용해야 된다). 결과적으로 트레이닝에 쓰인 데이터의 날짜와 겹치지 않는 미래 혹은 과거의 데이터로 모형을 다시한번 검증해야 된다는 것이다.
이 이외에 validation set을 구축하는 방법은 속칭 golden set을 구축하면서 수행된다. 모형의 성능을 객관적으로 평가할 수 있는 셋을 추가로 구축하는데, 대부분 사람이 구성하게 된다. 요망하는 모형의 decision boundary를 가이드 하는 흡사 SVM의 support vector와 같은 데이터들로 별도 셋을 구성해 놓는 것이라고 생각하면 된다.

일단 구축이 되면 test set 퍼포먼스와 validation set 퍼포먼스를 맞추기 위해서 다양한 시도를 하게 되는데, 이 부분이 모델링의 백미이며, 이 과정을 통해 실제 test와 validation set 모두의 퍼포먼스 향상을 가져오기도 하고, 모형이 더 간단해지면서 해석이 쉬워지기도 한다.


최근에 다양한 분석 모델링 도구들이 나오고 많은 책들이 소개되고 있는 가운데 개인적으로 가장 아쉬운 부분은 무분별한 모델링으로 인해 간과하고 넘어가는 부분들이 상당히 많아지고 있다는 것이다. 이러한 부분들은 모델링 목적에 대한 완벽한 이해와 데이터에 대한 충분한 탐색을 함으로써 얻어지게 되는데 데이터만 주어지면 무작정 모델링을 하게 됨으로써 큰 낭패를 보는 경우가 허다하고 대부분의 경우 적절한 검증셋 준비가 없거나 테스트셋과 다를바 없는 검증셋으로 눈가리고 아웅식으로 진행하기 때문이다. 게다가 이럴 경우 의도치 않은 거짓말(?)을 하게 되기도 한다. 이렇게 된 이유중에는 빅 데이터가 활성화 되면서 일어난 데이터 다다익선(多多益善)미신이 한 몫 했다고 생각한다. 데이터는 뭐든지 추가하면 좋아질 것이라는 믿음은 오히려 데이터가 부족해서 과거에 많이 일어났던 오버피팅 문제를 속성이 많이 늘어나면서 생기는 오버피팅 문제로 전환을 시켜버렸다고 생각한다. 그리고 이러한 문제는 위와 같은 미신때문에 더 해소하기가 어려워졌다.

다시 말하자면 학습모델링 역시 더이상 뺄것이 없을 때 완벽해 진다는 것을 꼭 인지해야 될 것이다. 또한 검증셋은 반드시 모형의 목적에 맞는 그러한 데이터셋으로 엄격하게 구축해 나침반으로 사용해야 된다. 그러한 상황에서 Lasso 방법론도 올바른 모형을 건내줄 것이다.

참고문헌

  • An introduction to statistical learning with R  : http://www-bcf.usc.edu/~gareth/ISL/