機械学習:Azure Machine Learning Time Series Analysis for Anomalies

異常検出は、さまざまなセンサーからのデータフローの一時的な変化を収集して分析するモノのインターネット(IoT)ソリューションの最も重要な機能の1つです。 多くの場合、データストリームは時間の経過とともに大きな変化を受けません。 ただし、表示される場合、これはほとんどの場合、システムに異常が発生し、その動作が中断される可能性があることを意味します。 この記事では、Azure Machine Learning機械学習サービスの時系列異常検出モジュールを使用して、異常なセンサーパフォーマンスを判断する方法を示します。







このトピックを展開するには、前の記事までに開発したRemoteCameraユニバーサルWindowsプラットフォーム(UWP)アプリケーションの機能を展開し、異常な値が表示されるリストを追加します。 RemoteCameraアプリケーションは、Webカメラから画像を受け取り、その明るさを計算します。これは、シーンが変更されない限り、特定の値を中心に変動します。 たとえば、カメラを手で覆うことにより、明るさを簡単に変更できます。これにより、データストリームに顕著な偏差が生じます。 これは、時系列の異常を検出するための適切なサンプルを取得するのに役立ちます。







異常検索



James McKaffrey による最近の記事によると、異常を検出する標準的な方法は時系列回帰に基づいています。 データにモデルを重ね合わせると、傾向を予測し、すべてのインジケーターがそれらに対応するかどうかを確認できます。 これを行うには、予測指標と実際の指標を比較します。 大きな違いは、逸脱または異常を示します。



最初に、Zスコアを分析することにより、このような偏差を見つける方法を示します。 この推定値が大きいほど、バリューストリームに偏差がある可能性が高くなります。 異常を見つけるには、通常と見なされるz推定値の境界を決定する必要があります。 指定された制限を超えるすべてのZスコアは異常と見なされます。 このシナリオで設定された固定しきい値により、多数の誤検知が発生する可能性があることに注意してください。 それらの数を減らすには、より複雑なアルゴリズムを適用します。 この場合、Azure Time Series Anomaly Detectionモジュールは、特定の値を検出する確率を失うことなく一連のデータを任意に再編成できるかどうかを分析する順列マルチンゲールに基づいています。 簡単に言えば、各値が等しい確率でデータセットで検出できるかどうかです。 可換データセットの異常係数は低くなっています。 可換性に違反すると、異常係数が増加し、非標準値を示します。



この記事では、このような機械学習アルゴリズムの作成方法を説明します。 Microsoft Azure Machine Learning Studioソリューションを使用します。 James McCaffreyも2014年9月にこの製品について話しました 。 この記事のトピックを拡大し、機械学習の実験を示します。 さらに、結果のソリューションをWebサービスとして展開する方法、およびこのサービスをRemoteCameraアプリケーションで使用する方法を示します。



データセットのトレーニング



最初に、トレーニング用のデータを収集できるタブを追加してRemoteCameraアプリケーションを拡張し、チェックボックスを使用して異常検出モードを有効または無効にします。







(メインタブのコントロールボタンを使用して)カメラから画像のプレビューを開始すると、トレーニングデータセットの取得ボタンがアクティブになります。 このボタンをクリックすると、アプリケーションはトレーニング用のデータの収集を開始します。 このプロセスはバックグラウンドで行われ、その進行には円形のアニメーションが伴います。 その結果、100個のデータポイントで構成されるトレーニングデータセットが作成されます。 それらのそれぞれは、BrightnessDataPoint構造のインスタンスによって表されます。



public struct BrightnessDataPoint { public DateTime Time { get; private set; } public byte Brightness { get; private set; } public BrightnessDataPoint(byte brightness) { Time = DateTime.Now; Brightness = brightness; } }
      
      





BrightnessDataPoint構造体は、明るさの値と、それが修正された時刻を保存します。 次に、このような値のセットがBrightnessData.csvファイルにエクスポートされます。これは次のようになります。



 Time,Brightness 9/8/2017 11:30:00,103 9/8/2017 11:30:01,103 9/8/2017 11:30:02,102 9/8/2017 11:30:03,42 9/8/2017 11:30:04,46 9/8/2017 11:30:05,149 9/8/2017 11:30:06,99 9/8/2017 11:30:07,101 9/8/2017 11:30:08,104
      
      





