機械学習による時系列予測・分類・異常検知の選び方とPython実装ハブ:k-means/GMM・アンサンブル・LSTM・カルマンの使い分け

sklearn.cluster.KMeans/GaussianMixture・sklearn.ensemble・tensorflow.keras.LSTM・カルマンフィルタを教師あり/なし×時系列×解釈性で比較し、Python統合評価まで一気通貫で示す機械学習ハブ記事。

はじめに

「時系列データに対して機械学習を使う」と一言で言っても、求める出力は 予測・分類・クラスタリング・異常検知 と多岐にわたります。さらに同じ「予測」でも、短期/長期、線形/非線形、定常/非定常、解釈性重視/精度重視で最適な手法が大きく変わります。本記事は GA4 ドリブン改善サイクルで急上昇している k-means / GMM クラスタリングアンサンブル学習LSTM 時系列予測時系列異常検知 の 4 本柱を一枚の地図に統合する ハブ記事 です。

機械学習が時系列・分類・異常検知で問われる軸は、大きく次の 4 つに整理できます。

  1. 教師あり vs 教師なし:ラベルがあるか/自己組織化に頼るか
  2. パラメトリック vs ノンパラメトリック:分布や構造を仮定するか/データ駆動で柔軟に学ぶか
  3. 定常 vs 非定常:時系列の統計量が一定か/時間とともに変化するか
  4. 線形 vs 非線形:状態遷移・回帰関数が線形か/非線形 NN・木モデルで近似するか

たとえば k-means / GMM は教師なし・パラメトリック(クラスタ数 \(K\) や共分散構造を仮定)、Random Forest / GBDT は教師あり・ノンパラ、LSTM は教師あり・非線形・系列依存、カルマンフィルタ系の時系列異常検知 は教師なし・パラメトリック・線形(拡張カルマンや UKF で非線形拡張)と、4 軸上の位置が綺麗に異なります。ハイパパラメータ選びには ベイズ最適化 を併用するのが定石です。

本ハブでは、3 つの選定軸 × 特性比較マトリクス × 9 つの決定シナリオ × Python 統合評価フレームワークで「自分の問題にはどの手法か」を機械的に絞れるよう設計しました。各手法の詳細は元記事に委ね、ここでは 全体地図使い分けの勘所 を提供します。

選定 3 軸:機械学習を時系列/分類問題で位置づける物差し

軸 1:教師あり(LSTM / GBDT / Random Forest)vs 教師なし(k-means / GMM / カルマン異常検知)

