Pythonプログラミング(時系列データの予測)
(このページはこれから)
学習結果を使った予測
ひとつ前のページで作成したモデルと荷重データを用いて、「未知」のデータの予測を行ってみよう。 モデルは、2018年度のデータを使ってトレーニングしたが、 以下は2019年度のデータを読み込んで、 実測値と予測値を比較してプロットするコードの例である。
このコードでは、説明変数は、初回のみ実測値を与え、それ以降は、予測値を継ぎ足しながら、さらに先の予測まで行っている。 また、曜日と時刻については、単純な反復処理によって更新している。
# coding:utf-8
from keras import models
from keras.models import model_from_json
import numpy as np
import codecs
import csv
import datetime
import matplotlib.pyplot as plt
model=model_from_json(open("train.json").read())
model.load_weights("train.hdf5")
model.summary()
timestep=24
xdata=[]
with codecs.open('juyo_2019_tohoku.csv','r','Shift-JIS', 'ignore') as csvfile:
reader = csv.reader(csvfile, delimiter = ',')
cnt=0
for row in reader:
if cnt>1:
ymd=row[0].split('/')
h=int( row[1].split(':')[0] )
wd=datetime.datetime(int(ymd[0]),int(ymd[1]),int(ymd[2])).weekday()
p=float(row[2].strip())/1000.0
xdata.append([wd,h,p])
cnt=cnt+1
steps=[]
yvals=[]
ypvals=[]
first_time=True
t_start=4000
t_end=t_start+168
for i in range(t_start,t_end):
if first_time:
first_time=False
x = np.array(xdata[i:i+timestep])
else:
x[:,0] = np.roll(x[:,0],-1)
if x[-1,1]==23:
x[-1,0] = np.mod( x[-2,0] + 1, 7)
else:
x[-1,0] = x[-2,0]
x[:,1] = np.roll(x[:,1],-1)
x[-1,1] = np.mod( x[-2,1] + 1, 24)
x[:,2] = np.roll(x[:,2],-1)
x[-1,2] = ynext
xin= np.array([x], dtype=np.float32)
ynext = model.predict(xin)[0][0]
if (i+timestep<len(xdata)):
yr = xdata[i + timestep][2]
steps.append(i + timestep)
yvals.append(yr)
ypvals.append(ynext)
plt.plot(steps,yvals, color=(1.0,0,0.0), linewidth=1.0)
plt.plot(steps,ypvals, color=(0.0,1,1.0), linewidth=1.0)
plt.xlabel('TIME(HR)')
plt.ylabel('10^7 KWH')
plt.grid(True)
plt.show()
24時間分のデータを初期値として与え、その後1週間分の電力量の推移を予測した結果が以下である (赤が実測値、水色が予測結果)。
比較のため、説明変数として、曜日と時刻の情報は含めず、電力の時系列のみを使うモデルの場合の予測結果を以下に示す。 横軸が4125から4175の辺りは土曜日から日曜日に対応しており、週末ということで実際の電力量が下がっている一方で、モデルはその挙動を予測できていない。 一方、曜日情報を与えて学習した結果(上のグラフ)をみると、週末の下降傾向が再現されている。
練習:気象データの追加
各地の過去の気象データの時系列が、気象庁のウェブサイトで公開されている。 以下の手順に沿って、東北地方(例えば仙台市)の各時刻の気温データ(1年分)をCSVファイルとしてダウンロードしなさい。
- 過去の気象データ・ダウンロードのページにアクセス
- 地図の「宮城」をクリックし、「仙台」をにチェックを入れる
- を押して、データの種類は「時別値」、項目で「気温」にチェック
- を押して、「連続した期間で表示する」を選択。例えば、2018/1/1から2018/12/31まで、を設定
- 右側のを押すと、ダウンロードがはじまる
次に、電力消費予想モデルの入力情報として、各時刻の気温も加え、予測の精度を検討しなさい。
解説: 欠測データの扱い
気象庁からダウンロードできるCSVファイルは
ダウンロードした時刻:2019/11/20 16:21:43
,仙台,仙台,仙台
年月日時,気温(℃),気温(℃),気温(℃)
, ,品質情報,均質番号
2019/1/1,1:00,1.9,8,1
2019/1/1,2:00,2.2,8,1
2019/1/1,3:00,1.4,8,1
2019/1/1,4:00,1.4,8,1
2019/1/1,5:00,2.1,8,1
2019/1/1,6:00,1.4,8,1
...
のような形式になっており、観測値だけでなく、品質情報の情報が含まれている。 長期間にわたる観測の中で、センサーや通信回線の不調で、欠測データが生じることは決して珍しくない。 「品質情報」のカラムは8が欠損無し(正常)で、それ意外は、何らかな形で欠測があることを表している。
処理の途中に予期せぬエラーが生じたり、誤ったデータ解釈に導かれないために、こうした品質に関する情報を用いるなど、データの欠測や欠損にも対応しておくべきである。