Skip to content

ClasCat® AI Research

クラスキャット – 生成 AI, AI エージェント, MCP

Menu
  • ホーム
    • ClassCat® AI Research ホーム
    • クラスキャット・ホーム
  • OpenAI API
    • OpenAI Python ライブラリ 1.x : 概要
    • OpenAI ブログ
      • GPT の紹介
      • GPT ストアの紹介
      • ChatGPT Team の紹介
    • OpenAI platform 1.x
      • Get Started : イントロダクション
      • Get Started : クイックスタート (Python)
      • Get Started : クイックスタート (Node.js)
      • Get Started : モデル
      • 機能 : 埋め込み
      • 機能 : 埋め込み (ユースケース)
      • ChatGPT : アクション – イントロダクション
      • ChatGPT : アクション – Getting started
      • ChatGPT : アクション – アクション認証
    • OpenAI ヘルプ : ChatGPT
      • ChatGPTとは何ですか?
      • ChatGPT は真実を語っていますか?
      • GPT の作成
      • GPT FAQ
      • GPT vs アシスタント
      • GPT ビルダー
    • OpenAI ヘルプ : ChatGPT > メモリ
      • FAQ
    • OpenAI ヘルプ : GPT ストア
      • 貴方の GPT をフィーチャーする
    • OpenAI Python ライブラリ 0.27 : 概要
    • OpenAI platform
      • Get Started : イントロダクション
      • Get Started : クイックスタート
      • Get Started : モデル
      • ガイド : GPT モデル
      • ガイド : 画像生成 (DALL·E)
      • ガイド : GPT-3.5 Turbo 対応 微調整
      • ガイド : 微調整 1.イントロダクション
      • ガイド : 微調整 2. データセットの準備 / ケーススタディ
      • ガイド : 埋め込み
      • ガイド : 音声テキスト変換
      • ガイド : モデレーション
      • ChatGPT プラグイン : イントロダクション
    • OpenAI Cookbook
      • 概要
      • API 使用方法 : レート制限の操作
      • API 使用方法 : tiktoken でトークンを数える方法
      • GPT : ChatGPT モデルへの入力をフォーマットする方法
      • GPT : 補完をストリームする方法
      • GPT : 大規模言語モデルを扱う方法
      • 埋め込み : 埋め込みの取得
      • GPT-3 の微調整 : 分類サンプルの微調整
      • DALL-E : DALL·E で 画像を生成して編集する方法
      • DALL·E と Segment Anything で動的マスクを作成する方法
      • Whisper プロンプティング・ガイド
  • Gemini API
    • Tutorials : クイックスタート with Python (1) テキスト-to-テキスト生成
    • (2) マルチモーダル入力 / 日本語チャット
    • (3) 埋め込みの使用
    • (4) 高度なユースケース
    • クイックスタート with Node.js
    • クイックスタート with Dart or Flutter (1) 日本語動作確認
    • Gemma
      • 概要 (README)
      • Tutorials : サンプリング
      • Tutorials : KerasNLP による Getting Started
  • Keras 3
    • 新しいマルチバックエンド Keras
    • Keras 3 について
    • Getting Started : エンジニアのための Keras 入門
    • Google Colab 上のインストールと Stable Diffusion デモ
    • コンピュータビジョン – ゼロからの画像分類
    • コンピュータビジョン – 単純な MNIST convnet
    • コンピュータビジョン – EfficientNet を使用した微調整による画像分類
    • コンピュータビジョン – Vision Transformer による画像分類
    • コンピュータビジョン – 最新の MLPモデルによる画像分類
    • コンピュータビジョン – コンパクトな畳込み Transformer
    • Keras Core
      • Keras Core 0.1
        • 新しいマルチバックエンド Keras (README)
        • Keras for TensorFlow, JAX, & PyTorch
        • 開発者ガイド : Getting started with Keras Core
        • 開発者ガイド : 関数型 API
        • 開発者ガイド : シーケンシャル・モデル
        • 開発者ガイド : サブクラス化で新しい層とモデルを作成する
        • 開発者ガイド : 独自のコールバックを書く
      • Keras Core 0.1.1 & 0.1.2 : リリースノート
      • 開発者ガイド
      • Code examples
      • Keras Stable Diffusion
        • 概要
        • 基本的な使い方 (テキスト-to-画像 / 画像-to-画像変換)
        • 混合精度のパフォーマンス
        • インペインティングの簡易アプリケーション
        • (参考) KerasCV – Stable Diffusion を使用した高性能画像生成
  • TensorFlow
    • TF 2 : 初級チュートリアル
    • TF 2 : 上級チュートリアル
    • TF 2 : ガイド
    • TF 1 : チュートリアル
    • TF 1 : ガイド
  • その他
    • 🦜️🔗 LangChain ドキュメント / ユースケース
    • Stable Diffusion WebUI
      • Google Colab で Stable Diffusion WebUI 入門
      • HuggingFace モデル / VAE の導入
      • LoRA の利用
    • Diffusion Models / 拡散モデル
  • クラスキャット
    • 会社案内
    • お問合せ
    • Facebook
    • ClassCat® Blog
