Amazon Web Services ブログ

Amazon SageMaker Canvas で製造データの異常を検出

クラウドコンピューティングの利用により、Amazon AthenaAmazon SageMaker などのビッグデータや機械学習 (ML) ツールが、使用開始時や運用時に、手間をかけずとも簡単に誰でも利用できるようになりました。製造業でも、運用から予兆保全や計画立案に至るまで、すべての業務でのリソース活用の効率を上げるために、データ分析やデータドリブンな意思決定がますます注目されています。

しかしこの IT の変化の速度は早く、長い歴史を持つ業種においてはスキルセットのジレンマに直面しています。そのジレンマの一例としては、データを分析する方や製造業に特化した領域の専門家は、対象となるデータとその解釈について非常に深い知識を持っていますが、データサイエンスで使用されるツールや、高レイヤで使用される Python などのプログラミング言語に触れる機会は多くありません。また逆に、データサイエンスの専門家は、低レイヤの機械のデータの内容を解釈し、意味のあるデータだけをピックアップするに十分な現場の経験は豊富にありません。このジレンマが障壁となり、データを活用したビジネス上の決断をするアイデア出しをするための、効率的な手順の確立が遅れてしまっています。

Amazon SageMaker Canvas は、領域の専門家にノーコードインターフェースを提供することで、このジレンマを解決します。データサイエンスの経験が十分になくても、予測、分類、回帰モデルなどの強力な分析や、ML モデルを作成できます。また、作成後、モデルを ML および MLOps 専門家に展開して共有することもできます。

この記事では、SageMaker Canvas を使用して、必要な特徴量をデータから選択し、整理する方法を説明します。また、SageMaker Canvas のノーコード機能を使用したモデルチューニングの機能を使って、異常検出のための予測モデルをトレーニングする方法を紹介します。

製造業における異常検出

執筆時点で、SageMaker Canvas は予測、回帰、分類などの典型的なビジネスに活用できるユースケースを中心に提供しています。この記事では、これらの機能が複雑な異常データポイントの検出に役立つことをご紹介します。例えば、産業機械の故障や、異常な動作を特定する際にこのユースケースは役に立ちます。

製造業において異常検知は重要です。これは機械(電車など、またはタービンなど幅広く)が、通常は信頼性が非常に高く、故障するとしても、その発生間隔は数年に及ぶからです。これらの機械からのデータ、温度センサーの読み取り値やステータスメッセージなどのデータの大部分は正常な動作を示すものであり、意思決定のためにはあまり価値はありません。エンジニアは、故障の根本原因を調査する際、将来の故障を警告する指標として、異常なデータを見つけ出そうとします。また、生産性を管理する担当者は、稼働率改善の可能性を探るため、異常データを調査します。このように、データに基づいて意思決定をするための最初のステップは、多くの場合は、関連する(異常な)データを見つけることに依存しています。

本記事では、SageMaker Canvas を使用してデータ内の適切な特徴量データを選択し、さらに SageMaker Canvas のノーコード機能を使用してモデルチューニングを行い、異常検知のための予測モデルをトレーニングします。また最終的に、モデルを SageMaker のエンドポイントとしてデプロイする方法を解説します。

ソリューション全体図

この異常検知のユースケースでは、機械の正常な稼働を示す特性を予測するモデルをトレーニングします。例えば、自動車のモーター温度を、速度や最近のトルクなどの影響を与えた要素から予測します。新しくとられた測定値をサンプルとして異常検知をする場合は、特徴的な要素に対するモデルの予測値と、実際の測定値を比較します。

自動車のモーターの例では、領域の専門家が正常なモーター温度、直近の始動トルク、機器などの周りの環境の温度、その他の潜在的な影響要因の測定値を取得します。こういったデータを使用して、他の特徴量からモーターの温度を予測するモデルをトレーニングできます。そしてこのモデルを使用して定期的にモーター温度を予測します。予測された温度が実際のデータの観測温度と同様である場合、モーターは正常に動作しています。一方、不一致がある場合は、冷却システムの故障やモーターの欠陥などの異常を示していることになります。

以下の図は、このソリューションアーキテクチャを示しています。

