반응형
< Facebook의 Prophet >
# 프롬펫(Prophet)은 Facebook에서 개발한 시계열 예측 라이브러리
# Prophet은 시계열 데이터(타임 시리즈 데이터)를 예측하기 위한 강력하고 사용하기 쉬운 도구를 제공한다. 특히 Prophet은 비즈니스 및 금융 데이터와 같은 일반적으로 사용되는 시계열 데이터에 대한 예측을 중점적으로 다룬다.
< AVOCADO 가격 예측 (Facebook Prophet ) >
STEP #0: 데이터셋
- 데이터는 미국의 아보카도 리테일 데이터 입니다. (2018년도 weekly 데이터)
- 아보카도 거래량과 가격이 나와 있습니다.
컬럼 설명 :
- Date - The date of the observation
- AveragePrice - the average price of a single avocado
- type - conventional or organic
- year - the year
- Region - the city or region of the observation
- Total Volume - Total number of avocados sold
- 4046 - Total number of avocados with PLU 4046 sold - PLU는 농산물 코드입니다
- 4225 - Total number of avocados with PLU 4225 sold
- 4770 - Total number of avocados with PLU 4770 sold
STEP #1: 데이터 준비
Prophet 라이브러리
- install : pip install prophet
- 위 에러 발생시 : conda install -c conda-forge prophet
- 레퍼런스 : https://research.fb.com/prophet-forecasting-at-scale/ https://facebook.github.io/prophet/docs/quick_start.html#python-api
# import libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
import seaborn as sns
from prophet import Prophet
# 데이터 불러오기 (구글 드라이브 연동)
from google.colab import drive
drive.mount('/content/drive')
Mounted at /content/drive
# avocado.csv 데이터 읽기
# 데이터 사전에 확인결과 첫컬럼은 필요없는 컬럼으로 확인되어, index_col=0로 불러오는 과정에서 삭제
df = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/ML2/data/avocado.csv', index_col=0)
STEP #2: EDA(Exploratory Data Analysis) : 탐색적 데이터 분석
df
# 데이터의 날짜가 뒤죽박죽 입니다. 날짜로 정렬하시오.
df = df.sort_values(['Date'], ascending=True)
df['Date'].nunique()
169
# 날짜별로 가격이 어떻게 변하는지 간단하게 확인하시오. (plot 이용)
# 동일한 날짜의 인덱스가 같으므로 인덱스를 우선 초기화
# prompt: 인덱스 초기화 해줘
df.reset_index(inplace=True)
df
# prompt: 첫번째 컬럼은 삭제해줘
df = df.iloc[:, 1:]
# 'region' 별로 데이터 몇개인지 시각화 하시오.
df.groupby('region').size()
region
Albany 338
Atlanta 338
BaltimoreWashington 338
Boise 338
Boston 338
BuffaloRochester 338
California 338
Charlotte 338
Chicago 338
CincinnatiDayton 338
Columbus 338
DallasFtWorth 338
Denver 338
Detroit 338
GrandRapids 338
GreatLakes 338
HarrisburgScranton 338
HartfordSpringfield 338
Houston 338
Indianapolis 338
Jacksonville 338
LasVegas 338
LosAngeles 338
Louisville 338
MiamiFtLauderdale 338
Midsouth 338
Nashville 338
NewOrleansMobile 338
NewYork 338
Northeast 338
NorthernNewEngland 338
Orlando 338
Philadelphia 338
PhoenixTucson 338
Pittsburgh 338
Plains 338
Portland 338
RaleighGreensboro 338
RichmondNorfolk 338
Roanoke 338
Sacramento 338
SanDiego 338
SanFrancisco 338
Seattle 338
SouthCarolina 338
SouthCentral 338
Southeast 338
Spokane 338
StLouis 338
Syracuse 338
Tampa 338
TotalUS 338
West 338
WestTexNewMexico 335
dtype: int64
# prompt: 'region'별로 데이터가 몇개인지 시각화 해줘
df.groupby('region').size().plot(kind='bar')
plt.title('Number of Avocado Records by Region')
plt.xlabel('Region')
plt.ylabel('Number of Records')
plt.show()
# 년도('year')별로 데이터가 몇건인지 확인하시오.
# prompt: 년도('year')별로 데이터가 몇건인지 확인해줘 시각화는 빼고
df['year'].value_counts()
year
2017 5722
2016 5616
2015 5615
2018 1296
Name: count, dtype: int64
< 프로펫 분석을 위해, 두개의 컬럼만 가져오시오. ('Date', 'AveragePrice') >
# 전체 컬럼 확인
df.head(1)
df.loc[: , 'Date' : 'AveragePrice' ]
avocado_prophet_df = df.loc[: , 'Date' : 'AveragePrice' ]
avocado_prophet_df
STEP 3: Prophet 을 이용한 예측 수행
# ds 와 y 로 컬럼명을 셋팅하시오.
avocado_prophet_df.columns = ['ds' , 'y']
avocado_prophet_df
< 프로펫 예측 하시오 >
# 1. 라이브러리를 변수로 만들고
prophet = Prophet()
# 2. 데이터를 학습시킨다.
prophet.fit(avocado_prophet_df)
INFO:prophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this.
INFO:prophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
DEBUG:cmdstanpy:input tempfile: /tmp/tmpf0uawuc9/_h7x0fzg.json
DEBUG:cmdstanpy:input tempfile: /tmp/tmpf0uawuc9/_j4ezup4.json
DEBUG:cmdstanpy:idx 0
DEBUG:cmdstanpy:running CmdStan, num_threads: None
DEBUG:cmdstanpy:CmdStan args: ['/usr/local/lib/python3.10/dist-packages/prophet/stan_model/prophet_model.bin', 'random', 'seed=97129', 'data', 'file=/tmp/tmpf0uawuc9/_h7x0fzg.json', 'init=/tmp/tmpf0uawuc9/_j4ezup4.json', 'output', 'file=/tmp/tmpf0uawuc9/prophet_modelgpdvzvo9/prophet_model-20240419031445.csv', 'method=optimize', 'algorithm=lbfgs', 'iter=10000']
03:14:45 - cmdstanpy - INFO - Chain [1] start processing
INFO:cmdstanpy:Chain [1] start processing
03:14:48 - cmdstanpy - INFO - Chain [1] done processing
INFO:cmdstanpy:Chain [1] done processing
# 365일치를 예측하시오.
# 3. 예측하고자 하는 기간을 정해서, 비어있는 데이터프레임을 만든다.
future = prophet.make_future_dataframe(periods=365, freq='D')
future.head()
future.tail()
# 4. 예측을 한다.
forecast = prophet.predict(future)
forecast
ㄴ 쭈욱 이어서 결과값이 나오는데 실측적인 예측값은 yhat 이다.
# 차트로 확인하시오.
# 코랩에서 plt.show()로 차트를 불러내면 두개가 중첩되서 불러오는 에러가 있어서 이미지를 저장하여 불러냄.
prophet.plot(forecast)
plt.savefig('chart1.jpg')
prophet.plot_components(forecast)
plt.savefig('chart2.jpg')
< PART 2 : region 이 west 인 아보카도의 가격을 예측하시오 >
# prompt: 'region'이 'west'인 데이터만 뽑아와서 avocado_df_sample = 저장해줘
avocado_df_sample = df.loc[df['region'] == 'West']
# prompt: 같은 변수명으로 해서 'Date' 와 'AveragePrice' 데이터만 저장해줘
avocado_df_sample = df[df['region'] == 'West'][['Date', 'AveragePrice']]
avocado_df_sample
avocado_df_sample.columns = ['ds' , 'y']
avocado_df_sample
# 깡통 라이브러리를 한번더 만들고
prophet = Prophet()
# 재학습
prophet.fit(avocado_df_sample)
INFO:prophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this.
INFO:prophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
DEBUG:cmdstanpy:input tempfile: /tmp/tmpf0uawuc9/xqexdcwt.json
DEBUG:cmdstanpy:input tempfile: /tmp/tmpf0uawuc9/bya5bfk_.json
DEBUG:cmdstanpy:idx 0
DEBUG:cmdstanpy:running CmdStan, num_threads: None
DEBUG:cmdstanpy:CmdStan args: ['/usr/local/lib/python3.10/dist-packages/prophet/stan_model/prophet_model.bin', 'random', 'seed=10296', 'data', 'file=/tmp/tmpf0uawuc9/xqexdcwt.json', 'init=/tmp/tmpf0uawuc9/bya5bfk_.json', 'output', 'file=/tmp/tmpf0uawuc9/prophet_modelvbws7_b3/prophet_model-20240419034719.csv', 'method=optimize', 'algorithm=lbfgs', 'iter=10000']
03:47:19 - cmdstanpy - INFO - Chain [1] start processing
INFO:cmdstanpy:Chain [1] start processing
03:47:19 - cmdstanpy - INFO - Chain [1] done processing
INFO:cmdstanpy:Chain [1] done processing
future2 = prophet.make_future_dataframe(periods=365, freq='D')
forecast2 = prophet.predict(future2)
prophet.plot(forecast2)
plt.savefig('chart2.jpg')
prophet.plot_components(forecast2)
plt.savefig('chart4.jpg')
다음 게시글로 한번더 prophet 실습 진행
728x90
반응형
'DEEP LEARNING > Deep Learning Library' 카테고리의 다른 글
DL(딥러닝) : Augmentation로 학습된 AI Transfer Learning & Fine Tunning (2) | 2024.05.01 |
---|---|
DL(딥러닝) : 데이터 증강 (Augmentation) 학습 (0) | 2024.04.30 |
DL(딥러닝) : CNN (Conv2D, MaxPooling2D, Flatten, Dense) 필터링으로 정확도 높이기 (0) | 2024.04.30 |
DL(딥러닝) : Tensflow의 Fashion-MNIST 활용(DNN) (2) (0) | 2024.04.30 |
DL(딥러닝) : Tensflow의 Fashion-MNIST 활용(DNN) (1) (0) | 2024.04.30 |