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の辺りは土曜日から日曜日に対応しており、週末ということで実際の電力量が下がっている一方で、モデルはその挙動を予測できていない。 一方、曜日情報を与えて学習した結果(上のグラフ)をみると、週末の下降傾向が再現されている。

icon-pc 練習:気象データの追加

各地の過去の気象データの時系列が、気象庁のウェブサイトで公開されている。 以下の手順に沿って、東北地方(例えば仙台市)の各時刻の気温データ(1年分)をCSVファイルとしてダウンロードしなさい。

次に、電力消費予想モデルの入力情報として、各時刻の気温も加え、予測の精度を検討しなさい。

icon-teacher 解説: 欠測データの扱い

ダウンロードファイル(CSVファイル)の形式

気象庁からダウンロードできる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が欠損無し(正常)で、それ意外は、何らかな形で欠測があることを表している。

処理の途中に予期せぬエラーが生じたり、誤ったデータ解釈に導かれないために、こうした品質に関する情報を用いるなど、データの欠測や欠損にも対応しておくべきである。