次に、トレーニングデータセットの正確な場所がテキストボックスに表示されます。 コンマ区切り値(CSVファイル)を使用します。 Machine Learning Studioで簡単にダウンロードできます。



この機能を実装するために、BrightnessFileStorageとAnomalyDetectorの2つのクラスを作成しました。 最初のBrightnessFileStorageクラスは、付随するコードのAnomalyDetectionサブフォルダーのBrightnessFileStorage.csファイルによって定義されます。 BrightnessFileStorageクラスは、 DataWriterクラスを使用してBrightnessDataPointオブジェクトのセットをCSVファイルに保存します。



2番目のクラスであるAnomalyDetectorは、異常検出に関連するロジックを処理します。 特に、パブリックなAdd-TrainingValueメソッドが含まれています。このメソッドは、画像の明るさを計算した直後に呼び出されます(付属コードのMainPage.xaml.csファイルのImageProcessor_ProcessingDoneイベントハンドラーを参照)。 AddTrainingValueは次のように機能します。 まず、BrightnessDataPointのインスタンスを作成し、それをセットに追加します。 コレクションに100個の要素がある場合、CSVファイルに保存します。 次に、MainPageで処理されるTrainingDataReadyイベントを起動します。 目標は、トレーニングのためにデータの収集を中断し、ユーザーインターフェイスにファイルの場所を表示することです。



 private async void AnomalyDetector_TrainingDataReady( object sender, TrainingDataReadyEventArgs e) { await ThreadHelper.InvokeOnMainThread(() => { remoteCameraViewModel.IsTrainingActive = false; remoteCameraViewModel.TrainingDataSetFilePath = e.FilePath; }); }
      
      





 private const int trainingDataSetLength = 100; private List<BrightnessDataPoint> trainingDataSet = new List<BrightnessDataPoint>(); public event EventHandler<TrainingDataReadyEventArgs> TrainingDataReady; public async Task AddTrainingValue(byte brightness) { trainingDataSet.Add(new BrightnessDataPoint(brightness)); // Check if all data points were acquired if (trainingDataSet.Count == trainingDataSetLength) { // If so, save them to csv file var brightnessFileStorage = await BrightnessFileStorage.CreateAsync(); await brightnessFileStorage.WriteData(trainingDataSet); // ... and inform listeners that the training data set is ready TrainingDataReady?.Invoke(this, new TrainingDataReadyEventArgs( brightnessFileStorage.FilePath)); } }
      
      





トレーニングデータセットの場所がテキストボックスに表示され、そこから簡単にコピーしたり、Windowsエクスプローラーに貼り付けたり、受信したデータを表示したりできます。



Zスコア分析



トレーニングデータセットを受け取った後、2014年のJames McKaffreyによる記事に記載されている指示に従って、Machine Learning Studioで最初の実験を準備します。 まず、BrightnessData.csvファイルをアップロードしてから、ビジュアルコンストラクターを使用して実験を計画します。 つまり、すべてのコンポーネントは、Machine Learning Studioウィンドウの左側のメニューにあります。 実験の計画に要素を配置するには、実験領域にドラッグします(これはMachine Learning Studioウィンドウの中央部分です)。 各コンポーネントには、独自の入力データと出力データがあります。 モジュール間のデータの流れを制御するには、互換性のあるノードを接続する必要があります。 コンポーネントには、プロパティウィンドウ(Machine Learning Studioウィンドウの右側)で設定できる追加の設定がある場合があります。







上記の機械学習アルゴリズムは、実験とWebサービスの2つのモードで機能します。 違いは入力データのみです。 実験モードでは、それらの役割はトレーニング用にロードされたデータセット(BrightnessData)であり、Webサービスモードでは、独自の入力データです。 モードに関係なく、入力データはデータセットに変換され、その後、輝度列の値はz推定値への変換によって正規化さます。 この変換中に、輝度値はz推定値に変換され、平均値に対する散乱が表示されます。 スプレッドは標準偏差で測定されます。 この広がりが大きいほど、現在の値が異常である可能性が高くなります。 多くの場合、基本または通常の明るさのレベルはカメラのキャプチャ内容に依存するため、zレーティングの正規化を使用します。 したがって、zスコアへの変換は、正規化が0に近い場合に正しい輝度レベルを提供します。未加工の輝度値は、約40〜150の範囲で変化します。正規化後、すべての輝度値は約–4.0〜+4.0 したがって、異常な値を見つけるには、しきい値フィルターを適用するだけです。 Azure Machine Learningで、下限しきい値が–2で上限しきい値が1.5のOutOfRangeしきい値フィルターを適用します。 Zスコアグラフに基づいてこれらの値を選択し、Machine Learning Studioのしきい値フィルタープロパティパネルで設定しました。







しきい値を指定すると、データセットは論理タイプのデータの列になり、特定の瞬間にポイントが特定の範囲外にあるかどうかが示されます。 この情報を、異常と判断された実際の輝度値で補足するために、この列を元のデータセットと組み合わせて、結果セットを2つのサブセットに分割します。 1つは異常な値のみを含み、2番目は標準です。 分割する前に、列のデータ型を変更します。これは、データの分割モジュールがブール値をサポートしていないためです。 この後、実験は最初のサブセットになります。 Webサービスの場合、この結果はクライアントに渡されます。 データセットの値を表示するには、[結果データセット]オプションを使用します。 Machine Learning Studioのデータセットコンテキストメニューから視覚化します。 この実験をすでに実行している場合、このオプションを使用できます。







機械学習における時系列分析



それでは、Azure Time Series Anomaly Detection(ATSAD)モジュールを使用して異常を検出する方法を学びましょう。 以下に示すように、この実験のプロセスは前のプロセスに似ています。 初期データセットは、zスコアへの変換によって正規化され、ATSADモジュールに転送されます(Machine Learning Studioの時系列ノードにあります)。 これを行うには、プロパティウィンドウ(bit.ly/2xUGTg2)でいくつかの入力パラメーターを構成する必要があります 。 最初にデータと時間の列を指定する必要があり、次にマーチンゲールのタイプを設定します。 私たちの場合、マーチンゲールパワーを使用します。 別のテキストフィールドが使用可能になります-イプシロン、0〜1の範囲の検出器感度値を入力できます。次に、値のストレンジネスを決定する関数の3つのパラメーターを構成する必要があります。











次に、ログ内のマルチンゲール値とストレンジネス値の最大数を設定する必要があります。 10〜1000の任意の整数を入力できます。試行錯誤により、次の検出器設定に決めました。





検出器の最後のパラメーターは警告しきい値です。 異常値の最小係数を設定します。 デフォルトの警告しきい値は3.5です。 私の実験では、この値を2に変更しました。



ATSADモジュールの出力データの視覚化を要求すると、2つの列が入力データセットに追加されていることがわかります。偏差を測定する異常係数と、異常値を示すバイナリ値(0または1)の警告インジケーターです。 2番目のインジケーターの読み取り値に基づいて、データセットを2つのサブセット(標準値と異常値)に分割します。 実験の結果、異常値のサブセットのみが生成されます。 他の詳細については、実験は以前のものと同一であり、再度説明することはしません。 Webサービスの実験の最も重要な側面は、入力と出力の説明であることに注意してください。 このデータを次のように呼び出します。データ(Webサービス入力)およびAnomalyDetectionResult(Webサービス出力)。



Webサービスクライアント



実験を設定した後、それらをWebサービスとしてデプロイし、RemoteCameraアプリケーションを介してそれらにアクセスし、画像の明るさの異常なインジケーターを検出できます。 Webサービスを作成するには、実験を開始してから、Machine Learning Studioウィンドウの下部にある[Webサービスのデプロイ]アイコンをクリックする必要があります。 Webサービスの入力および出力モジュールを実験に追加していない場合は、この領域に[Webサービスのセットアップ]ボタンが表示されます。 クリックすると、Webサービスの入力および出力モジュールが実験に追加され、ボタン名が[Webサービスのデプロイ]に変わります。







Webサービスの展開プロセスが完了すると、Webサービスのコントロールパネルが開きます。 このパネルには、デプロイされたWebサービスの概要、APIキー、および要求の送信と応答の処理に関する指示(APIヘルプページ)が表示されます。 特に、リクエスト/レスポンスハイパーリンクをクリックすると、WebサービスのURLとJSON形式のリクエストとレスポンスの詳細な構造が表示されます。







次に、APIキーを保存し、JSONUtilsサービス(jsonutils.com)を使用してJSONからC#へのマッピングを作成します。 次に、結果のクラスを適切なファイル-AnomalyDetectionサブフォルダー内のAnomalyDetectionRequest.csおよびAnomalyDetectionResponse.csに保存します。 構造は似ています-通常、両方のファイルには、ほとんど自動的に実装されるプロパティを持つクラスが含まれます。 AnomalyDetectionRequestとAnomalyDetectionResponseは、クライアントとWebサービス間の対応するJSONオブジェクトの転送です。 たとえば、AnomalyDetectionRequestクラスと依存オブジェクトの定義を以下に示します。 ConversionHelperヘルパークラスを使用して、輝度データポイントのセットをMachine Learning Studio Webサービスの入力データ形式(2次元文字列配列)に変換することに注意してください。 このヘルパークラスの完全な定義は、付随するコードに含まれています。 このクラスには2つのパブリックメソッドがあります。 彼らの助けを借りて、輝度データポイントのセットは文字列[、](BrightnessDataToStringTable)に、またはその逆(AnomalyDetectionResponseToBrightnessData)に変換されます。



 public class AnomalyDetectionRequest { public Inputs Inputs { get; set; } public GlobalParameters GlobalParameters { get; set; } public AnomalyDetectionRequest( IList<BrightnessDataPoint> brightnessData) { Inputs = new Inputs() { Data = new Data() { ColumnNames = new string[] { "Time", "Brightness" }, Values = ConversionHelper. BrightnessDataToStringTable(brightnessData) } }; } } public class Inputs { public Data Data { get; set; } } public class Data { public string[] ColumnNames { get; set; } public string[,] Values { get; set; } } public class GlobalParameters { }
      
      





JSONからC#へのオブジェクトのマッピングを作成したら、Webサービスクライアントの作成を開始できます。 これを行うには、まずMicrosoft.AspNet.WebApi.Client NuGetパッケージをインストールし、それを使用してAnomalyDetectionClientクラスを定義します(添付コードの対応するファイルを参照)。 このクラスには、baseAddress、apiKey、httpClientの3つのプライベートフィールドがあります。 最初のフィールドにはMachine Learning Studio WebサービスのURLが含まれ、2番目のフィールドにはAPIキーが含まれます。 これらの値は両方とも(以前にインストールされたNuGetパッケージから)HttpClientクラスのインスタンスを作成するために使用されます。



 public AnomalyDetectionClient() { httpClient = new HttpClient() { BaseAddress = new Uri(baseAddress), }; httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey); }
      
      