ラベル \(y\) が手元にあれば教師あり、なければ教師なしです。

  • 教師ありで離散ラベル → 分類(Random Forest / GBDT / LSTM 分類ヘッド)
  • 教師ありで連続値(特に時系列の将来値)→ 回帰/予測(LSTM / GBDT
  • ラベルなしで群を見たい → クラスタリング(k-means / GMM
  • ラベルなしで「正常からの逸脱」を出したい → 異常検知(Isolation Forest / One-Class SVM / カルマンの残差検定)

異常検知は半教師あり(正常データのみで学習)として扱われることも多く、教師あり/なしの境界に位置します。

軸 2:時系列性の有無(独立サンプル vs 系列依存)

サンプル間が i.i.d. と仮定できるか、過去が現在を決めるかで使える手法が変わります。

実務では「まず GBDT にラグ特徴量を食わせる」が筋の良い出発点で、それで足りなければ LSTM や状態空間モデルに進む、というアプローチが一般的です。

軸 3:解釈性 vs 表現力(GBDT / RF vs LSTM / 深層)

意思決定の納得性が要るか、性能だけ追求するかで選び方が割れます。

  • 高解釈性:木モデル(Random Forest / GBDT)。feature importance、SHAP、Partial Dependence で説明可能
  • 中解釈性GMM(クラスタごとの平均・共分散)、カルマン(状態空間の物理的意味)
  • 低解釈性・高表現力LSTM、Transformer 系。長期依存・非線形相互作用を吸収

医療・金融・公共領域では「精度が高くても説明できないと採用できない」場面が多く、まず GBDT で精度ベースラインを取ってから NN に進むのが安全です。

特性比較マトリクス:6 列で 7 手法を横並びに

手法カテゴリ学習データ要件計算コスト解釈性主用途
k-means教師なし・距離法\(\sim 10^2\) 〜\(O(NKd)\) / iter顧客セグメント、画像量子化
GMM教師なし・確率モデル\(\sim 10^3\) 〜\(O(NKd^2)\) / EMソフトクラスタ、密度推定
Random Forest教師あり・bagging\(\sim 10^3\) 〜\(O(MND \log N)\)表形式分類・回帰、特徴量重要度
GBDT / XGBoost / LightGBM教師あり・boosting\(\sim 10^3\) 〜\(O(MND)\) ヒストKaggle 標準、ラグ特徴量で時系列
LSTM教師あり・RNN\(\sim 10^4\) 〜\(O(T H^2)\) / step短中期予測、系列分類
カルマンフィルタ教師なし・状態空間状態モデル必須\(O(T n^3)\)追跡、線形予測、残差で異常検知
Isolation Forest教師なし・木\(\sim 10^3\) 〜\(O(M N \log N)\)点異常検知、外れ値スコア
  • \(N\) はサンプル数、\(d\) は特徴次元、\(K\) はクラスタ数、\(M\) は木の本数、\(D\) は木の深さ、\(T\) は系列長、\(H\) は LSTM 隠れ次元、\(n\) は状態次元
  • 「学習データ要件」は実務的に安定して学習できる最小規模の目安。LSTM は数千サンプル × 数十系列以上推奨
  • 解釈性は SHAP・Partial Dependence の適用可否を考慮した相対評価

このマトリクスを 1 枚見れば、「サンプルが 200 件しかないのに LSTM」「説明責任が要るのに NN」といったミスマッチを防げます。

用途別決定シナリオ:9 つのよくある問題と推奨手法

シナリオ 1:顧客セグメンテーション(マーケティング、N=数万)

特徴量は購買頻度・客単価・最終購入日(RFM)など低次元・連続。k-means で素早く \(K=4\) 〜\(6\) の解釈しやすいセグメントを切り、各セグメントの統計量を可視化。クラスタが重なって境界が曖昧なら GMM に切り替え、ソフト割り当て確率で「どっち寄り」を顧客ごとに数値化します。\(K\) の決定はエルボー法/silhouette/BIC を併用。

シナリオ 2:点異常検知(センサ値、リアルタイム)

「単発のスパイク・外れ値」を見つけたいなら Isolation Forest が第一候補。木のパス長から異常スコアを返し、\(N=10^4\) 程度でも秒オーダーで学習。教師ラベルが少しある場合は One-Class SVMLocal Outlier Factor (LOF) とのアンサンブルが効きます。

シナリオ 3:系列異常検知(設備診断、時系列の壊れ方)

時間的構造を持つ異常(じわじわ悪化/周期消失)は点異常検知では取れません。カルマンフィルタ で正常系列の状態空間モデルを学習し、観測残差 \(\nu_t = y_t - \hat{y}_t\) の Mahalanobis 距離 \(\nu_t^\top S_t^{-1} \nu_t > \chi^2_{0.99}\) で異常検知。非線形系なら拡張カルマン (EKF)・無香料カルマン (UKF) または LSTM オートエンコーダ の再構成誤差で代替。

シナリオ 4:短期予測(10 ステップ先まで、N=数千)

需要予測やセンサ値の短期未来は、GBDT (LightGBM / XGBoost) にラグ特徴量 を入れる「直接法」が高速・高精度・解釈可能な万能解。lag-1, lag-7, lag-30 + 移動平均 + 曜日・月の one-hot を作るだけで、ARIMA や単純な LSTM をしばしば上回ります。誤差プロファイルが歪んでいるなら quantile loss で予測区間を出します。

シナリオ 5:長期予測(季節性・トレンド、N=数年×日次)

長期になるほど LSTM は誤差が蓄積し性能が落ちます。STL 分解 + GBDT 残差予測 か、LSTM の Seq2Seq + Attention にトレンド/季節性/祝日を外生入力として与えるのが鉄板。Prophet 系(ベイズ状態空間)も依然強力で、解釈性・トレンド変化点・休日効果を一気に扱えます。

シナリオ 6:分類(クラス不均衡、N=数千、正例 1%)

不均衡データは木モデルが圧倒的に強く、Random Forest / GBDT + class_weight="balanced" または scale_pos_weight で対応。SMOTE などのオーバーサンプリングは過学習リスクが上がるので、まずはクラス重みと閾値調整から。評価は accuracy ではなく PR-AUC / F1 / Matthews 相関係数 を見ます。

シナリオ 7:特徴量重要度の可視化(説明責任が要る)

「どの変数が効いているか」を出したいなら Random Forest の MDI / Permutation Importance または GBDT の SHAP が双璧。MDI は高基数カテゴリに過大評価バイアスがあるので Permutation を併用。SHAP は計算重いが交互作用も見える。LSTM の解釈は Integrated Gradients が一般的だが、解釈性目的なら最初から木モデルが楽。

シナリオ 8:オンライン学習(データが流れ続ける)

バッチ再学習が間に合わないなら、カルマンフィルタ(解析的に逐次更新)、SGD ベース線形モデルsklearn.linear_model.SGDClassifier)、Hoeffding TreeVFDT 系 ストリーム木)、LSTM の online fine-tuning が選択肢。状態空間が線形ならカルマンが最も収束が速くメモリ効率もよい。

