• Home

KoNLP v.0.80.0 버전 업(on CRAN now)

KoNLP v.0.80.0 릴리즈 on CRAN

3년 5개월만의 업데이트다. 금번 업데이트에서 가장 큰 변화는 기존 36만에서 약 120만 형태소 사전을 탑재했다는 것이고, 이들 사전을 사용자들이 원하는 형태로 사용할 수 있게 하는데 방점을 두었다. 총 66개의 카테고리 사전을 보유하고 있으며 사용자들의 분석 대상에 맞게 카테고리 사전을 선택해 조합하여 사용할 수 있게 하였다.

내부적으로는 0.80 이전까지는 압축된 텍스트 파일 사전을 기반으로 동작했으나 이번 릴리즈에는 사전의 종류와 양이 늘어 이들을 데이터베이스로 관리하게 하였으며, 기존의 로직도 최대한 이쪽을 바라볼 수 있게 코드를 대폭 수정하였다.

과거 버전에서 고질적으로 노출되었던 out of memory 이슈의 경우 최대 120만 사전을 메모리에 가지고 있게 하기 위해서는 선결해야 될 과제였다. 이를 위해 사용자 사용 패턴을 기반으로 가장 빈번하게 사용하는 패턴을 가장 빠르고 효율적으로 구동될 수 있게 수정 하였고, 이 과정을 통해 메모리를 효과적으로 관리할 수 있는 방안을 찾았다. 결과적으로 각각 서로 다른 분석함수(SimplePos22, extractNoun 등등)을 번갈아 가면서 호출할때는 다소 느리나 한 함수를 지속적으로 반복적으로 호출하는 경우엔 매우 빠른 동작을 수행하게 하였고, 이를 통해 메모리 사용 효율화도 이끌 수 있게 하였다(첫 실행에서 느리기 때문에 체감상 느리게 느낄 수 있으나 반복적인 작업에서는 그렇지 않는다는 걸 느낄 수 있을 것이다).

odroid
심지어는 120만 단어를 사용하는 example 코드가 휴대폰에 들어가는 CPU와 2G의 메모리만을 가진 손바닥만한 머신에서도 잘 동작한다(해당 머신은 필자가 마인크래프트 서버로 활용하는 머신인데, 이번에 리눅스에서 테스트 하는데 큰 역할을 수행했다).

최대 120만 사전을 로딩해 분석하기 위해서는 heap memory를 최소 700Mb 이상 잡아서 분석하는걸 추천한다. 따라서 별도의 메모리 설정을 사용자가 하지 않는다면 KoNLP는 -Xmx768M옵션을 잡게 하였다. 더 많은 사전을 직접 만들어 올리지 않는 이상 주어진 사전을 최대한 활용하기엔 부족함이 없을 것이다. 물론 768Mb보다 작은 힙 메모리를 설정상 보유하고 있으면 여기에 따른 안내 메시지도 도출되게끔 했다.

Tutorial

백문이 불여일견 인데.. 직접 사용을 해보도록 하자!

# 몇몇 마이너한 버그가 수정된 패키지를 원한다면 개발버전을 설치해도 좋다.
# 참고로 예시는 개발버전으로 수행하도록 한다. 
#devtools::install_github('haven-jeon/KoNLP', build_vignette=T)

install.packages("KoNLP")

금번 버전부터 Scala로 플러그인을 작성할 수 있게 환경을 만들었고, 실제 기존보다 더 나은 문장경계인식 플러그인과 비정상 어절 필터 같은 플로그인을 만들어 적용을 하였다. CRAN에서 미리 컴파일 된 버전을 제공하는 Windows, Mac에서는 런타임이 포함되어 있어 배포가 되며 만일 소스코드 그대로 설치를 하게 되면 별도의 Scala 런다임 라이브러리를 자동으로 다운받아 설치하는 모습을 볼 수 있을 것이다. 따라서 외부 네트웍이 되지 않는 곳에서는 안내되는 메시지를 따라 별도의 설정 작업이 필요하다.

library(KoNLP)
## Checking user defined dictionary!
library(ggplot2)
## Find out what's changed in ggplot2 at
## http://github.com/tidyverse/ggplot2/releases.
library(data.table)
## data.table 1.9.6  For help type ?data.table or https://github.com/Rdatatable/data.table/wiki
## The fastest way to learn (by data.table authors): https://www.datacamp.com/courses/data-analysis-the-data-table-way
#HTML Vignette 보기(한글이 포함된 vignette를 보게 될 줄이야.......@.@) 
vignette("KoNLP-API") 

#일단 시스템 사전만 사용해본다. 
useSystemDic()
## Backup was just finished!
## 283949 words dictionary was built.
txt <- '미국 싱크탱크 전략국제문제연구소의 빅터 차 한국석좌는 9일 미국의 제45대 대통령으로 당선된 도널드 트럼프가 전시작전통제권(전작권)을 한국에 조기에 넘길 가능성이 있다고 전망했다.'

