sktimeは、scikit-learnのAPIデザインに準拠した、Pythonの時系列分析に特化した統合ライブラリです。時系列予測、時系列分類、時系列変換など、時系列に関する幅広いタスクを統一的なインターフェースで扱うことができます。
本記事では、sktimeの基本的な使い方を、具体的なコード例とともに解説します。
本記事の内容
- sktimeの概要とインストール
- 時系列データの扱い方
- 時系列予測(Forecasting)の実装
- 時系列分類(Classification)の実装
sktimeの概要
sktimeは、以下のような時系列分析タスクをカバーしています。
| タスク | 説明 | 代表的なアルゴリズム |
|---|---|---|
| Forecasting | 時系列予測 | ARIMA, ETS, Prophet, Theta |
| Classification | 時系列分類 | TSForest, BOSS, ROCKET |
| Regression | 時系列回帰 | 時系列からスカラー値の予測 |
| Transformation | 時系列変換 | フーリエ変換, PCA, 差分 |
| Clustering | 時系列クラスタリング | k-means (DTW), k-medoids |
scikit-learnに慣れている方であれば、fit / predict のパラダイムでそのまま使えるのが大きなメリットです。
インストール
# pip でインストール
# pip install sktime
# 全ての依存関係を含むインストール
# pip install sktime[all_extras]
時系列データの準備
sktimeでは、pandasの Series や DataFrame を時系列データの基本形式として使います。まずは有名な航空旅客数データを読み込みましょう。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sktime.datasets import load_airline
# 航空旅客数データの読み込み
y = load_airline()
print(type(y))
print(y.head(10))
# 可視化
plt.figure(figsize=(12, 4))
y.plot()
plt.title("Airline Passengers")
plt.xlabel("Period")
plt.ylabel("Number of Passengers")
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
load_airline() はpandasの Series を返し、インデックスが PeriodIndex になっています。このような周期的なインデックスを持つ Series がsktimeの基本的な入力形式です。
時系列予測(Forecasting)
訓練データとテストデータの分割
時系列データの分割では、データの時間的な順序を保つ必要があります。sktimeは temporal_train_test_split を提供しています。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sktime.datasets import load_airline
from sktime.split import temporal_train_test_split
y = load_airline()
# 訓練・テスト分割(最後の36期間をテストデータに)
y_train, y_test = temporal_train_test_split(y, test_size=36)
plt.figure(figsize=(12, 4))
y_train.plot(label='Train')
y_test.plot(label='Test')
plt.title("Train / Test Split")
plt.xlabel("Period")
plt.ylabel("Passengers")
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
ExponentialSmoothing による予測
指数平滑化法(Exponential Smoothing, ETS)を使って予測してみましょう。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sktime.datasets import load_airline
from sktime.split import temporal_train_test_split
from sktime.forecasting.ets import AutoETS
from sktime.performance_metrics.forecasting import mean_absolute_percentage_error
y = load_airline()
y_train, y_test = temporal_train_test_split(y, test_size=36)
# 予測ホライズンの設定
fh = np.arange(1, 37) # 1〜36ステップ先を予測
# モデルの構築と学習
forecaster = AutoETS(auto=True, sp=12)
forecaster.fit(y_train)
# 予測
y_pred = forecaster.predict(fh=fh)
# 精度評価
mape = mean_absolute_percentage_error(y_test, y_pred)
print(f"MAPE: {mape:.4f}")
# 可視化
plt.figure(figsize=(12, 5))
y_train.plot(label='Train')
y_test.plot(label='Test (actual)')
y_pred.plot(label='Forecast', color='red', linestyle='--')
plt.title(f"AutoETS Forecast (MAPE: {mape:.4f})")
plt.xlabel("Period")
plt.ylabel("Passengers")
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
AutoETS は加法的・乗法的なトレンドや季節性の組み合わせを自動で選択してくれます。sp=12 は季節周期が12(月次データ)であることを指定しています。
複数モデルの比較
sktimeでは複数のモデルを統一的なインターフェースで比較できます。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sktime.datasets import load_airline
from sktime.split import temporal_train_test_split
from sktime.forecasting.ets import AutoETS
from sktime.forecasting.theta import ThetaForecaster
from sktime.forecasting.naive import NaiveForecaster
from sktime.performance_metrics.forecasting import mean_absolute_percentage_error
y = load_airline()
y_train, y_test = temporal_train_test_split(y, test_size=36)
fh = np.arange(1, 37)
# 複数モデルの定義
models = {
'Naive (seasonal)': NaiveForecaster(strategy='last', sp=12),
'Theta': ThetaForecaster(sp=12),
'AutoETS': AutoETS(auto=True, sp=12),
}
results = {}
plt.figure(figsize=(12, 5))
y_train.plot(label='Train', color='gray', alpha=0.5)
y_test.plot(label='Test', color='black', linewidth=2)
for name, model in models.items():
model.fit(y_train)
y_pred = model.predict(fh=fh)
mape = mean_absolute_percentage_error(y_test, y_pred)
results[name] = mape
y_pred.plot(label=f'{name} (MAPE={mape:.4f})', linestyle='--')
plt.title("Model Comparison")
plt.xlabel("Period")
plt.ylabel("Passengers")
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# 結果をテーブル表示
print("\n=== Model Comparison ===")
for name, mape in sorted(results.items(), key=lambda x: x[1]):
print(f" {name}: MAPE = {mape:.4f}")
時系列分類(Classification)
sktimeは時系列分類タスクもサポートしています。UCR/UEA Time Series Classification Archiveのデータセットを使って、時系列分類を試してみましょう。
import numpy as np
import matplotlib.pyplot as plt
from sktime.datasets import load_unit_test
from sktime.classification.kernel_based import RocketClassifier
from sklearn.metrics import accuracy_score
# データの読み込み
X_train, y_train = load_unit_test(split="train", return_type="numpy3d")
X_test, y_test = load_unit_test(split="test", return_type="numpy3d")
print(f"Train: {X_train.shape}, Test: {X_test.shape}")
print(f"Classes: {np.unique(y_train)}")
# ROCKET分類器の構築と学習
classifier = RocketClassifier(num_kernels=500, random_state=42)
classifier.fit(X_train, y_train)
# 予測と評価
y_pred = classifier.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"Accuracy: {acc:.4f}")
# サンプルの可視化
fig, axes = plt.subplots(1, 2, figsize=(14, 4))
for cls_idx, cls_label in enumerate(np.unique(y_train)):
mask = y_train == cls_label
samples = X_train[mask][:5]
for s in samples:
axes[cls_idx].plot(s[0], alpha=0.7)
axes[cls_idx].set_title(f"Class: {cls_label}")
axes[cls_idx].set_xlabel("Time")
axes[cls_idx].set_ylabel("Value")
axes[cls_idx].grid(True, alpha=0.3)
plt.suptitle("Time Series Classification Samples")
plt.tight_layout()
plt.show()
ROCKETは、ランダムに生成した畳み込みカーネルで時系列から特徴量を抽出し、線形分類器で分類する手法です。計算効率が良く、多くのデータセットで高い性能を示すことが知られています。
まとめ
本記事では、Pythonの時系列分析ライブラリsktimeの基本機能を解説しました。
- sktimeはscikit-learnライクなAPIで時系列分析の各種タスクを統一的に扱えるライブラリ
- 時系列予測:
fit/predictで簡単に予測モデルを構築・評価できる - AutoETSやThetaなど、複数の予測モデルを統一的に比較できる
- 時系列分類: ROCKETなどの最新手法も同じインターフェースで利用可能
- 時系列のクラスタリングや変換など、幅広いタスクに対応している
sktimeは活発に開発されており、新しいアルゴリズムも継続的に追加されています。scikit-learnに慣れている方にとって、時系列分析の入り口として最適なライブラリです。