Menu

TensorFlow 2.0 : 上級 Tutorials : 構造化データ :- 時系列予報

Posted on 11/20/2019 by Sales Information

TensorFlow 2.0 : 上級 Tutorials : 構造化データ :- 時系列予報 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/20/2019

* 本ページは、TensorFlow org サイトの TF 2.0 – Advanced Tutorials – Structured data の以下のページを翻訳した上で
適宜、補足説明したものです:

  • Time series forecasting

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

★ 無料セミナー開催中 ★ クラスキャット主催 人工知能 & ビジネス Web セミナー

人工知能とビジネスをテーマにウェビナー (WEB セミナー) を定期的に開催しています。スケジュールは弊社 公式 Web サイト でご確認頂けます。
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
  • Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。

◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/
Facebook: https://www.facebook.com/ClassCatJP/

 

構造化データ :- 時系列予報

このチュートリアルはリカレント・ニューラルネットワーク (RNN) を使用する時系列予報 (= forecasting) へのイントロダクションです。これは 2 つのパートでカバーされます : 最初に、単量時系列を予報して、それから多変量時系列を予報します。

from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf

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

mpl.rcParams['figure.figsize'] = (8, 6)
mpl.rcParams['axes.grid'] = False

 

天気データセット

このチュートリアルは Max-Planck-Institute for Biogeochemistry (生物地球化学) により記録された 天気時系列データセット を使用します。

このデータセットは、気温、気圧と湿度のような 14 の異なる特徴を含みます。これらは 2003 年に始まり、10 分毎に収集されました。効率のために、2009 と 2016 の間に収集されたデータだけを使用します。データセットのこのセクションは François Chollet により彼の書籍 Deep Learning with Python のために準備されました。

zip_path = tf.keras.utils.get_file(
    origin='https://storage.googleapis.com/tensorflow/tf-keras-datasets/jena_climate_2009_2016.csv.zip',
    fname='jena_climate_2009_2016.csv.zip',
    extract=True)
csv_path, _ = os.path.splitext(zip_path)
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/jena_climate_2009_2016.csv.zip
13574144/13568290 [==============================] - 0s 0us/step
df = pd.read_csv(csv_path)

データを少し見てみましょう。

df.head()

Date Time p (mbar) T (degC) Tpot (K) Tdew (degC) rh (%) VPmax (mbar) VPact (mbar) VPdef (mbar) sh (g/kg) H2OC (mmol/mol) rho (g/m**3) wv (m/s) max. wv (m/s) wd (deg)
0 01.01.2009 00:10:00 996.52 -8.02 265.40 -8.90 93.3 3.33 3.11 0.22 1.94 3.12 1307.75 1.03 1.75 152.3
1 01.01.2009 00:20:00 996.57 -8.41 265.01 -9.28 93.4 3.23 3.02 0.21 1.89 3.03 1309.80 0.72 1.50 136.1
2 01.01.2009 00:30:00 996.53 -8.51 264.91 -9.31 93.9 3.21 3.01 0.20 1.88 3.02 1310.24 0.19 0.63 171.6
3 01.01.2009 00:40:00 996.51 -8.31 265.12 -9.07 94.2 3.26 3.07 0.19 1.92 3.08 1309.19 0.34 0.50 198.0
4 01.01.2009 00:50:00 996.51 -8.27 265.15 -9.04 94.1 3.27 3.08 0.19 1.92 3.09 1309.00 0.32 0.63 214.3