system_res <- MorphAnalyzer(txt)

sum(sapply(system_res, length))
## [1] 102

이제 NIADic을 기반으로 다양한 사전 데이터를 활용해보자!

#추가된 NIADic 사전 패키지
useNIADic()
## Backup was just finished!
## 983012 words dictionary was built.
niadic_res <- MorphAnalyzer(txt)

sum(sapply(niadic_res, length))
## [1] 288
morph_cnts <- rbind(data.table(eojeol=names(system_res), cnts=sapply(system_res, length), kind='시스템 사전'),
                    data.table(eojeol=names(niadic_res), cnts=sapply(niadic_res, length), kind='NIA 사전'))

ggplot(morph_cnts, aes(eojeol, cnts)) + geom_bar(stat='identity', aes(fill=kind), position='dodge') + coord_flip() + ggtitle("어절별 형태소 분석 결과 빈도")

plot of chunk unnamed-chunk-3

기본 시스템 사전을 사용하는 것보다 NIADic을 사용해서 분석하는게 약 2.5배 더 풍성한 형태소 분석 결과를 보여준다.

#자신의 머신이 -Xmx512m 정도의 힙 메모리를 쓰고 있다면,
# woorimalsam 사전만 올려서 아래와 같이 분석 가능함
# options('java.parameters') 명령어로 설정 확인 가능 

#category_dic_nms 파라메터로  '정치(political)' 관련 카테고리 사전을 더 부가할 수 있다. 
#?buildDictionary 메뉴얼 확인! 
buildDictionary(ext_dic = c('woorimalsam'), category_dic_nms=c('political'),
                user_dic=data.frame(term='전작권', tag='ncn'))
## 631100 words dictionary was built.
woori_res <- MorphAnalyzer(txt)

사전 데이터 활용

NIADic 패키지의 사전은 사실 KoNLP만을 위한 사전은 아니다. 따라서 아래와 같은 방식으로 형태소 사전 파일을 텍스트 형태로 내려받을 수 있고, 수정해 다른 형태소 분석기에 활용을 할 수 있다.

다운로드 가능한 사전은 ‘sejong’, ‘woorimalsam’, ‘insighter’이다.

사전의 Copy Right은 CC BY이며, 저작자 표기만 하면 상업적으로 활용이 가능하다. 인용에 대한 정보는 citation('NIADIc')을 참고하면 된다.

library(NIADic)
## Successfully Loaded NIADic Package.
citation('NIADic')
## 
## NIA(National Information Society Agency) and Jeon H (2016).
## _NIADic: NIA(National Information Society Agency) Korean
## Dictionaries_. R package version 0.0.1, <URL:
## https://github.com/haven-jeon/NIADic>.
## 
## A BibTeX entry for LaTeX users is
## 
##   @Manual{,
##     title = {NIADic: NIA(National Information Society Agency) Korean Dictionaries},
##     author = {{NIA(National Information Society Agency)} and Heewon Jeon},
##     year = {2016},
##     note = {R package version 0.0.1},
##     url = {https://github.com/haven-jeon/NIADic},
##     licence = {CC BY},
##   }
woori_dic <- get_dic("woorimalsam")

woori_dic <- data.table(woori_dic)

#품사별 빈도
woori_dic_cnt  <- woori_dic[,.N,tag][order(-N)]
ggplot(woori_dic_cnt, aes(reorder(tag,N),N)) + geom_bar(stat='identity')

plot of chunk unnamed-chunk-5

#카테고리별 빈도 
woori_dic_cnt  <- woori_dic[,.N,category][order(-N)]
ggplot(woori_dic_cnt, aes(reorder(category,N),N)) + geom_bar(stat='identity') + coord_flip()

plot of chunk unnamed-chunk-6

write.csv(woori_dic, file='woori_dic.csv', row.names=F, fileEncoding='UTF-8')

좀더 자세한 내용은 KoNLP-APIvignette을 참고하기 바란다.

차주 초나 금주 말에 몇몇 마이너 버그를 해결하고 다시한번 CRAN에 업데이트를 할 예정이다. 혹시 사용중 이슈가 있으면 이곳에 올려주면 감사하겠다(물론 한글로 올려도 좋다).

ps.
마지막으로 3년 5개월만에 KoNLP를 업그레이드 할 수 있던 동기를 부여해 주셨던 NIA 빅 데이터 센터에 감사의 말을 전하고 싶다. 이곳에서 마련해준 사전 데이터가 아니였으면 KoNLP의 버그수정/기능개발은 커녕 방향도 고민하지 못했을 거라는 생각을 다시한번 해보게 된다. 다시 코드를 보고 개발을 시작하면서 피곤하지만 굉장한 재미가 있었고, KoNLP의 목적과 방향을 다시 설정할 수 있었던 소중한 시간이었다.

예측 모형에서의 클래스 불균형(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/