Prophet 사용으로 예상 못한 문의 건수입니다.

6150 단어 Python3
이 글은 SmartHR Advent Calendar 2019 의 글입니다.
안녕하세요.저는 SmartHR로 지원하는 수야입니다.
이번에는 페이스북이 공개한 시간 시퀀스 예측 머신러닝 라이브러리 Prophet로 상담 건수를 예측하는 이야기를 쓸 예정이다.

원래 과제였어요.


SmartHR은 채팅을 통해 제품 문의를 받습니다.그 문의 건수를 예측하는 것이 과제다.
특히 연말 조정기에는 건수가 늘어나는데 언제?건수가 얼마나 됩니까?팀원 계획과 멤버 교체에 중요한 정보라는 것을 알고 있다.
Excel 등의 도구로 모형을 만들어 예측할 수도 있다
복잡한 공식을 유지하고 수시로 업데이트되는 파라미터를 유지하며 정밀도를 높이기 위해서는 상당한 힘이 필요한 것 같다.
제가 많이 찾아봤는데 페이스북이 제공하는 시간 서열 분석 라이브러리가 있는데python이나 R의 지식과 지역 지식이 있으면 간단하게 예측할 수 있어서 한번 해봤습니다.

Prophet 정보


Prophet는 페이스북이 공개한 오픈 타임 시퀀스 분석 라이브러리다.
사이트 제목
Prophet | Prophet is a forecasting procedure implemented in R and Python. It is fast and provides completely automated forecasts that can be tuned by hand by data scientists and analysts.
공식 문서
Quick Start | Prophet
개요를 대체적으로 요약하면 교사가 되는 시간 서열 데이터부터 기계 학습을 통해 주기성을 분배하고 그 정밀도를 검증하는 도구의 라이브러리이다.
공식 문서는 영어지만 일본어를 번역해 주신 분들도 계셔서 감사합니다.
시간 시퀀스 분석 라이브러리 Prophet 공식 문서 번역 1 (개요 & 특징편) - Qiita

예측을 시작하다


예측할 때 원하는 상태를 미리 결정한다.'예측일, 주, 월별 상담 건수'다.
예측 데이터를 만들 때 Python(Jupyter notebook)을 사용했습니다.

설치 구성


Python을 사용하는 사람에게는 설치가 매우 간단합니다.
# bash
$ pip install fbprophet
이렇게 설치하면 완성되어 곧 사용하기 시작할 수 있다.정말 대단합니다.

교사 데이터 준비


설치가 끝난 후 교사 데이터를 준비하세요.
Prophet의 교사 데이터는 DataFrame 형식으로 준비해야 합니다.
두 항목이 필요합니다. ds, y.
Ds는 합계 기준인 Date 또는 Timestamp의 정보이며 Y는 실제 값입니다.
이번에는 일차적인 예측 결과를 원하기 때문에 ds에 대응하는 날을 준비했고, y에는 그날에 대응하는 문의 건수를 저장한 DataFrame.

조회한 데이터는 BigQuery에 저장되므로 Pandas를 통해 일일 수량을 얻을 수 있습니다.편리하다
import nampy as np
import pandas as pd

query = ‘’’
{sqlを書いてね!}
‘’’

cnv = pd.read_gbq(query, '{bigquery-project-id}', dialect='standard')

모델 설정


다음은 Prophet 모델을 설정합니다.
몇 개의 매개 변수를 설정할 수 있는데 초기에 설정한 주기 외에 년의 주기, 달의 주기도 추가했다.
또 이날 상담 건수가 0이라도 마이너스가 되지 않기 때문에 하한치 플로어와 상한치 cap를 추가했다.
하한값, 상한값을 설정하면 증가 곡선을 선으로 설정합니다liner환경과 혼합되어야 하는 각 반사광선은 환경 샘플링을 한다.
실제 코드를 사용하면 다음과 같은 느낌이 든다.
실행 시 logistic 예측 결과를 포함하는 데이터 프레임이 생성됩니다.
# ライブラリの読み込む
from fbprophet import Prophet