シナリオ 9:ハイパパラメータ自動探索(ベイズ最適化との連携)

GBDT の learning_rate / max_depth / num_leaves、LSTM の hidden_size / layers / lookback、GMM の \(K\) など、ハイパパラの数が増えるとグリッドサーチは破綻します。ベイズ最適化 で獲得関数(EI / UCB)を最大化する次の試行点を選び、Optuna / scikit-optimize / Ax で 20〜50 試行で実用域に到達できます。木モデルなら TPE(Tree-structured Parzen Estimator)が定石。

Python 統合評価フレームワーク:1 つの合成データに複数手法を並列適用

「トレンド + 季節性 + ノイズ + 点異常」の合成時系列に対し、k-means / GMM / Random Forest / LSTM / Isolation Forest を一斉に走らせ、予測 MSE・異常検知 F1・クラスタリング silhouette を横並びで算出します。

import numpy as np
from sklearn.cluster import KMeans
from sklearn.mixture import GaussianMixture
from sklearn.ensemble import RandomForestRegressor, IsolationForest
from sklearn.metrics import mean_squared_error, f1_score, silhouette_score
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

# 合成データ:トレンド + 季節 + ノイズ + 点異常
rng = np.random.default_rng(0)
T = 1000
t = np.arange(T)
trend = 0.01 * t
season = 2.0 * np.sin(2 * np.pi * t / 50)
noise = rng.normal(0, 0.3, T)
y = trend + season + noise
anomaly_idx = rng.choice(T, 20, replace=False)
y[anomaly_idx] += rng.normal(0, 5, 20)
is_anomaly = np.zeros(T, dtype=int); is_anomaly[anomaly_idx] = 1

# ラグ特徴量(系列を i.i.d. 風に変換)
L = 10
X = np.array([y[i-L:i] for i in range(L, T)])
y_target = y[L:]

# (1) k-means:時系列セグメント割り当て
km = KMeans(n_clusters=3, n_init=10, random_state=0).fit(X)
sil_km = silhouette_score(X, km.labels_)

# (2) GMM:ソフトクラスタ + 対数尤度
gmm = GaussianMixture(n_components=3, covariance_type="full", random_state=0).fit(X)
sil_gmm = silhouette_score(X, gmm.predict(X))

# (3) Random Forest:1 ステップ先予測
split = int(len(X) * 0.8)
rf = RandomForestRegressor(n_estimators=200, max_depth=8, random_state=0)
rf.fit(X[:split], y_target[:split])
mse_rf = mean_squared_error(y_target[split:], rf.predict(X[split:]))

# (4) LSTM:1 ステップ先予測(同じラグ窓)
Xn = X.reshape(-1, L, 1)
lstm = Sequential([LSTM(32, input_shape=(L, 1)), Dense(1)])
lstm.compile(optimizer="adam", loss="mse")
lstm.fit(Xn[:split], y_target[:split], epochs=20, batch_size=32, verbose=0)
mse_lstm = mean_squared_error(y_target[split:], lstm.predict(Xn[split:], verbose=0).ravel())