このソリューションは4つの主要なステップで構成されています:

  1. 領域の専門家が、SageMaker Canvas を使用してデータ分析、特徴量の選定を行い、初期モデルを作成します。
  2. この領域の専門家は、Amazon SageMaker Model Registry を通じてモデルを共有します。もしくは直接、リアルタイムで使用できるエンドポイントとしてデプロイします。
  3. MLOps 担当者は、推論インフラを作成します。そして、モデルの出力の予測から、異常と判断される指標に変換するコードを書きます。このコードは通常、AWS Lambda 関数内で実行されます。
  4. 異常検知を行いたいアプリケーションがある場合は、Lambda 関数を呼び出します。Lambda 関数はモデルを使用して推論を行い、異常かどうかの返答をします。

前提条件

この記事に沿って作業する前に、以下の前提条件を満たしてください:

SageMaker でモデルを構築する

モデルを作成するプロセスは、SageMaker Canvas で回帰モデルを作成する標準的な手順と同じです。詳細については、Amazon SageMaker Canvas の使用開始 を参照してください。

最初の手順として、領域の専門家は測定値の時系列データなどの予測に関連するデータを SageMaker Canvas に取り込みます。今回の記事上では、合成した電気モーターの測定データが入った CSV ファイルを使用しています。詳細については、Canvas へのデータのインポートを参照してください。使用されたサンプルデータは CSV してダウンロード可能です。

SageMaker Canvas でデータを選別する

データが取り込まれた後、領域の専門家は SageMaker Canvas 上で最終的に使用するモデルで使うデータを選別できます。このために、領域の専門家はモデルを構築する上で重要な特徴量を含む列をデータから選択します。具体的には、圧力と温度曲線のような物理的な関係によって相関する列を選択し、その関係の変化により、今回の課題にとって異常を示唆すると判断した列を選択します。このような処理を行うことで、異常検知モデルは選択された列間の正常な関係を学習し、モーターの現在の負荷からするとモーターの温度が異常に高くなっているといったような、通常のふるまいとは異なる状態を検知することができます。

具体的には、領域の専門家はモデルを構築する上で必要なインプットとなるデータと、予測の対象とする列がどれかを選択する必要があります。入力データは通常、機器の振る舞いを決定する測定可能な数値またはカテゴリデータ(例:設定値、負荷、速度、機器の周辺温度など)になります。また、予測対象となる列は多くの場合、機械の動作性能を示す数値で、たとえば、エネルギーの浪費を測定できる温度、他には機械が最適でない条件で動作している場合に変化する性能指標などが挙げられます。

入力データと予測対象となる列として選択すべき数値の概念を説明するために、いくつかの例を考えてみましょう。

  • 回転部分のある装置の場合、たとえばこの記事で構築するモデルのように、典型的な入力データは回転速度、トルク(現在値と履歴)、また機器の周囲の温度です。ターゲット値は良好な運転条件を示すベアリングまたはモーターの温度です。
  • 風力タービンの場合、典型的な入力データは、風速と回転翼の設定の現在値と最近の履歴であり、ターゲット値は発電量または回転速度です。
  • 化学プロセス機器の場合、典型的な入力データはさまざまな原料の割合と周囲の温度であり、ターゲット値は生成される熱、または最終製品の粘度などです。
  • 引き戸などの可動部分がある機器の場合、典型的な入力データはモーターへの電力供給量であり、ターゲット値は移動の速度または動作完了までの時間です。
  • HVAC システムの場合、典型的な入力データは実際に発生した温度差と出力設定であり、ターゲット値は測定されたエネルギー消費量です。

一般的には、機器に対する適切な入力と予測の対象値は、ユースケースや検出したい異常な挙動により様々です。個々のデータセットが複雑であることを十分に知っている領域の専門家は、このことを熟知しています。

大抵は、適切な入力データとターゲット値を選択することは、適切なデータのみを選別し、ターゲット値となる列(たとえば bearing_temperature)に注目することを意味します。さらに領域の専門家は、SageMaker Canvas のノーコード機能を使用してデータ項目を変換し、データをより良い選別をかけたり、集約することもできます。たとえば、現在のケースとは全く関連のない日付やタイムスタンプをデータから抽出したり、またはフィルタリングをかけることができます。SageMaker Canvas はこの手順をサポートしており、選択した数値の統計を表示して、数値に外れ値やばらつきがあるかどうかを分かりやすく表示します。

モデルのトレーニング、チューニング、および評価

領域の専門家データセットから、適切な列を選択した後、入力と出力の関係を学習させるためのモデルのトレーニングが可能になります。正確にいうと、モデルは入力から選択された目標値を予測するように学習します。