クライアントを作成したら、AnomalyDetectionClient.DetectAnomalyAsyncメソッドを使用してMachine Learning Studio Webサービスへの要求の送信を開始できます。 このメソッドは、輝度データポイントのセットをテストデータとして提供します。 このテストデータは、実験に使用したCSVファイルの代わりに使用されます。 彼らの助けを借りて、AnomalyDetectionリクエストのインスタンスが作成されます。 このクラスのインスタンスは、PostAsJsonAsync拡張メソッドを使用した分析のためにWebサービスに送信されます。 受信したJSON応答はAnomalyDetectionResponseクラスのインスタンスに変換され、最終的にDetectAnomalyAsync関数によって返されます。 エラーを探します。 必要に応じて、例外を「スロー」します。



 public async Task<IList<BrightnessDataPoint>> DetectAnomalyAsync(IList<BrightnessDataPoint> brightnessData) { var request = new AnomalyDetectionRequest(brightnessData); var response = await httpClient.PostAsJsonAsync(string.Empty, request); IList<BrightnessDataPoint> result; if (response.IsSuccessStatusCode) { var anomalyDetectionResponse = await response.Content.ReadAsAsync<AnomalyDetectionResponse>(); result = ConversionHelper. AnomalyDetectionResponseToBrightnessData(anomalyDetectionResponse); } else { throw new Exception(response.ReasonPhrase); } return result; }
      
      





