異常検知は「異常というクラスを当てる分類」の別名ではありません。分類は既知のクラス境界を学びますが、異常検知は正常の範囲を学び、そこから外れたものへスコアを付ける問題です。まだ見たことのない故障、攻撃、欠陥を扱いたいとき、この違いが重要になります。

この記事では、異常検知の問題設定、代表手法の選び方、データ分割、しきい値、運用評価までを一つの流れで整理します。画像で手を動かしたい場合は、MVTec ADで異常検知を試すから始められます。

なぜ分類では足りないのか

不良品、設備故障、不正アクセスの共通点は、異常が少なく、種類が増え続けることです。既知のキズを10種類集めて分類器を作っても、11種類目のキズを正常と判断する可能性があります。

異常検知は、次の条件で候補になります。

  • 正常データは日常業務から大量に得られる
  • 異常データは少ない、偏っている、まだ存在しない
  • 異常の種類より「通常と違うこと」を先に知りたい
  • 検知後に、人や別システムが詳しく確認できる

一方、異常の種類が固定され、各クラスの教師データを十分に集められるなら、通常の教師あり分類の方が原因まで直接返せます。異常検知は分類の上位互換ではなく、データ条件に合わせた問題の置き換えです。

noveltyとoutlierを分ける

scikit-learnは、異常検知をnovelty detectionとoutlier detectionに分けています[1]

問題設定学習データ目的
Novelty detection正常データだけと仮定新しく来たデータが正常範囲内か判定
Outlier detection学習データにも外れ値が混ざるデータ集合内の外れ値を見つける

製造ラインで、検品済みの良品画像からモデルを作るのはnovelty detectionです。ログ分析で、既存ログの中から怪しいイベントを洗い出すのはoutlier detectionに近い問題です。

この区別は実装にも効きます。正常だけのつもりで学習したデータに不良が混ざると、モデルはその不良まで正常として覚えます。最初に「正常を誰が、どの基準で保証したか」を確認する必要があります。

手法を5つの家族で見る

異常検知の手法名は多いですが、「正常をどう表現するか」で整理できます。

家族正常の表現向いている場面注意点
統計・ルール平均、分散、管理限界少数の安定したセンサー運転条件の変化に弱い
分離ベース少ない分割で孤立する点表形式、探索的な検知時系列や画像の構造を直接扱わない
密度・境界正常が集まる領域低〜中次元の特徴量次元とスケールに敏感
再構成正常なら元に戻せる波形、画像、複雑な入力異常も上手に再構成することがある
特徴距離正常特徴との近さ画像、事前学習を使える入力特徴抽出器のドメイン差に左右される

Isolation Forestは分離ベース、One-Class SVMやLocal Outlier Factorは境界・密度ベースの代表です[1]。オートエンコーダは再構成誤差を使います。画像では、事前学習済みモデルの特徴を正常メモリと比べるPatchCoreのような手法が有力です[3]

最初から深層学習へ進む必要はありません。センサー1本の上限逸脱ならルールが説明しやすく、保守も容易です。入力が画像や多変量波形で、正常変動を単純な式にできないところから学習手法の価値が出ます。

正常データの範囲を設計する

モデルが学ぶのは、現実の正常ではなく学習データに入った正常です。昼間の運転だけで学習すれば夜間を異常と呼び、1品種だけで学習すれば別品種を異常と呼びます。

正常データを集めるときは、次の変動を列挙します。

  • 品種、設備、拠点、担当者
  • 速度、負荷、温度、季節、時間帯
  • カメラ、照明、センサー交換
  • 立ち上げ、定常、停止前後の運転モード

すべてを一つのモデルへ詰めるより、運転モードごとにモデルや基準値を分けた方が安定することもあります。異常検知の前に、正常を意味のある状態へ分解できるかを考えます。

分割もランダムでは不十分です。同じ製品の連写、同じ設備の連続時間帯が学習とテストに入ると、評価が楽になります。設備ID、製品ロット、時間で分け、本番の未知を再現します。詳しい考え方はモデル評価設計入門で扱っています。