# (5) Isolation Forest:点異常検知
iso = IsolationForest(contamination=0.02, random_state=0).fit(y.reshape(-1, 1))
pred_anom = (iso.predict(y.reshape(-1, 1)) == -1).astype(int)
f1_iso = f1_score(is_anomaly, pred_anom)

print(f"KMeans silhouette  : {sil_km:.3f}")
print(f"GMM silhouette     : {sil_gmm:.3f}")
print(f"RF  forecast MSE   : {mse_rf:.3f}")
print(f"LSTM forecast MSE  : {mse_lstm:.3f}")
print(f"IsolationForest F1 : {f1_iso:.3f}")

このスクリプトは 40 行強で 5 手法 × 3 評価指標 を一気に出します。自前のデータに差し替える際は、合成 y を読み込み配列に置き換えるだけ。「LSTM が必ず GBDT を超える」わけではないことが手元の数字でわかるので、過度な期待や逆に過小評価を避けられます。詳細実装は k-means/GMMアンサンブルLSTM時系列異常検知 の各記事に。

設計パラメータ表:各手法の主要ハイパパラ

手法主要パラメータ推奨初期値・指針
k-meansクラスタ数 \(K\)エルボー / silhouette で 2〜10 を走査。n_init=10 で局所解回避
GMM\(K\) / 共分散構造covariance_type:full(柔軟)/ tied / diag(高次元)/ spherical。BIC 最小
Random Forestn_estimators / max_depth200〜500 本、深さ 8〜20。max_features="sqrt" が分類、1.0 が回帰の初期値
GBDTlearning_rate / num_leaves/n_estimatorsLR 0.05、leaves 31、early stopping で本数自動決定。LR↓×本数↑で精度↑
LSTM隠れ次元 \(H\) / 層数 / lookback\(H=32\) 〜\(128\) 、層数 1〜2、lookback は周期の 1〜2 倍。dropout 0.2、Adam LR=1e-3
カルマンフィルタ過程雑音 \(Q\) / 観測雑音 \(R\)\(Q/R\) 比で追従性が決まる。EM 推定または交差検証
Isolation Forest しきい値contamination想定異常率の 1〜3 倍。スコア分布のヒストグラムから手動調整

経験則:木モデルは learning_rate を下げて木の本数を増やすほど精度向上(ただし計算時間と引き換え)、LSTM は lookback が周期未満だと季節性を取れず周期超過だと過学習、\(K\) や層数は BIC / 検証損失で機械的に選びます。すべてのハイパパラは ベイズ最適化 で自動探索可能です。

関連記事ガイド

本ハブから深掘りする際の入口を整理します。

コア 4 本柱

古典時系列モデル

自動最適化・周辺技術

信号処理ハブ(双子記事)

おわりに

機械学習を時系列・分類・異常検知に適用する際は、「教師あり/なし × 系列依存 × 解釈性」 の 3 軸でまず手法群を絞り、特性比較マトリクスでサンプル数・計算コストとの整合を確認し、決定シナリオで自分の課題に最も近いケースから始めるのが近道です。

  1. ラベルなしで群を見たい → k-means / GMM
  2. 表形式分類・短中期予測(解釈性も要る) → Random Forest / GBDT
  3. 長期依存・非線形系列 → LSTM
  4. 系列異常・状態追跡 → カルマンフィルタ系 / LSTM-AE
  5. ハイパパラ自動探索 → ベイズ最適化

迷ったら、本記事の Python 統合評価スクリプトを 自分のデータ に差し替えて 5 手法を並列実行し、MSE・F1・silhouette を見比べるのが最短ルートです。次に深掘りすべきテーマとしては、(a) ガウス過程回帰(小データで予測区間が出せる)、(b) Transformer 系時系列モデル(Informer / TimesNet)、(c) 状態空間 + ニューラル(Deep State Space Model)、(d) 因果推論との接続(特徴量重要度から介入効果へ)が挙げられます。本ハブと個別記事を往復しながら、自分の問題に最適な道具を見つけてください。