時間系列予測の精度を評価する指標として、MAPE(Mean Absolute Percentage Error)が一般的に使用されますが、今回はその改善版であるVSMAPE(Volume Scaled Mean Absolute Percentage Error)について取り上げます。VSMAPEは、予測された値がゼロに近いときにMAPEが無限大になるという問題を解決します。
VSMAPEの定義
VSMAPEは、絶対パーセンテージ誤差の平均を取る代わりに、誤差の絶対値を全体の出力ボリュームでスケールします。この指標は特に、予測すべき値がゼロに近い場合や、時系列のボリュームが大きく変化する場合に有用です。
数式で表すと、VSMAPEは次のように定義されます:
VSMAPE = Σ (|y_true - y_pred| / Σ |y_true|)
ここで、
y_trueは実際の値
y_predは予測値
Σはシリーズ全体での和を示します。
PythonでのVSMAPE実装
PythonでのVSMAPEの実装は非常にシンプルです。NumPyライブラリを使用して、以下のように記述できます。
import numpy as np
def vsmape(y_true, y_pred):
return np.sum(np.abs(y_true - y_pred)) / np.sum(np.abs(y_true))
ここで、y_trueとy_predはNumPy配列として入力され、VSMAPEスコアが返されます。
VSMAPEの適用ケース
VSMAPEは、多様な時系列予測タスクで役立つ評価指標です。例えば、製品の需給予測、エネルギー消費予測、株価予測など、多くのケースで使用可能です。
特に、予測するデータにゼロや近い値が含まれている場合、またはデータのボリュームが時間とともに大きく変化する場合にVSMAPEは優れた指標となります。このようなシナリオでは、MAPEよりもVSMAPEが適切な評価指標となるでしょう。
例として、ある製品の売上予測タスクを考えてみましょう。製品の売上は通常、季節性やトレンドに影響を受け、時間とともに大きく変化します。また、新製品の場合、売上が始まったばかりで値がゼロまたはゼロに近い場合もあります。このようなケースでは、VSMAPEを使用して予測モデルの精度を評価することが適切です。
以下に、このシナリオでVSMAPEを使用して予測モデルを評価するPythonコードを示します。
import numpy as np
from sklearn.model_selection import TimeSeriesSplit
from sklearn.linear_model import LinearRegression
# VSMAPEの定義
def vsmape(y_true, y_pred):
return np.sum(np.abs(y_true - y_pred)) / np.sum(np.abs(y_true))
# データ生成
np.random.seed(0)
X = np.linspace(0, 10, 100)
y = X + np.random.normal(0, 1, 100)
# 時系列クロスバリデーション
tscv = TimeSeriesSplit(n_splits=5)
for train_index, test_index in tscv.split(X):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
# モデル学習
model = LinearRegression()
model.fit(X_train.reshape(-1, 1), y_train)
# 予測と評価
y_pred = model.predict(X_test.reshape(-1, 1))
print('VSMAPE:', vsmape(y_test, y_pred))
VSMAPEは、ゼロやゼロに近い値に強く、またボリュームの大きく変化する時系列データに対しても有効な評価指標であることを理解することが重要です。これにより、予測モデルの精度をより適切に評価し、より良い予測モデルを構築することが可能になります。
まとめ
VSMAPEは、時系列予測タスクの評価指標としてMAPEの問題を解決するものであり、予測値がゼロに近い場合やデータのボリュームが大きく変化する場合に特に有用です。Pythonでの実装も簡単で、多くのデータ分析や機械学習タスクに役立つことでしょう。