AnomalyDetectionClientは、AnomalyDetectorクラスのAddTestValueメソッドで使用されます。 AddTrainingValueと同様に、AddTestValueもImageProcessor_ProcessingDoneイベントハンドラーによって呼び出されます(添付コードのMainPage.xaml.csを参照)。 ただし、AddTestValueの動作は、AddTrainingValueメソッドとは少し異なります。 AddTrainingValueで、明るさデータポイントをBrightnessDatasetクラスのインスタンスに追加します。このクラスは、一般的なListクラスを内部的に使用して移動間隔を導入します。 テスト値はこの間隔で保存されます(James McKaffreyの10月の記事を参照)。 デフォルトでは、スライド間隔は30要素ですが、この値はBrightnessDatasetコンストラクターを使用して変更できます。 以下に示すように、間隔を埋めた後、分析のためにデータを送信します。 次に、Webサービスによって発行された一連の異常値に要素が存在するかどうかを確認します。 要素が存在する場合は、異常をリスナーに渡すためにも使用されるAnomalyDetectedイベントを起動します。



 public event EventHandler<AnomalyDetectedEventArgs> AnomalyDetected; private BrightnessDataset dataSet = new BrightnessDataset(); public async Task AddTestValue(byte brightness) { dataSet.Add(new BrightnessDataPoint(brightness)); if (dataSet.IsFull) { try { var anomalousValues = await anomalyDetectionClient. DetectAnomalyAsync(dataSet.Data); if (anomalousValues.Count > 0) { AnomalyDetected?.Invoke(this, new AnomalyDetectedEventArgs(anomalousValues)); } } catch (Exception ex) { Debug.WriteLine(ex); } } }
      
      