ここで、SageMaker Canvas のモデルプレビューの機能を使用できます。この機能では期待されるモデルの品質について迅速に把握できます。また、各々の入力が出力の数値に与える影響を確認することができます。たとえば、次のスクリーンショットでは、モデルは bearing_temperature を予測する際に motor_speedambient_temperatureの数値に最も影響を受けています。これは理にかなっており、双方の温度の数値は密接な関係にあります。また、摩擦や他のエネルギー損失の要因も、さらに影響を与える可能性があります。

モデルの品質については、RMSE という、モデルがトレーニングデータ内の正常な挙動をどれだけうまく学習して、正しく入力と出力の関係を再現できたかを示す指標があります。たとえば、次に示すモデルでは、モデルが正しい motor_bearingの 温度を 3.67 度以内で予測できるべきであり、そのため、仮に実際の温度がモデル予測から 7.4 度以上ずれている場合は、異常と見なすことができます。ただし、実際に使用する閾値は、異常検知を適用するシナリオにおいて、どの程度異常に対して敏感に反応するべきかにより、変わってきます。

最後に、モデル評価とチューニングが完了したら、推論に使用するモデルを作成する、完全なモデルトレーニングを開始します。

モデルのデプロイ

SageMaker Canvas は推論用のモデルを作成できますが、効率的な異常検知の仕組みを展開するためには、SageMaker Canvas の外でモデルをデプロイする必要があります。より正確に言うと、モデルをエンドポイントで動作するようにデプロイする必要があります。

この記事では分かりやすくするため、SageMaker Canvas から直接モデルをエンドポイントとしてデプロイします。手順については、「エンドポイントへのモデルデプロイ」を参照してください。デプロイ名をメモし、デプロイ先のインスタンスタイプ(本稿では ml.m5.large )の料金がかかることに注意してください。デプロイ後、SageMaker Canvas は予測をするために呼び出しできるモデルエンドポイントを作成します。

製造業の現場では、モデルはデプロイされる前に徹底したテストを行われなければなりません。このため、領域の専門家は、おそらく直接デプロイなどはせず、代わりに一旦、 SageMaker Model Registry にモデルを共有します。ここで MLOps 担当者が作業を引き継ぐことになります。通常、MLOps 担当者はモデルの推論エンドポイントをテストし、アプリケーションのサーバーなどのターゲットとなるコンピュート環境がどれくらい必要かを見積もり、サーバーレス推論やバッチ推論など、さらにコスト効率の良いデプロイメントが可能かどうかを判断します。これらのステップは、たとえば、Amazon SageMaker PipelinesAmazon SDK で提供されている自動機能のステップで簡単に実現できます。

異常検出のためにモデルを使用する

前のステップでは、SageMaker Canvas において canvas-sample-anomaly-model というモデルのデプロイメントをしました。このモデルを使用して、データセットの他の列のデータから bearing_temperature の予測値を取得できます。ここでは、作成したエンドポイントを使用して異常を検出したいと思います。

データ内の異常を特定するため、このモデルは予測モデルのエンドポイントを使用してターゲットのメトリクスの期待値を取得します。そして、予測値とデータの実測値を比較します。予測値は、トレーニングのデータに基づいて予測した、ターゲットのメトリクスの期待値になります。この値との差は、観測された実際のデータの異常の大きさを示す指標となります。以下のコードを使用できます:

# pandas dataframes をデータ処理に使います
import pandas as pd
import boto3,json
sm_runtime_client = boto3.client('sagemaker-runtime')

# モデルの呼び出しのための設定
 endpoint_name="canvas-sample-anomaly-model"
 
# 入力データを予測と比較するための列
TARGET_COL='bearing_temperature'

def do_inference(data, endpoint_name):
# SageMaker Canvas によって提供されたコードの例

body = data.to_csv(header=False, index=True).encode("utf-8")
response = sm_runtime_client.invoke_endpoint(Body = body,
    EndpointName = endpoint_name, 
   ContentType = "text/csv",
   Accept = "application/json",
   )
return json.loads(response["Body"].read())

def input_transformer(input_data, drop_cols = [ TARGET_COL ] ):
  # 入力データを変換:ターゲットの列を削除
  return input_data.drop(drop_cols,axis =1 )
 
def output_transformer(input_data,response):
  # 最初の入力データの数値を予測モデルの返答と比較する
    scored = input_data.copy()
    scored.loc[ input_data.index,'prediction_'+TARGET_COL ] = pd.DataFrame(
response[ 'predictions' ],
index = input_data.index 
)['score']
    scored.loc[ input_data.index,'error' ] = (
scored[ TARGET_COL ]-scored[ 'prediction_'+TARGET_COL ]
).abs()
    return scored
  
