더운 날들이 계속되기 때문에 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')
편차가 크지만, 무려 ~ 쿠 예측이되어 있다고합니다.
미래
참고 기사
고마워요!
→해설이 정중한 후, 적이 파동권을 쏘는 타이밍을 예측하는 것에 도전하고 있는 기사입니다.
→도시하는 부분에서 참고가 되었습니다.
Reference
이 문제에 관하여(더운 날들이 계속되기 때문에 gluonTS(LSTM)를 이용한 기온 예측을 시도한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/study_program/items/68d29dc4133da942424b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)