04.17
教師なしの手法
まとめ
「どの日が異常か」「どこで構造が変わったか」のラベルが用意されていない時系列に対して、データの形だけから答えを出す 2 つの手法を扱う章です。
ruptures は「区間ごとのコスト + 区間数 × ペナルティ」を最小にする区切り方を Pelt や Dynp で探し、平均が 100 日ごとに変わる系列や分散だけが変わる系列の変化点を返します。IsolationForest はランダムな分割で各点が孤立するまでの深さを 100 本の木で平均し、浅く孤立する点を異常と判定します。どちらも数行で動き、pen・min_size・contamination といった少数の引数で感度を調整できます。直感 #
異常値や変化点のラベルが事前に用意されていない場面は多く、監視やアラートの仕組みを作るときはむしろそれが普通です。Isolation Forest は「少ない回数のランダム分割で孤立する点は外れ値だ」という性質から異常を自動で見つけ、ruptures は「どこで区切ると区間内のばらつきの合計が最小になるか」という統計的な基準で系列の切れ目を見つけます。ラベルがなくても IsolationForest(contamination=0.01) や Pelt(model="rbf").predict(pen=10) の 1〜2 行で候補を出せるので、まずこれらで当たりを付け、人が確認したラベルを後から教師あり学習に回す、という流れの出発点になります。
詳細な解説 #
このチャプターで学べること #
- Isolation Forestの仕組みと、時系列データへの適用方法
- rupturesによる変化点検出のアルゴリズムと実装
- 検出結果の可視化と閾値の調整方法
これがわかるとできること #
- ラベルなしのデータから異常値を自動検出し、原因調査のトリガーにできる
- 系列の構造変化を統計的に特定し、モデルの分割や再学習の判断に使える
- 異常検知パイプラインのプロトタイプを素早く構築できる
学習の進め方 #
まず Isolation Forest で、365 日の人工データに混ぜた 6 日分の異常値を contamination と max_features の設定で検出し、plot_tree でどの特徴量の分岐が異常点を孤立させたかを読みます。次に ruptures で、pen を 0.1 から 1.0 に動かしたときの変化点の増減と、rbf と l2 のコスト関数で分散の変化を拾えるかどうかの違いを人工データと Datadog の株価で試します。