異常スコアを判定へ変える

多くの異常検知モデルが返すのは0/1ではなく連続した異常スコアです。どこから異常とするかは、モデルではなく運用が決めます。

しきい値を下げると見逃しは減り、誤報は増えます。上げると誤報は減り、見逃しが増えます。Accuracyだけを見ると、異常が少ないデータでは「全部正常」が高得点になり得ます[4]

しきい値は次の順に決めます。

  1. 見逃してはいけない異常と必要なRecallを決める
  2. 条件を満たす候補しきい値で、誤報件数を数える
  3. 人や後段システムが処理できる件数に収める
  4. 検証期間で固定し、別のテスト期間で確認する

「スコア0.8だから80%の確率で異常」とは限りません。異常スコアと確率を混同せず、必要なら別途校正します。

評価単位を現場に合わせる

点ごとのAUROCが高くても、1分間に100回アラートが出れば運用できません。評価単位は、モデル入力より現場の判断へ合わせます。

  • 画像検査: 製品単位のRecall、欠陥種類別Recall、再検査率
  • 設備監視: 故障前の検知率、検知から故障までの猶予、設備・月あたり誤報数
  • セキュリティ: インシデント単位の検知率、調査件数、重複アラート率
  • 時系列: 点の正解率ではなく、異常区間を一度でも早く検知できたか

MVTec ADは、15カテゴリの正常画像と欠陥画像、ピクセル単位マスクを備え、画像単位の検出と位置特定を比較できます[2]。一方、工場の運用評価には、撮像条件の変化や人が処理できる再検査数も加える必要があります。

異常を見つけた後を作る

異常検知モデルは、原因や正しい対処まで自動的に教えてくれません。導入時は次の流れを設計します。

  1. スコアと根拠画像・波形を保存する
  2. 既知ルールで、設備停止・人手確認・経過観察へ振り分ける
  3. 人の判定と原因を記録する
  4. 新しい正常変動と本物の異常を学習・評価データへ戻す

このフィードバックがないと、誤報を減らす材料が残りません。モデルより先に「誰が確認し、結果をどこへ記録するか」を決めます。製造業にAIが根づいた理由で扱った、人の再検査を安全網にする設計がそのまま使えます。

まとめ

  • 異常検知は、正常の範囲を学び、そこからの外れ方をスコア化する問題
  • 正常だけで学ぶnovelty detectionと、混在データから外れ値を探すoutlier detectionを分ける
  • 手法は統計、分離、密度・境界、再構成、特徴距離の5家族で選ぶ
  • 正常データは品種・設備・運転条件を覆い、個体と時間をまたがない評価分割にする
  • しきい値は見逃しと誤報の運用コストから決める
  • 成功条件は高いスコアではなく、異常発見後の確認とフィードバックが回ること

まず、手元の異常検知テーマについて「正常に含める変動」と「異常発見後に確認する人」を書き出してください。手法選択は、その2点が決まってからです。

参考文献・一次情報

  1. [1]
    OFFICIALNovelty and Outlier Detection

    scikit-learn developers

    novelty detectionとoutlier detectionの違い、代表的な古典手法

  2. [2]
    PAPERMVTec AD — A Comprehensive Real-World Dataset for Unsupervised Anomaly Detection

    Paul Bergmann, Michael Fauser, 他CVPR 20192019DOI: 10.1109/CVPR.2019.00982

    正常画像のみで学習する産業画像異常検知の代表的ベンチマーク

  3. [3]
    PAPERTowards Total Recall in Industrial Anomaly Detection

    Karsten Roth, Latha Pemula, 他CVPR 20222022

    正常パッチ特徴との距離で異常を検出・位置特定するPatchCore

  4. [4]
    OFFICIALClassification: Accuracy, recall, precision, and related metrics

    Google for Developers

    不均衡データにおけるAccuracyの限界とPrecision・Recallの選択