m = Prophet(
     growth='logistic' #増加を回帰的にさせる
    ,yearly_seasonality=True #年間の周期性を有効にする
)

# 月間の周期性を追加する
m.add_seasonality(name='monthly', period=30.5, fourier_order=5) 

pp['cap'] = 400 #1日あたりの上限
pp['floor'] = 0 #1日あたりの下限

m.fit(pp)

# 将来日付の DataFrame を作成する、次の繁忙期が常に予測に入るようにするために 14ヶ月先(427日後)まで予測する
future = m.make_future_dataframe(periods=427)
future['cap'] = 400 #1日辺りの上限
future['floor'] = 0 #1日辺りの下限

forecast= m.predict(future)

예측 데이터 검증


Prophet에는 생성된 모델의 정밀도를 검증하는 라이브러리가 포함되어 있습니다.
모델의 검증 방법은 교차 검증이다.
교차 검증은 실제 성과가 있는 기간을 여러 개로 나누어 모델을 검증하는 것으로 교사 데이터가 적더라도 고정밀 검증을 할 수 있다.
기계 학습 모형의 성능 평가 입문!교차 검증
Prophet에서는 다음 코드로 간단하게 실행할 수 있습니다.
from fbprophet.diagnostics import cross_validation
from fbprophet.diagnostics import performance_metrics

df_cv = cross_validation(m, horizon='182 days')
df_p = performance_metrics(df_cv)
df_p
시간 서열 분석에 사용되는 주요 지표는 자동으로 계산되는 것이다.
위의 코드를 사용하여 만든 DataFrame이 여기에 있습니다.

이러면 평가하기 어려워 판다스forecast의 기술통계량으로 평가한다.
df_p.describe()

문외한이라면 describe()mae 같은 지표가 작아지면 정밀도가 높아진다
검증이 충분하다고 해도 그렇지 않은 것 같은데, 이 부근은 추가 학습이 필요하다는 인상을 준다.
너무 더워서 Prophet 분석의 질을 높이는 방법을 쉽게 썼어요. - Qiita.

시각화 모델


Prophet의 흥미로운 점은 모델을 시각화할 수 있다는 것이다.
예측에 사용되는 주기성을 도표에 표시할 수 있다.
m.plot(forecast)
m.plot_components(forecast)

또 교차 검증에 사용되는 지표도 도표로 만들 수 있다.
from fbprophet.plot import plot_cross_validation_metric
plot_cross_validation_metric(df_cv, metric='mae')

'이런 주기성으로 물어보는 거야'등 체감 부분은 마찰될 수 있고 눈에 띄는 부분도 있다.

실제 정밀도


예측에 생성된 데이터를 BigQuery로 내보내 예측 데이터와 실제 데이터를 비교합니다.
이 그림은 연-월별로 예측과 결과를 보여 주는 도표입니다.이외에도 일차 도표도 준비되어 있다.

매일 예측하는 상황에서 나는 매일의 증감을 정확하게 파악하기가 매우 어렵다고 생각한다.기능 발표 등 고유 활동의 유무로 10건 정도가 평상시부터 증감되기 때문이다.
또 비교 기간을 주, 월로 설정하면 건수 예측의 정밀도가 90% 정도여서 괜찮다고 판단할 수 있어 기준으로 충분히 작용했다.
현재 1%의 오차가 그렇게 큰 영향을 미치지 않기 때문에 이런 정밀도도 괜찮지만 상담 건수가 많아지면 정밀도를 높이기 위해 더 노력할 필요가 있다.

끝내다


시험적인 인상으로 교사 데이터를 준비하여 몇 개의 파라미터를 설정하면 예측 결과를 제시하는 것이 편리하다.정밀도도 상당히 기대된다.
그러나 정밀도를 높이기 위해 지표를 이해하고 파라미터를 조정하는 등 심오한 부분이 많은 것 같다.

좋은 웹페이지 즐겨찾기