上で見れるように、観測は 10 分毎に記録されます。これは、単一の時間 (= hour) について、6 観測を持つことを意味します。同様に、単一の日 (= day) は 144 (6×24) 観測を含みます。

特定の時間が与えられたとき、未来の 6 時間で気温を予測することを望むとしましょう。この予測を行なうために、観測の 5 日を使用することを選択します。こうして、モデルを訓練するために最後の 720(5×144) 観測を含むウィンドウを作成します。このデータセットを実験するために良いものにする、多くのそのような構成が可能です。

下の関数はその上で訓練するモデルのために上で説明された時間のウィンドウを返します。パラメータ history_size は情報の過去のウィンドウのサイズです。target_size は未来のどのくらい離れてモデルが予測することを学習する必要があるかです。target_size は予測される必要があるラベルです。

def univariate_data(dataset, start_index, end_index, history_size, target_size):
  data = []
  labels = []

  start_index = start_index + history_size
  if end_index is None:
    end_index = len(dataset) - target_size

  for i in range(start_index, end_index):
    indices = range(i-history_size, i)
    # Reshape data from (history_size,) to (history_size, 1)
    data.append(np.reshape(dataset[indices], (history_size, 1)))
    labels.append(dataset[i+target_size])
  return np.array(data), np.array(labels)

次のチュートリアルの両者で、データの最初の 300,000 行は訓練データセットで、残りの検証データセットがあります。これは訓練データの ~2100 日分になります。

TRAIN_SPLIT = 300000

再現性を保証するために seed を設定します。

tf.random.set_seed(13)

 

パート 1 : 単変量時系列を予報する

最初に、単一の特徴 (temperature) だけを使用してモデルを訓練し、そしてそれを未来のその値のための予測を行なうために使用します。

最初にデータセットから temperature だけを抽出しましょう。

uni_data = df['T (degC)']
uni_data.index = df['Date Time']
uni_data.head()
Date Time
01.01.2009 00:10:00   -8.02
01.01.2009 00:20:00   -8.41
01.01.2009 00:30:00   -8.51
01.01.2009 00:40:00   -8.31
01.01.2009 00:50:00   -8.27
Name: T (degC), dtype: float64

このデータが時間に渡りどのように見えるか観察しましょう。

uni_data.plot(subplots=True)
array([],
      dtype=object)

uni_data = uni_data.values

ニューラルネットワークを訓練する前に特徴を正規化することは重要です。それを行なう一般的な方法は各特徴の平均を引いてそして標準偏差で除算することです。

★ Note: 平均と標準偏差は訓練データだけを使用して計算されるべきです。

uni_train_mean = uni_data[:TRAIN_SPLIT].mean()
uni_train_std = uni_data[:TRAIN_SPLIT].std()

データを正規化しましょう。

uni_data = (uni_data-uni_train_mean)/uni_train_std

今は単変量モデルのためのデータを作成しましょう。パート 1 については、モデルは最後の 20 の記録された気温観測が与えられて、そして次の時間ステップでの気温を予測することを学習する必要があります。

univariate_past_history = 20
univariate_future_target = 0

x_train_uni, y_train_uni = univariate_data(uni_data, 0, TRAIN_SPLIT,
                                           univariate_past_history,
                                           univariate_future_target)
x_val_uni, y_val_uni = univariate_data(uni_data, TRAIN_SPLIT, None,
                                       univariate_past_history,
                                       univariate_future_target)

これが univariate_data 関数が返すものです。

print ('Single window of past history')
print (x_train_uni[0])
print ('\n Target temperature to predict')
print (y_train_uni[0])
Single window of past history
[[-1.99766294]
 [-2.04281897]
 [-2.05439744]
 [-2.0312405 ]
 [-2.02660912]
 [-2.00113649]
 [-1.95134907]
 [-1.95134907]
 [-1.98492663]
 [-2.04513467]
 [-2.08334362]
 [-2.09723778]
 [-2.09376424]
 [-2.09144854]
 [-2.07176515]
 [-2.07176515]
 [-2.07639653]
 [-2.08913285]
 [-2.09260639]
 [-2.10418486]]

 Target temperature to predict
