Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ragulpr/wtte-rnn
WTTE-RNN a framework for churn and time to event prediction
https://github.com/ragulpr/wtte-rnn
churn-prediction failure-rate keras machine-learning-algorithms neural-network rnn tensorflow weibull
Last synced: 7 days ago
JSON representation
WTTE-RNN a framework for churn and time to event prediction
- Host: GitHub
- URL: https://github.com/ragulpr/wtte-rnn
- Owner: ragulpr
- License: mit
- Created: 2017-01-26T15:51:17.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2020-08-07T06:00:31.000Z (about 4 years ago)
- Last Synced: 2024-05-21T13:39:41.513Z (6 months ago)
- Topics: churn-prediction, failure-rate, keras, machine-learning-algorithms, neural-network, rnn, tensorflow, weibull
- Language: Python
- Size: 9.11 MB
- Stars: 760
- Watchers: 44
- Forks: 185
- Open Issues: 37
-
Metadata Files:
- Readme: README.ko.md
- License: LICENSE
Awesome Lists containing this project
- awesome_time_series_in_python - WTTE-RNN
- awesome-time-series - wtte-rnn - RNN a framework for churn and time to event prediction. (๐ป Repos with Models / Managed database services)
README
# WTTE-RNN
[![Build Status](https://travis-ci.org/ragulpr/wtte-rnn.svg?branch=master)](https://travis-ci.org/ragulpr/wtte-rnn)
๋ฒ ์ด๋ถ ์๊ฐ-์ด๋ฒคํธ ์ํ ์ ๊ฒฝ๋ง (Weibull Time To Event Recurrent Neural Network)
์ด๋ฒคํธ ๋ฐ์ ๋ฐ ์๊ฐ ์์ธก์ ๋ํ ๋ ์ด๋ ค์ด ๊ธฐ๊ณ ํ์ต ํ๋ ์์ํฌ์ ๋๋ค.
์๋ฒ ๋ชจ๋ํฐ๋ง๋ถํฐ ์ง์ง ๋ฐ์ ๋ฐ ์์ฐ๋ ์์ธก ๋ฑ์ ๋ค์ํ ๋ฌธ์ ๋ ํฌ๊ฒ ๋ณด๋ฉด ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ์๊ฐ์ ์์ธกํ๋ ๋ฌธ์ ์ ๋๋ค.
WTTE-RNN์ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ์ด๋ป๊ฒ ๋ค๋ฃจ์ด์ ธ์ผ ํ๋๊ฐ์ ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.* [๋ธ๋ก๊ทธ ๊ธ(์์ด)](https://ragulpr.github.io/2016/12/22/WTTE-RNN-Hackless-churn-modeling/)
* [์์ฌ ๋ ผ๋ฌธ](https://ragulpr.github.io/assets/draft_master_thesis_martinsson_egil_wtte_rnn_2016.pdf)
* [๋ชจ๋ธ](https://imgur.com/a/HX4KQ) ์ ๋ํ ๋น ๋ฅธ ์๊ฐ์ ์๊ฐ
* Jupyter notebook: [๊ฐ๋จ](examples/keras/simple_example.ipynb), [๋ชจ๋ ๊ณผ์ ํฌํจ](examples/data_pipeline/data_pipeline.ipynb )# ์ค์น
## Python
[ํ์ด์ฌ ํจํค์ง๋ฅผ ์ํ README](python/README.md)๋ฅผ ํ์ธํ์ธ์.
ํ์์๋ ๋ด์ฉ์ด ๋๋ฌด ๋ง๋ค๊ณ ์๊ฐํ์ ๋ค๋ฉด, ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ์ [jupyter notebook](examples/keras/standalone_simple_example.ipynb) ์ ๊ฐ ์ค์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
# ์์ด๋์ด ๋ฐ ๊ธฐ๋ณธ ๊ฐ๋
๋ง์ ์ด๋ฒคํธ๋ก ๊ตฌ์ฑ๋ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณ ์๊ณ , ๊ณผ๊ฑฐ์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ค์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ์๊ฐ (TTE, time to the next event)์ ์์ธกํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ์์ง ๋ง์ง๋ง ์ด๋ฒคํธ๋ฅผ ๊ด์ธกํ์ง ์์๋ค๋ฉด ์ฐ๋ฆฌ๋ ํ๋ จ ํ ์ ์๋ TTE์ ์ต์ ๊ฒฝ๊ณ์ ๊น์ง๋ง ์๊ณ ์๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ค๋์ ๋จ๋ ๋ฐ์ดํฐ (*censored data*)๋ผ๊ณ ํฉ๋๋ค. (๋นจ๊ฐ์์ผ๋ก ํ์ํ์ต๋๋ค):
![์ค๋์ ๋จ๋ ๋ฐ์ดํฐ](./readme_figs/data.gif)
์ผ์ข ์ ํธ๋ฆญ์ผ๋ก, TTE ์์ฒด๋ฅผ ์์ธกํ๋ ๋์ ๊ธฐ๊ณ ํ์ต ๋ชจ๋ธ์ด *ํ๋ฅ ๋ถํฌ์ ๋งค๊ฐ ๋ณ์* ๋ฅผ ์ถ๋ ฅํ๋๋ก ํด ๋ด ์๋ค. ์ด๋ค ํ๋ฅ ๋ถํฌ๋ ๊ฐ๋ฅํฉ๋๋ค๋ง, ๊ทธ [๊ต์ฅํจ](https://ragulpr.github.io/2016/12/22/WTTE-RNN-Hackless-churn-modeling/#embrace-the-Weibull-euphoria) ์ ์ข์ํด์ *Weibull ๋ถํฌ* ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๊ธฐ๊ณ ํ์ต ์๊ณ ๋ฆฌ์ฆ ๋ํ ๊ทธ๋๋์ธํธ ๊ธฐ๋ฐ์ ์์์ ์๊ณ ๋ฆฌ์ฆ์ด ๋ ์ ์์ต๋๋ค๋ง, ์ฐ๋ฆฌ๊ฐ ๊ทธ [๊ต์ฅํจ](http://karpathy.github.io/2015/05/21/rnn-effectiveness/)์ ์ข์ํด์ RNN์ ์ ํํ์ต๋๋ค.
![WTTE-RNN ๊ตฌ์กฐ ์์ ](./readme_figs/fig_rnn_weibull.png)
๋ค์ ๋จ๊ณ๋ ์ค๋์ ๋จ๋ ๋ฐ์ดํฐ์๋ ์ ์ฉํ ์ ์๋ ํน์ํ log-loss ์๊ณ ๋ฆฌ์ฆ์ ์ ํํด ํ๋ จ์ํค๋ ๊ฒ์ ๋๋ค. ๊ทธ ๋ฐฐ๊ฒฝ์ด ๋๋ ์ง๊ด์, *๋ค์* ์ ๋ฐ์ํ ์ด๋ฒคํธ ์์ ์ ๋์ ํ๋ฅ ์ ํ ๋นํ๊ฑฐ๋, (์ค๋์ ๋จ๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ) ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง *์์* ์์ ์ ๋ฎ์ ํ๋ฅ ์ ํ ๋นํ๊ณ ์ถ๋ค๋ ๊ฒ์ ๋๋ค.
![์๊ฐ์ถ์ ๋ฐ๋ฅธ WTTE-RNN ์์ธก](./readme_figs/solution_beta_2.gif)
๊ทธ ๊ฒฐ๊ณผ๋ก ์ฐ๋ฆฌ๋ ๊ฐ ๋จ๊ณ์์ *TTE์ ๋ถํฌ* ์ ๋ํ ๊ฝค ๊น๋ํ ์์ธก์ ์ป์ต๋๋ค (์๋๋ ๋จ์ผ ์ด๋ฒคํธ์ ๋ํ ๊ฒ์ ๋๋ค):
![WTTE-RNN prediction](./readme_figs/it_61786_pmf_151.png)
๋ค๋ฅธ ์ฌ๋ฏธ์๋ ๊ฒฐ๊ณผ๋, ์์ธก๋ ๋งค๊ฐ ๋ณ์๋ค์ด ์ด๋ฒคํธ *์ผ๋ง๋ ๋นจ๋ฆฌ* (์ํ, alpha) ์ผ์ด๋๊ณ , *์ผ๋ง๋ ํ์คํ๊ฒ* (๋ฒ ํ, beta) ์ผ์ด๋ ์ง์ ๋ํ ์์ธก์ ์๊ฐํํ๊ณ ๊ทธ๋ฃนํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ 2์ฐจ์ ์๋ฒ ๋ฉ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ์์ธกํ ์ํ (์ผ์ชฝ)์ ๋ฒ ํ (์ค๋ฅธ์ชฝ)์ ์๊ฐ์ถ์ ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
![WTTE-RNN alphabeta.png](./readme_figs/alphabeta.png)
## ์ฃผ์ํ ์
ํน์ ์ํฉ์์ ์๋์ ๋ฉ์ง ์์ค ํจ์๋ฅผ ์ฌ์ฉํด๋ ๋๋ ์ฌ๋ฌ ์ํ ์ด๋ก ๋ค์ด ์์ต๋๋ค.
![loss-equation](./readme_figs/equation.png)
๋ฐ๋ผ์ ์ค๋ ์ ๋จ ๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ์ ๋จ๋ ์์ ์ ๋์ ์์ ์ ๋ํด์๋ ๋ถํฌ๋ฅผ ์ํฅํ๋ ์ชฝ์ผ๋ก๋ง ๋ณด์ํฉ๋๋ค. ์ ๋๋ก ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ผ๋ ค๋ฉด ํน์ง(feature) ๋ฐ์ดํฐ์ ์ ๋จ ๋ฉ์ปค๋์ฆ์ ์ํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์๋์ง ์๊ณ ์์ ํ ๋ ๋ฆฝ์ ์ด์ด์ผ ํฉ๋๋ค. ํน์ง(feature)์ด ์ ๋จ ์์ ์ ํฌํจํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค๋ฉด, ์๊ณ ๋ฆฌ์ฆ์ TTE ๋์ ์ ๋จ ํ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ธกํ๋ ์์ผ๋ก ํ๋ จ๋ ๊ฒ์ ๋๋ค. ์ด ๊ฒฝ์ฐ ์ค๋ฒํผํ /์ํฐํฉํธ ํ์ต์ด ์ผ์ด๋ฉ๋๋ค. ์ ์ญ ํน์ง(global feature)์ ์ ๋ค๋ฃจ์ง ์์ผ๋ฉด ์ด๋ฐ ํจ๊ณผ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค.
# ์ํ ๋ฐ ๋ก๋๋งต
์ด ํ๋ก์ ํธ๋ ๊ฐ๋ฐ์ค์ธ ํ๋ก์ ํธ์ ๋๋ค. ์ฝ๊ฒ ํฌํฌํ๊ณ ์ค์นํ ์ ์๋ ๋ชจ๋ธ ํ๋ ์์ํฌ๋ฅผ ๋ชฉํ๋ก ํ๊ณ ์์ต๋๋ค. WTTE-RNN์ ์๊ณ ๋ฆฌ์ฆ์ด๊ณ , churn_watch๋ ์์ฐ ๋ชจ๋ํฐ๋ง ๋ฐ ๋ณด๊ณ ๊ฐ ์ด๋ป๊ฒ ์๋ฆ๋ต๊ณ ์ฝ๊ฒ ์ด๋ฃจ์ด์ง ์ ์๋์ง์ ๋ํ ๋ ์ฐฝ์ ์ธ ์์ด๋์ด๋ก ๊ตฌํ์ค์ธ ๋ฐฐํฌํ์ ๋๋ค. pull-request, ์ถ์ฒ, ์๊ฒฌ ๋ฐ ๊ธฐ๊ณ ๋ฅผ ๋งค์ฐ ํ์ํฉ๋๋ค.
# ์ ์ฅ์ ๋ด์ฉ
* ๋ณํ๊ธฐ
* ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ๋ณํ๋ค (pandas `DataFrame` of expected format to numpy)
* ์๊ฐ-์ด๋ฒคํธ ๋ฐ ์ ๋จ์ ๊ณ์ฐ๋ค
* Weibull ํจ์๋ค(cdf,pdf,quantile,mean ๋ฑ)
* ํ๋ ์์ํฌ ์ฉ์ผ๋ก ์์ฑ๋ ๋ชฉ์ ํจ์๋ค
* tensorflow
* keras
* ์ ๊ฒฝ์ธต
* Keras๋ก ๊ตฌํํ Weibull ์ถ๋ ฅ์ธต## ๋ฉํฐ ํ๋ ์์ํฌ ์ง์
ํต์ฌ ๊ธฐ์ ์ ๋ชฉ์ ํจ์๋ค์ ๋๋ค. ์ฐ๋ฆฐ ์ด ๋ชฉ์ ํจ์๋ค์ ๋ค์ํ ๊ธฐ๊ณํ์ต ํ๋ ์์ํฌ์ฉ์ผ๋ก ์ฌ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ณ ์์ต๋๋ค.
* TensorFlow โ
* Keras (TensorFlow wrapper) โ
* MXnet
* Theano
* Torch
* h2o
* scikitFlow
* MLlib## ๋ชจ๋ธ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ
๋ชจ๋ธ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์์ ๋ฐ์ดํฐ๋ฅผ tte์ฉ์ผ๋ก ๋ณํํด์ผ ํฉ๋๋ค. ๋ชจ๋ธ ํ๋ จ์ ์ํด์๋ ์ต์ข ์ถ๋ ฅ์ ์ํด Weibull ํจ์๋ค์ด ํ์ํฉ๋๋ค.
* SQL, R, Python์ผ๋ก ์์ฑ๋ ๋์ ํจ์๋ค.
## ๋ชจ๋ํฐ๋ง
WTTE-RNN์ ๊ธฐ๊ณํ์ต ์๊ณ ๋ฆฌ์ฆ์ธ ๋์์ ๋ฐ์ดํฐ์ ํํ, ์์ฑ ๋ฐ ์์ธก์ ๋ํด ๋ ผ์ํ ์ ์๋ ์๊ฐ ์ธ์ด์ด๊ธฐ๋ ํฉ๋๋ค.
* ํ๋กฏ (์ผ๋ถ๊ฐ ๋ง๋ฌด๋ฆฌ๋จ)
* ๋ฉ์ง ์น์ฑ ๋๋ ๊ทธ ๋น์ทํ ๊ฒ (๋ค๋ฅธ ๊ณณ์์ ์ผ๋ถ ๋ง๋ฌด๋ฆฌ)
* ์๋ฆผ๊ธฐ๋ฅ (e.g.,Slack/e-mail ๋ด & ์์ฝ)
* API# ๋ผ์ด์ ์ค
* MIT license
## Citation
```
@MastersThesis{martinsson:Thesis:2016,
author = {Egil Martinsson},
title = {{WTTE-RNN : Weibull Time To Event Recurrent Neural Network}},
school = {Chalmers University Of Technology},
year = {2016},
}
```## ๊ธฐ์ฌ
์ง๋ฌธ์ egil.martinsson[at]gmail.com ์ผ๋ก ๋ณด๋ด์ฃผ์ธ์.
๊ฐ๋ฅํ๋ฉด ๋ค๋ฅธ ์ฌ๋๋ค๋ ๋์ธ ์ ์๋๋ก ์ด์๋ฅผ ์ด์ด์ฃผ์ธ์.
๊ธฐ์ฌ/PR/๋๊ธ ๋ฐ ๊ธฐํ ๋ฑ๋ฑ ๋ชจ๋ ํ์ํฉ๋๋ค!