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が欠損無し(正常)で、それ意外は、何らかな形で欠測があることを表している。
処理の途中に予期せぬエラーが生じたり、誤ったデータ解釈に導かれないために、こうした品質に関する情報を用いるなど、データの欠測や欠損にも対応しておくべきである。