-2.1041848598100876

データが作成された今、単一のサンプルを見てみましょう。ネットワークに与えられる情報は青色で与えられ、そしてそれは赤い × 印の値を予測しなければなりません。

def create_time_steps(length):
  time_steps = []
  for i in range(-length, 0, 1):
    time_steps.append(i)
  return time_steps
def show_plot(plot_data, delta, title):
  labels = ['History', 'True Future', 'Model Prediction']
  marker = ['.-', 'rx', 'go']
  time_steps = create_time_steps(plot_data[0].shape[0])
  if delta:
    future = delta
  else:
    future = 0

  plt.title(title)
  for i, x in enumerate(plot_data):
    if i:
      plt.plot(future, plot_data[i], marker[i], markersize=10,
               label=labels[i])
    else:
      plt.plot(time_steps, plot_data[i].flatten(), marker[i], label=labels[i])
  plt.legend()
  plt.xlim([time_steps[0], (future+5)*2])
  plt.xlabel('Time-Step')
  return plt
show_plot([x_train_uni[0], y_train_uni[0]], 0, 'Sample Example')
<module 'matplotlib.pyplot' from '/home/kbuilder/.local/lib/python3.6/site-packages/matplotlib/pyplot.py'>

 

ベースライン

モデルを訓練することに進む前に、最初に単純なベースラインを設定しましょう。入力ポイントが与えられたとき、baseline メソッドは総ての履歴を見てそして次のポイントを最後の 20 観測の平均として予測します。

def baseline(history):
  return np.mean(history)
show_plot([x_train_uni[0], y_train_uni[0], baseline(x_train_uni[0])], 0,
           'Baseline Prediction Example')
<module 'matplotlib.pyplot' from '/home/kbuilder/.local/lib/python3.6/site-packages/matplotlib/pyplot.py'>

リカレント・ニューラルネットワークを使用してこのベースラインに打ち勝てるか見ましょう。

 

リカレント・ニューラルネットワーク

リカレント・ニューラルネットワーク (RNN) は時系列データに適切なニューラルネットワークのタイプです。RNN は、そこまでに見た情報を要約した内部状態を保持しながら、時系列をステップ毎に処理します。より詳細については、RNN チュートリアル を読んでください。このチュートリアルでは、Long Short Term Memory (LSTM) と呼ばれる特殊な RNN 層を使用します。

今はデータセットを shuffle, batch と cache するために tf.data を使用しましょう。

BATCH_SIZE = 256
BUFFER_SIZE = 10000

train_univariate = tf.data.Dataset.from_tensor_slices((x_train_uni, y_train_uni))
train_univariate = train_univariate.cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE).repeat()

val_univariate = tf.data.Dataset.from_tensor_slices((x_val_uni, y_val_uni))
val_univariate = val_univariate.batch(BATCH_SIZE).repeat()

次の可視化はデータがバッチ化の後でどのように表わされるかを理解する助けになるはずです。

LSTM はそれが与えられるデータの入力 shape を要求することを見るでしょう。

simple_lstm_model = tf.keras.models.Sequential([
    tf.keras.layers.LSTM(8, input_shape=x_train_uni.shape[-2:]),
    tf.keras.layers.Dense(1)
])

simple_lstm_model.compile(optimizer='adam', loss='mae')

モデルの出力を確認するために、サンプル予測を作成しましょう。

for x, y in val_univariate.take(1):
    print(simple_lstm_model.predict(x).shape)
(256, 1)

今はモデルを訓練しましょう。巨大なサイズのデータセットであるため、時間を節約するために、通常成されるような完全な訓練データの代わりに、各エポックは 200 ステップの間だけ実行します。

EVALUATION_INTERVAL = 200
EPOCHS = 10

simple_lstm_model.fit(train_univariate, epochs=EPOCHS,
                      steps_per_epoch=EVALUATION_INTERVAL,
                      validation_data=val_univariate, validation_steps=50)
