AI/Prophet

[Prophet] Prophet Tutorial #2 - Saturating Forecasts

zamezzz 2018. 6. 15. 00:17

 [Ai] Prophet Tutorial #2 Saturating Forecasts


오늘은 Prophet의 두 번째 튜토리얼은 진행해보겠습니다.


오늘의 주제는 Saturating Forecasts 입니다.

https://facebook.github.io/prophet/docs/saturating_forecasts.html



 Saturating Forecasts


ProphetLogistic growth를 사용하여 트렌드를 예측을 할 때, 그 예측치의 


최대 상한값과 하한값을 제어하고자 할 때 사용합니다.


ProphetLinear한 모델을 사용하기 때문에 이를 제어하지 않는다면 해당 카테고리의


최대 사이즈를 넘을 수 있기 때문입니다.


전체 시장 크기, 전체 인구 수 등 이미 정해진 최대치를 넘어설 수는 없겠죠.


예를 들어 최대치가 10인 어떠한 카테고리를 미래에 20이 된다고 예측한다면 잘못된


예측입니다. 마찬가지로 인구 수를 예측할 때 -값을 예측한다면 잘못이겠죠?



 Forecasting Growth


먼저 상한값을 제한하는 방법입니다.


데이터를 읽고 cap이라는 컬럼을 선언해줍니다. 이 cap이 상한 값을 설정해줍니다.


저한테 어떤 시계열 데이터가 있을까? 라고 생각을 해보았는데요.


지난번 저의 블로그 방문자 수 예측 프로그램에 예시로 적용해보겠습니다.



위의 결과에서 cap을 300으로 설정하여 값이 어떻게 보여지는지 한번 보겠습니다.


코드는 매우 간단합니다. 기존 코드에 아래 2줄의 코드만 추가하면 됩니다.


진한색 코드가 추가된 코드입니다.


df = pd.read_csv("./tubee.csv")

df['cap']=300


m = Prophet(growth='logistic')

m.fit(dif)


future=m.make_future_dataframe(periods=30)

future['cap']=300


나머지 코드는 이전 포스팅의 내용과 동일합니다.


결과는 다음과 같습니다. y=300에 상한선이 생겼습니다.


아마 이 이상의 값은 예측이 안될 것입니다. 




 Saturating Minimum


이번에는 하한값을 제어하는 방법입니다.


여기서는 floor라는 컬럼을 선언해줍니다.


cap이 상한값이라면 floor은 하한값이라고 생각하시면 됩니다.


floor를 50으로 선언해보고 결과 값을 보겠습니다.


코드는 cap과 마찬가지로 2줄만 추가되면 됩니다.


df = pd.read_csv("./tubee.csv")

df['cap']=300

df['floor']=50


m = Prophet(growth='logistic')

m.fit(dif)


future=m.make_future_dataframe(periods=30)

future['cap']=300

future['floor']=50


결과는 아래와 같습니다.


상한선과 하한선이 생겼네요


그리고 가장 중요한 점은 실제 6월 예측치에서 50이하의 값이 사라졌습니다.


모두 50이상의 값으로 조정이되어 예측이 되었네요.


실제 하한선을 정해두면 어느정도 도움이 될 것 같습니다.


위 모델의 경우 최소 0으로는 선언해두는 것이 안전하긴 할 것 같습니다.




logistic growth의 경우에 유용할 것 같은 cap과 floor에 대해 정리해보았습니다.


간단한 선언 하나로 예측값이 변화하는 것이 신기하네요.


제 모델에 맞게끔 정하려면 여러 실험을 해보고 시도를 해봐야 할 것 같습니다.


우선은 cap=500 / floor=0 으로 정하겠습니다.


위 값으로 지난번 모델과 비교하여 정확도가 얼마나 올랐나 보겠습니다.


Date

실제

예측_old

정확도_old

 예측_new

정확도_new 

2018-06-01

138

106.92

78%

120.41

87%

2018-06-02

91

71.83

79%

85.81

94%

2018-06-03

89

79.18

89%

93.66

95%

2018-06-04

239

96.25

41%

111.46

47%

2018-06-05

165

90.53

55%

106.25

64%

2018-06-06

128

101.84

80%

118.06

92%

2018-06-07

188

86.60

46%

103.31

55%

2018-06-08

173

80.90

47%

98.31

57%

2018-06-09

114

46.92

42%

64.81

57%


평균 정확도는 약 72%정도 입니다. 놀랍게도 지난번에 비해 10% 상승했습니다.


간단한 피쳐 하나로 이렇게나 높아지는게 신기합니다.


단순 우연인지는 좀 더 Prophet 튜토리얼을 진행하면서 지켜보기로 하겠습니다.


결론적으로는 이번 포스팅에서 좀 더 정확하게 변한 것 같습니다. 


그렇기 때문에 다음 포스팅 또한 매우 기대가 됩니다. 


그럼 이번 포스팅을 마치겠습니다. 감사합니다.

반응형