インターフェイスに異常な値を表示するには、MainPageクラスのAnomalyDetectedイベントを次のように処理します。



 private async void AnomalyDetector_AnomalyDetected( object sender, AnomalyDetectedEventArgs e) { await ThreadHelper.InvokeOnMainThread(() => { foreach (var anomalousValue in e.AnomalousValues) { if (!remoteCameraViewModel.AnomalousValues.Contains(anomalousValue)) { remoteCameraViewModel.AnomalousValues.Add(anomalousValue); } } }); }
      
      





取得した値のセットを繰り返し処理して、ローカルデータストア(ビューモデルのAnomalousValuesプロパティ)に既に追加されているかどうかを確認します。 そうでない場合は、観測値のセットに追加します。 この結果、最初の図に示されているリストには新しい異常値のみが表示されます。 Webサービスへの2つの連続した要求の間、移動間隔で1つの要素のみが変更されたため、この追加チェックが必要です。



ソリューションをテストするには、RemoteCameraアプリケーションを起動し、カメラからの画像のプレビューを開始し、[異常検出]タブのチェックボックスをオンにして異常の検索を有効にする必要があります。 その後、カメラを手で覆うことで異常な値を作成できます。 機械学習検出器は、これらの異常値をすばやく検出し、リストボックスに表示します。



おわりに



Azure Machine Learning Studioで2つの異なる異常検出実験を作成する方法を示しました。 両方の実験はWebサービスとしても展開され、異常を検出するためにマシン分析のためにローカルに取得された時系列データを送信するRemoteCameraクライアントアプリケーションと組み合わされました。 この場合、WebアプリケーションサービスのUniversal Windows Platform(UWP)を使用しました。 同じコードを使用して、ASP.NET Webアプリケーションを介してWebサービスにアクセスできます。この場合、機械学習ロジックはエンドポイントではなくサーバー側で処理されます。 IoTのコンテキストでは、そのようなポイントは単純なセンサーである可能性があります。



マイクロソフト開発者学校



11月28〜30日、キエフで、Open Hack形式の開発者の最初の学校が開催されます。



2〜5人のチームは、社内の既存のプロジェクトで作業したり、別の関連プロジェクトの技術スタックに精通することができます。



主なトピックは次のとおりです。





イベントに参加するには、 登録する必要があります



All Articles