Train for 200 steps, validate for 50 steps
Epoch 1/10
200/200 [==============================] - 3s 16ms/step - loss: 0.4075 - val_loss: 0.1351
Epoch 2/10
200/200 [==============================] - 1s 5ms/step - loss: 0.1118 - val_loss: 0.0360
Epoch 3/10
200/200 [==============================] - 1s 5ms/step - loss: 0.0490 - val_loss: 0.0289
Epoch 4/10
200/200 [==============================] - 1s 5ms/step - loss: 0.0444 - val_loss: 0.0257
Epoch 5/10
200/200 [==============================] - 1s 5ms/step - loss: 0.0299 - val_loss: 0.0235
Epoch 6/10
200/200 [==============================] - 1s 5ms/step - loss: 0.0317 - val_loss: 0.0223
Epoch 7/10
200/200 [==============================] - 1s 5ms/step - loss: 0.0287 - val_loss: 0.0206
Epoch 8/10
200/200 [==============================] - 1s 5ms/step - loss: 0.0263 - val_loss: 0.0196
Epoch 9/10
200/200 [==============================] - 1s 5ms/step - loss: 0.0254 - val_loss: 0.0182
Epoch 10/10
200/200 [==============================] - 1s 5ms/step - loss: 0.0227 - val_loss: 0.0173

<tensorflow.python.keras.callbacks.History at 0x7fc322e8b908>

 
単純な LSTM モデルを使用して予測する

単純な LSTM を訓練した今、試して 2, 3 の予測を行なってみましょう。

for x, y in val_univariate.take(3):
  plot = show_plot([x[0].numpy(), y[0].numpy(),
                    simple_lstm_model.predict(x)[0]], 0, 'Simple LSTM model')
  plot.show()

これはベースラインよりも良いようです。基本を見た今、パート 2 に移りましょう、そこでは多変量時系列で作業します。

 

パート 2 : 多変量時系列を予報する

元のデータセットは 14 の特徴を含みます。単純化のために、このセクションは元の 14 の 3 つだけを考えます。使用される特徴は気温 (= air temperature)、気圧 (= atmospheric pressure) と空気密度 (= air density) です。

より多くの特徴を使用するには、このリストにそれらの名前を追加します。

features_considered = ['p (mbar)', 'T (degC)', 'rho (g/m**3)']
features = df[features_considered]
features.index = df['Date Time']
features.head()

p (mbar) T (degC) rho (g/m**3)
Date Time
01.01.2009 00:10:00 996.52 -8.02 1307.75
01.01.2009 00:20:00 996.57 -8.41 1309.80
01.01.2009 00:30:00 996.53 -8.51 1310.24
01.01.2009 00:40:00 996.51 -8.31 1309.19
01.01.2009 00:50:00 996.51 -8.27 1309.00

これらの特徴の各々が時間に渡りどのように変換するか見てみましょう。

features.plot(subplots=True)
array([,
       ,
       ],
      dtype=object)

言及されたように、最初のステップは訓練データの平均と標準偏差を使用してデータセットを正規化することです。

dataset = features.values
data_mean = dataset[:TRAIN_SPLIT].mean(axis=0)
data_std = dataset[:TRAIN_SPLIT].std(axis=0)

dataset = (dataset-data_mean)/data_std

 

シングルステップ・モデル

シングルステップ・セットアップでは、モデルは提供される幾つかの履歴をもとに未来の単一ポイントを予測することを学習します。

下の関数は下と (訳注: 原文ママ) 同じ windowing タスクを遂行しますが、けれども、ここではそれは与えられたステップサイズに基づいて過去の観測をサンプリングします。

def multivariate_data(dataset, target, start_index, end_index, history_size,
                      target_size, step, single_step=False):
  data = []
  labels = []

  start_index = start_index + history_size
  if end_index is None:
    end_index = len(dataset) - target_size

  for i in range(start_index, end_index):
    indices = range(i-history_size, i, step)
    data.append(dataset[indices])

    if single_step:
      labels.append(target[i+target_size])
    else:
      labels.append(target[i:i+target_size])

  return np.array(data), np.array(labels)