# 予測をする
raw_input = pd.read_csv(MYFILE) # データの予測値を読みこむ
to_score = input_transformer(raw_input) # データを準備する
predictions = do_inference(to_score, endpoint_name) # 予測値を作成する
results = output_transformer(to_score,predictions) # 予測値と実際の値を比較する

このコードは次の処理を行います:

  1. 入力データを適切な特徴量のみにフィルタリングされます(関数 input_transformer)。
  2. フィルタリングされたデータで SageMaker モデルエンドポイントが呼び出されます(関数do_inference)。ここでは、SageMaker Canvas のデプロイメントの詳細ページを開いたときに提供されるサンプルコードに従って、入力と出力のフォーマットを処理しています。
  3. 呼び出しの結果が元の入力データに結合され、差分がエラー列に格納されます(関数output_transform)。

外れ値を見つけ異常状態かどうか評価する

多くの場合では、データの異常を検出するためのコードは Lambda 関数で実行されます。Lambda 関数はアプリケーションや Amazon API Gateway などから呼び出されます。関数の主な役割は入力データの各行に対して異常スコアを返します。この場合、異常スコアは時系列となります。

テスト段階では、SageMaker ノートブックでもコードを実行できます。以下のグラフは、サンプルデータを使用した際のモデルの入力と出力です。予測値と実際の値(下部グラフに示された異常スコア)との差がピークになる部分が異常となります。たとえば、このグラフでは、異常スコア(期待温度と実際温度との差)が 7 度を超える 3 つの明確なピークを確認することができます。最初は長いアイドルタイムの後、2 番目は ベアリングの温度 (bearing_temperature)の急激な低下時、最後はモーター速度( motor_speed) に対して(bearing_temperature) が高い時です。

多くの場合、異常スコアの時系列データを知るだけで十分ですが、重要度の高い機器が異常を検知した際に通知を行いたい場合は、モデルの感度に応じて閾値を設定することもできます。もしかしたら、現在見えているスコアでも、機械に調査を必要とする異常状態がある、と考えるべきかもしれません。たとえば、このモデルでは、異常スコアの絶対値は以下のグラフに示すように分布しています。これは、ほとんどの異常スコアがトレーニング中に見つかった、よくある誤差の範囲内である (2xRMS=) 8 度未満であったことになります。このグラフはどの箇所が正常なのか異常なのかを目で見て判断するような、手動で閾値を選択する際に役立ちます。

もし出力された値から異常と判断すべき状態であれば、モデルから提供される異常スコアをビジネス用途に使えるよう、業務利用に適切なもののみに絞り込む必要があります。このため、ML 専門家は多くの場合、ノイズや大きなピークを除去する目的で、例えば移動平均の追加などの後処理を行います。また、ML 専門家は、Amazon CloudWatch で特定の期間内に閾値を超えた数値に対してのアラームを送信などを設定し、異常スコアを監視します。アラーム設定について詳しくは、Amazon CloudWatch アラームの使用 を参照してください。こういった評価を Lambda 関数内で実行して、たとえば Amazon Simple Notification Service (Amazon SNS) トピックへの警告をすることもできます。

クリーンアップ

このソリューションをご利用になった後、不要なリソースの費用の発生を避けるために以下の作業をご検討ください。

  1. SageMaker Canvas でモデルのエンドポイントのデプロイメントを特定して、削除します。
  2. SageMaker Canvas からログアウトして、アイドル時間の課金を防ぎます

まとめ

この記事では領域の専門家がコードを書くことなく、SageMaker Canvas を使用して入力データを評価し、 ML モデルを作成する方法をお伝えしました。また、SageMaker Canvas と Lambda を使用したシンプルな手順で、このモデルを使ったリアルタイムの機器の異常検出を行う方法を紹介しました。この組み合わせによって、領域の専門家がデータサイエンスのトレーニングを受けなくても、自身の知識を活かし、強力な ML モデルを作成できるようになりますし、さらには MLOps 担当者もこれらモデルを利用し柔軟かつ効率的な推論が可能になります。

SageMaker Canvas には 2 か月間の無料利用枠があります。その後は使用した分のみ料金が発生します。データを最大限に活用するため、今日から ML を実験してみてください。

本ブログはソリューションアーキテクトの伊藤ジャッジ向子が翻訳しました。原文はこちら


著者について

Helge Aufderheide は、自動化と分析や機械学習を、製造業や自動車産業などにおいての活用を推進し、現実世界でのデータの有効利用を推進する活動をしています