はじめに
この記事では、Granite Time Series をwatsonx.ai 上のJupyter Notebook で使うためのハンズオンです。
使用するデータは、以下です。ダウンロードしてローカルに置いておくとスムーズです。
データ:https://raw.githubusercontent.com/zhouhaoyi/ETDataset/main/ETT-small/ETTh1.csv
watsonx とは
業務にAI を組み込むことにより、企業のさまざまな業務領域でAI のインパクトを拡大、加速するためのプラットフォームおよびAI アシスタントソリューション(公式より)
https://www.ibm.com/jp-ja/products/watsonx
watsonx.ai とは
従来の機械学習と、基盤モデルを活用した新しい生成AI 機能の両方を学習・検証・調整・導入できるAI 構築のための次世代の企業向けスタジオ(公式より)
https://www.ibm.com/jp-ja/products/watsonx-ai
Granite Time Series とは
IBM が提供するGranite モデルシリーズのひとつで、時系列データに対応した基盤モデルです。時系列基盤モデルは言語に特化した大規模言語モデルと同様に、膨大な時系列データを用いて事前学習されています。従来の時系列予測モデルとは異なり、特定のタスクに特化せず幅広い時系列予測タスクに対応可能となっており、さらに少ないデータからでも精度の高い予測が可能となっています。
Granite 時系列データ分析モデルは他社と比べて軽量なモデルとなっています。
Granite モデルはオープンなモデルであることが特長のひとつとなっており、このモデルも他のGranite モデルと同様にモデルの情報やトレーニングデータを公開しています。
https://www.ibm.com/granite/docs/models/time-series/
https://huggingface.co/ibm-granite/granite-timeseries-ttm-r2
事前準備
事前準備では、
- IBM Cloud へのログイン
- apikey の取得
をします。apikey は、ハンズオン本編で使用します。
IBM Cloud にログイン
-
リンク (https://cloud.ibm.com/login) をクリックし、IBMid とパスワードを入力してログインする
apikey の取得
ハンズオン
ハンズオンでは、
- watsonx にログイン
- プロジェクトの作成
- サービスの関連付け
- プロジェクト・アクセス・トークンの作成
- csv ファイルをプロジェクトへアップロード
- 前処理
- 予測
をします。
watsonxにログイン
- リンク (https://dataplatform.cloud.ibm.com/login?context=wx) をクリックし、IBMid とパスワードを入力してログインする
プロジェクトの作成
サービスの関連付け
プロジェクト・アクセス・トークンの作成
csvファイルをプロジェクトへアップロード
-
ローカルにダウンロードした
ETTh1.csv
を置いておく
前処理
ノートブックを作成
ノートブックの操作方法










この記事では出力を確認しながら1つずつ行を実行します。
実行
- 右上のコピーアイコンをクリックするとブロックごとにコピーができます。
-
1ブロック = ノートブックでの1行
です。 - コピー(⌘C) したブロックをノートブックにペースト(⌘V) し、実行(Shift+Enter) をします。
#プロジェクトにアップロードしたcsvファイルをノートブックにダウンロード
wslib.download_file("ETTh1.csv")
#存在するファイルを確認
!ls
#ライブラリのインポート
import pandas as pd
import matplotlib.pyplot as plt
#「df」にcsvファイルを格納
df = pd.read_csv("ETTh1.csv")
#表示して格納できているか確認
df
#HULLのプロットを可視化
plt.plot(df["Date"], df["HULL"], linestyle="-")
plt.grid()
#HULLのヒストグラムを可視化
plt.hist(df["HULL"])
plt.grid()
#線形補間後のデータをcsvファイルにしてプロジェクト内に保存
wslib.save_data("ETTh1_1.csv", df.to_csv(index=False).encode(), overwrite=True)
-
基本的に自動保存だが、念のために左上の上書き保存マークを押して保存
-
プロジェクトの資産を見に行くと、ETTh1_1.csvがある
予測
ノートブックの作成
-
新規資産
をクリック -
①
python
を検索バーに入力し、②Python またはR notebooks でのデータおよびモデルの処理 (Jupyter ノートブック・エディター)
を選択 -
①
名前
にforecast.py
を入力し、②作成
をクリック -
ランタイムが終了するのを待つ
-
①
縦の3点リーダー
をクリック、②プロジェクト・トークンの挿入
をクリック -
preprocessing.py
と同様、自動的にproject_id
やproject_access_token
が入力される
実行
#プロジェクトに保存したcsvファイルをノートブックにダウンロード
wslib.download_file("GE_RMS_1.csv")
#存在するファイルを確認
!ls
#ライブラリのインポート
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
#「df」にcsvファイルを格納
df = pd.read_csv(filepath_or_buffer="GE_RMS_1.csv")
#使用しないので「No」のcolumnsを除外
df.drop(columns=["No"], inplace=True)
#表示して格納、除外できているか確認
df
#定義
timestamp_column = "Date"
target_column = "HULL"
#watsonx.aiの設定
from ibm_watsonx_ai import Credentials
credentials = Credentials(
url="https://us-south.ml.cloud.ibm.com",
api_key="{自身で取得したapi_key}",
)
#watsonx.aiに接続
from ibm_watsonx_ai import APIClient
client = APIClient(credentials)
client.set.default_project(project_id="{プロジェクト・トークンの挿入で表示されているproject_id}")
SUCCESS
と表示されればOK
#TTMが使用できるか確認
for model in client.foundation_models.get_time_series_model_specs()["resources"]:
print('--------------------------------------------------')
print(f'model_id: {model["model_id"]}')
print(f'functions: {model["functions"]}')
print(f'long_description: {model["long_description"]}')
print(f'label: {model["label"]}')
#使用するモデルにGRANITE_TTM_512_96_R2を定義
ts_model_id = client.foundation_models.TimeSeriesModels.GRANITE_TTM_512_96_R2
#TTMの設定
from ibm_watsonx_ai.foundation_models import TSModelInference
ts_model = TSModelInference(
model_id=ts_model_id,
api_client=client
)
#TTMのパラメータの設定
from ibm_watsonx_ai.foundation_models.schema import TSForecastParameters
params = TSForecastParameters(
timestamp_column=timestamp_column,
freq="1h",
target_columns=[target_column],
)
#予測
import time
tmp = []
for i in range(len(df)):
print(i)
data = df.iloc[i:i+512,]
if(data.shape[0] != 512):
break
response = ts_model.forecast(data=data, params=params)
time.sleep(0.1)
tmp.append(response["results"][0])
#予測結果をpickleに保管
import pickle
with open(f"{target_column}.pkl", "wb") as f:
pickle.dump(tmp, f)
#ロードする
with open(f"{target_column}.pkl", "rb") as f:
tmp = pickle.load(f)
#データ全体(青)と初めの512日分から予測した96日の予測値(オレンジ)のプロット
i = 0
plt.plot(np.asarray(df[timestamp_column], dtype='datetime64[s]'), df[target_column], linestyle="-")
plt.plot(np.asarray(tmp[i][timestamp_column], dtype='datetime64[s]'), tmp[i][target_column], linestyle="-")
plt.grid()
#3時間後の予測値を、予測したすべての分プロットするためのデータ準備
i = 2
preds = [
{"Date": t["Date"][i], target_column: t[target_column][i]}
for t in tmp
if t.get("Date") and t.get(target_column)
]
#データ全体(青)と3時間後の予測値(オレンジ)を予測したすべての分プロット
df_preds = pd.DataFrame(preds)
plt.plot(np.asarray(df[timestamp_column], dtype='datetime64[s]'), df[target_column], linestyle="-")
plt.plot(np.asarray(df_preds[timestamp_column], dtype='datetime64[s]'), df_preds[target_column], linestyle="-")
plt.grid()
#3時間後の予測結果のデータをcsvファイルにしてプロジェクト内に保存
wslib.save_data(f"ETTh1_2_{target_column}.csv", df_preds.to_csv(index=False).encode(), overwrite=True)