このチュートリアルでは、ネットワークは最後の 5 日間からデータを見せられます、i.e. 毎時サンプリングされる 720 観測です。サンプリングは 1 時間毎に行なわれます、何故ならば 60 分内に極端な変更は想定されないためです。こうして、120 観測が最後の 5 日間の履歴を表します。シングルステップ予測モデルについては、データポイントのためのラベルは未来に向けた気温 12 時間です。このためのラベルを作成するため、72(12*6) 観測後の気温が使用されます。

past_history = 720
future_target = 72
STEP = 6

x_train_single, y_train_single = multivariate_data(dataset, dataset[:, 1], 0,
                                                   TRAIN_SPLIT, past_history,
                                                   future_target, STEP,
                                                   single_step=True)
x_val_single, y_val_single = multivariate_data(dataset, dataset[:, 1],
                                               TRAIN_SPLIT, None, past_history,
                                               future_target, STEP,
                                               single_step=True)

単一データポイントを見ましょう。

print ('Single window of past history : {}'.format(x_train_single[0].shape))
Single window of past history : (120, 3)
train_data_single = tf.data.Dataset.from_tensor_slices((x_train_single, y_train_single))
train_data_single = train_data_single.cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE).repeat()

val_data_single = tf.data.Dataset.from_tensor_slices((x_val_single, y_val_single))
val_data_single = val_data_single.batch(BATCH_SIZE).repeat()
single_step_model = tf.keras.models.Sequential()
single_step_model.add(tf.keras.layers.LSTM(32,
                                           input_shape=x_train_single.shape[-2:]))
single_step_model.add(tf.keras.layers.Dense(1))

single_step_model.compile(optimizer=tf.keras.optimizers.RMSprop(), loss='mae')

サンプル予測を確認しましょう。

for x, y in val_data_single.take(1):
  print(single_step_model.predict(x).shape)
(256, 1)
single_step_history = single_step_model.fit(train_data_single, epochs=EPOCHS,
                                            steps_per_epoch=EVALUATION_INTERVAL,
                                            validation_data=val_data_single,
                                            validation_steps=50)
Train for 200 steps, validate for 50 steps
Epoch 1/10
200/200 [==============================] - 5s 25ms/step - loss: 0.3090 - val_loss: 0.2646
Epoch 2/10
200/200 [==============================] - 2s 11ms/step - loss: 0.2625 - val_loss: 0.2428
Epoch 3/10
200/200 [==============================] - 2s 11ms/step - loss: 0.2613 - val_loss: 0.2457
Epoch 4/10
200/200 [==============================] - 2s 11ms/step - loss: 0.2569 - val_loss: 0.2444
Epoch 5/10
200/200 [==============================] - 2s 11ms/step - loss: 0.2263 - val_loss: 0.2357
Epoch 6/10
200/200 [==============================] - 2s 11ms/step - loss: 0.2411 - val_loss: 0.2696
Epoch 7/10
200/200 [==============================] - 2s 10ms/step - loss: 0.2414 - val_loss: 0.2564
Epoch 8/10
200/200 [==============================] - 2s 10ms/step - loss: 0.2407 - val_loss: 0.2414
Epoch 9/10
200/200 [==============================] - 2s 10ms/step - loss: 0.2447 - val_loss: 0.2459
Epoch 10/10
200/200 [==============================] - 2s 10ms/step - loss: 0.2381 - val_loss: 0.2499
def plot_train_history(history, title):
  loss = history.history['loss']
  val_loss = history.history['val_loss']

  epochs = range(len(loss))

  plt.figure()

  plt.plot(epochs, loss, 'b', label='Training loss')
  plt.plot(epochs, val_loss, 'r', label='Validation loss')
  plt.title(title)
  plt.legend()

  plt.show()
plot_train_history(single_step_history,
                   'Single Step Training and validation loss')

 
シングルステップ未来を予測する

モデルが訓練された今、幾つかのサンプル予測を行ないましょう。モデルは (120 データポイントの) 毎時サンプリングされた過去 5 日間に渡る 3 つの特徴の履歴が与えられます、ゴールは気温を予測することですので、プロットは過去の気温を表示するだけです。予測は未来に向けて 1 日間行なわれます (履歴と予測の隔たりゆえに)。

