더운 날들이 계속되기 때문에 gluonTS(LSTM)를 이용한 기온 예측을 시도한다

이 더위는 언제까지 계속될까.



과거의 기온으로부터 미래의 예측을 할 수 없는가.
혼란을 얻기 위해 확률 적 시계열 모델링을위한 Gluon 툴킷 GluonTS을 사용해 보았습니다.

설치



이용하기 위해서는, mxnet,gluon 라이브러리가 필요합니다 (이 기사 를 참고했습니다).
anaconda 등으로 Python을 도입하면 pip에서 바로 설치할 수 있습니다.
$pip install -U pip
$pip install mxnet
$pip install gluonts

pip 자체가 낡으면, 이후의 소스 코드를 실행할 때에 에러가 나오는 경우가 있으므로, pip 자체의 업데이트를 해 두면 좋다고 생각합니다.

데이터 획득



기온 데이터를 csv 파일로 취득하고 싶기 때문에, 기상청의 과거 기상 데이터 다운로드 사이트 로부터 데이터를 취득하기로 했습니다.

예로서 사가현 사가시의 2018/8/14~2020/8/14의 2년분의 데이터를 다운로드했습니다.
연도 추이를 기억하기 위해서, 어쩐지 2년분의 데이터를 취득했습니다.
#jupyter notebook上で動作確認を実施
import pandas as pd
import datetime
%matplotlib inline

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

#まずは佐賀県の気温データの読み込み
tempera_data = pd.read_excel("saga_weather_data_20200815.xlsx") #※加工しやすいようにexcelファイルに修正
tempera_data["time"] = pd.to_datetime(tempera_data['年月日'])

현재 이런 느낌의 데이터입니다.


이 DataFrame의 "time", "평균 기온(℃)"열을 이용해 갑니다.
analysis_data = tempera_data[["time", '平均気温(℃)']]

어떤 데이터를 시각화해 보겠습니다.
plt.figure(figsize=(15, 5))
plt.plot(analysis_data["time"], analysis_data["平均気温(℃)"])
plt.grid(True)
plt.show()



최근의 7일분을 예측하기 위해, 학습:1일째~725일째, 평가:726일째~로 하기로 했습니다.
아래 그림에서 말하는 오렌지색 부분입니다.
tmp_time = np.arange(0, len(analysis_data))
analysis_data["re_time"] = tmp_time #時間情報を変換
plt.figure(figsize=(15, 5))

# 推論したい領域(網掛け部分)
plt.axvspan(725,len(tmp_time),color="orange")

plt.plot(tmp_time, analysis_data["平均気温(℃)"])
plt.xlabel("[day]")
plt.grid(True)
plt.show()



학습 및 평가



학습 및 평가 데이터를 정의합니다.
from gluonts.dataset.common import ListDataset

#make_train
predict_length = 7
training_data = ListDataset(
    [{"start": analysis_data["time"].values[0], "target": analysis_data.iloc[:len(tmp_time)-predict_length, 1]}],
    freq = "24H")

#make_test
test_data = ListDataset(
    [{"start": analysis_data["time"].values[0], "target": analysis_data.iloc[:len(tmp_time), 1]}],
    freq = "24H")

학습을 위해 estimator를 정의합니다.
파라미터는 참고 기사나 공식 튜토리얼 등을 참고로 설정했습니다.
from gluonts.model.simple_feedforward import SimpleFeedForwardEstimator
from gluonts.trainer import Trainer

estimator = SimpleFeedForwardEstimator(freq="24H",
                            context_length=20,
                            prediction_length=10,
                            trainer=Trainer(epochs=300,
                                            batch_size=32,
                                            learning_rate=0.001))

predictor = estimator.train(training_data=training_data)

어떤 추론 결과가 될지 가시화해 보겠습니다.
from gluonts.dataset.util import to_pandas

for test_entry, forecast in zip(test_data, predictor.predict(test_data)):
    plt.figure(figsize=(15, 5))
    to_pandas(test_entry).plot(linewidth=2)
    forecast.plot(color='g', prediction_intervals=[50.0, 90.0])

plt.legend(["observations", "median prediction", "90% confidence interval", "50% confidence interval"], 
          loc='lower left')
plt.grid(which='both')



편차가 크지만, 무려 ~ 쿠 예측이되어 있다고합니다.

미래


  • 좀더 정밀도 좋게 추론하기 위해, GluonTS의 사용법을 여러가지 시험해 보고 싶다(코멘트등으로 어드바이스 받을 수 있으면 기쁩니다).

  • 참고 기사



    고마워요!
  • MXNet과 LSTM에서 시계열 데이터 예측 - 입문에서 실천까지 - : htps : // cp p ぇ 아 r 마인 g. 이 m/m 응 t_gぅ온 ts/
    →해설이 정중한 후, 적이 파동권을 쏘는 타이밍을 예측하는 것에 도전하고 있는 기사입니다.
  • Gluon Quick Start Tutorial : h tps : // g ぅ 온 - ts. 음 t. 이오 / 에 mpぇ s / 바시 c_ 후레카 s 찐 g_ 쓰리 아 l / 쓰리 아 l. HTML
    →도시하는 부분에서 참고가 되었습니다.
  • 좋은 웹페이지 즐겨찾기