for x, y in val_data_single.take(3):
  plot = show_plot([x[0][:, 1].numpy(), y[0].numpy(),
                    single_step_model.predict(x)[0]], 12,
                   'Single Step Prediction')
  plot.show()

 

マルチステップ・モデル

マルチステップ予測モデルでは、過去の履歴が与えられたとき、モデルは未来の値の範囲を予測することを学習する必要があります。こうして、単一の特徴ポイントだけが予測されるシングルステップ・モデルと違い、マルチステップ・モデルは未来のシークエンスを予測します。

マルチステップ・モデルについて、訓練データは再度毎時サンプリングされた過去 5 日間に渡る記録から成ります。けれども、ここでは、モデルは次の 12 時間について気温を予測することを学習する必要があります。観測は 10 分毎に取られますので、出力は 72 予測です。このタスクのために、データセットはそれに応じて準備される必要がありますので、最初のステップはそれを単に再度作成することですが、異なるターゲット・ウィンドウでです。

future_target = 72
x_train_multi, y_train_multi = multivariate_data(dataset, dataset[:, 1], 0,
                                                 TRAIN_SPLIT, past_history,
                                                 future_target, STEP)
x_val_multi, y_val_multi = multivariate_data(dataset, dataset[:, 1],
                                             TRAIN_SPLIT, None, past_history,
                                             future_target, STEP)

サンプル・データポイントを確認しましょう。

print ('Single window of past history : {}'.format(x_train_multi[0].shape))
print ('\n Target temperature to predict : {}'.format(y_train_multi[0].shape))
Single window of past history : (120, 3)

 Target temperature to predict : (72,)
train_data_multi = tf.data.Dataset.from_tensor_slices((x_train_multi, y_train_multi))
train_data_multi = train_data_multi.cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE).repeat()

val_data_multi = tf.data.Dataset.from_tensor_slices((x_val_multi, y_val_multi))
val_data_multi = val_data_multi.batch(BATCH_SIZE).repeat()

サンプル・データポイントをプロットする。

def multi_step_plot(history, true_future, prediction):
  plt.figure(figsize=(12, 6))
  num_in = create_time_steps(len(history))
  num_out = len(true_future)

  plt.plot(num_in, np.array(history[:, 1]), label='History')
  plt.plot(np.arange(num_out)/STEP, np.array(true_future), 'bo',
           label='True Future')
  if prediction.any():
    plt.plot(np.arange(num_out)/STEP, np.array(prediction), 'ro',
             label='Predicted Future')
  plt.legend(loc='upper left')
  plt.show()

このプロットと続く同様のプロットでは、履歴と未来データは毎時サンプリングされます。

for x, y in train_data_multi.take(1):
  multi_step_
plot(x[0], y[0], np.array([0]))

ここでのタスクは前のタスクよりも少しだけ複雑ですので、今はモデルは 2 つの LSTM 層から成ります。最後に、72 予測が行なわれますので、dense 層は 72 予測を出力します。

multi_step_model = tf.keras.models.Sequential()
multi_step_model.add(tf.keras.layers.LSTM(32,
                                          return_sequences=True,
                                          input_shape=x_train_multi.shape[-2:]))
multi_step_model.add(tf.keras.layers.LSTM(16, activation='relu'))
multi_step_model.add(tf.keras.layers.Dense(72))

multi_step_model.compile(optimizer=tf.keras.optimizers.RMSprop(clipvalue=1.0), loss='mae')

モデルがそれが訓練される前にどのように予測するかを見ましょう。

for x, y in val_data_multi.take(1):
  print (multi_step_model.predict(x).shape)
(256, 72)
multi_step_history = multi_step_model.fit(train_data_multi, epochs=EPOCHS,
                                          steps_per_epoch=EVALUATION_INTERVAL,
                                          validation_data=val_data_multi,
                                          validation_steps=50)
Train for 200 steps, validate for 50 steps
Epoch 1/10
200/200 [==============================] - 26s 132ms/step - loss: 0.4964 - val_loss: 0.3075
Epoch 2/10
200/200 [==============================] - 22s 112ms/step - loss: 0.3469 - val_loss: 0.2830
Epoch 3/10
200/200 [==============================] - 22s 111ms/step - loss: 0.3313 - val_loss: 0.2461
Epoch 4/10
200/200 [==============================] - 22s 111ms/step - loss: 0.2431 - val_loss: 0.2052
Epoch 5/10
200/200 [==============================] - 23s 114ms/step - loss: 0.1973 - val_loss: 0.1946
Epoch 6/10
200/200 [==============================] - 22s 112ms/step - loss: 0.2060 - val_loss: 0.2099
Epoch 7/10
200/200 [==============================] - 22s 109ms/step - loss: 0.1978 - val_loss: 0.2066
Epoch 8/10
200/200 [==============================] - 22s 109ms/step - loss: 0.1965 - val_loss: 0.2015
Epoch 9/10
200/200 [==============================] - 22s 109ms/step - loss: 0.1978 - val_loss: 0.1859
Epoch 10/10
200/200 [==============================] - 22s 110ms/step - loss: 0.1901 - val_loss: 0.1821
plot_train_history(multi_step_history, 'Multi-Step Training and validation loss')

 
マルチステップ未来を予測する

今は貴方のネットワークが未来を予測することをどの程度上手く学習したかを見ましょう。

for x, y in val_data_multi.take(3):
  multi_step_plot(x[0], y[0], multi_step_model.predict(x)[0])

 

Next steps

このチュートリアルは RNN を使用する時系列予報への簡単なイントロダクションです。今ではストックマーケットを予測することを試して億万長者になるかもしれません。

加えて、(uni/multivariate_data 関数の代わりに) データを生成するための generator も書くかもしれません、それはよりメモリ効率的です。この time series windowing ガイドを確認してそれをこのチュートリアルで使用することもできます。

更なる理解のために、Hands-on Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition の 15 章と Deep Learning with Python の 6 章を読んでも良いです。

 

以上



クラスキャット

最近の投稿

  • LangGraph Platform : 概要
  • LangGraph : Prebuilt エージェント : ユーザインターフェイス
  • LangGraph : Prebuilt エージェント : 配備
  • LangGraph : Prebuilt エージェント : マルチエージェント
  • LangGraph : Prebuilt エージェント : メモリ

タグ

AutoGen (13) ClassCat Press Release (20) ClassCat TF/ONNX Hub (11) DGL 0.5 (14) Eager Execution (7) Edward (17) FLUX.1 (16) Gemini (20) HuggingFace Transformers 4.5 (10) HuggingFace Transformers 4.6 (7) HuggingFace Transformers 4.29 (9) Keras 2 Examples (98) Keras 2 Guide (16) Keras 3 (10) Keras Release Note (17) Kubeflow 1.0 (10) LangChain (45) LangGraph (19) MediaPipe 0.8 (11) Model Context Protocol (16) NNI 1.5 (16) OpenAI Agents SDK (8) OpenAI Cookbook (13) OpenAI platform (10) OpenAI platform 1.x (10) OpenAI ヘルプ (8) TensorFlow 2.0 Advanced Tutorials (33) TensorFlow 2.0 Advanced Tutorials (Alpha) (15) TensorFlow 2.0 Advanced Tutorials (Beta) (16) TensorFlow 2.0 Guide (10) TensorFlow 2.0 Guide (Alpha) (16) TensorFlow 2.0 Guide (Beta) (9) TensorFlow 2.0 Release Note (12) TensorFlow 2.0 Tutorials (20) TensorFlow 2.0 Tutorials (Alpha) (14) TensorFlow 2.0 Tutorials (Beta) (12) TensorFlow 2.4 Guide (24) TensorFlow Deploy (8) TensorFlow Get Started (7) TensorFlow Graphics (7) TensorFlow Probability (9) TensorFlow Programmer's Guide (22) TensorFlow Release Note (18) TensorFlow Tutorials (33) TF-Agents 0.4 (11)
2019年11月
月 火 水 木 金 土 日
 123
45678910
11121314151617
18192021222324
252627282930  
« 10月   12月 »
© 2025 ClasCat® AI Research | Powered by Minimalist Blog WordPress Theme