![見出し画像](https://assets.st-note.com/production/uploads/images/30858191/rectangle_large_type_2_7566280a16a9132d08461e26224da38b.jpg?width=1200)
ML.netでCSVファイルの異常値を検出する その3
前回のソースコード、動くようになりました。
しかし、ちょっと気になることがあります。
データレコード数を取得して異常値の判定や、変化の兆候を検出しています。
この異常値の判定や変化の兆候を検出するための基準が不明です。
コメントから察すると2か所の部分を改良すれば、判定結果も変わりそうです。
//スパイク検出のために、IidSpikeEstimator を使用してモデルをトレーニングします。
var iidSpikeEstimator = mlContext.Transforms.DetectIidSpike(outputColumnName:nameof(ProductSalesPrediction.Prediction),
inputColumnName: nameof(ProductSalesData.numSales),confidence: 95, pvalueHistoryLength: docSize / 4);
//iidChangePointEstimator を作成します。
var iidChangePointEstimator = mlContext.Transforms.DetectIidChangePoint(outputColumnName:nameof(ProductSalesPrediction.Prediction),
inputColumnName: nameof(ProductSalesData.numSales),confidence: 95, changeHistoryLength: docSize / 4);
DetectIidSpikeから見ていきましょう。
学習と判定のための入力カラム名の部分、怪しい表記がありますね。
confidence: 95
pvalueHistoryLength: docSize / 4
confidenceは0から100までを指定でき、スパイク検出の信頼度を指定するそうです。
この数値を操作することで、検出する基準を調整出来そうです。
pvalueHistoryLengthはInt32の数値を指定しますが、サンプルデータの数字だと36÷4で9が入力されます。
スライディングウィンドウと記載があるので、学習や判定のために数値9個単位で判定すると思われます。
DetectIidChangePointを見ていきます。
こちらも学習と判定のための入力カラム名の部分、同じように怪しい表記があります。
confidenceは0から100までを指定でき、スパイク検出の信頼度を指定するそうです。
この数値を操作することで、検出する基準を調整出来そうです。
changeHistoryLengthもInt32の数値を指定しますが、サンプルデータの数字だと36÷4で9が入力されます。
スライディングウィンドウと記載があるので、学習や判定のために数値9個単位で判定すると思われます。
DetectIidSpikeもDetectIidChangePointも基本的な使い方は似ています。
判別するデータによって、2つの指定する値を調整しながら、異常値や変化の兆候を見つけるのが良さそうです。
場合によっては、VB.net側から、4個の数値を変化させるような改良も実用的だと思います。
このサンプルソースコードでは、固定値のように扱われていますが、現実のプログラムとして扱う時にとても重要になります。
プログラムを作る人と運用する人が別れているのであれば、検査基準を様子を見ながら変えられる仕組みが便利そうです。
こういう実際にプログラムを作る立場と使う側の両方に関連するヒント、初心者にとってはとても重要なアドバイスなんだけど、なかなかインターネットでは見かけません。
そうそう、最後にもうひとつだけ。
プログラムを実際に運用する場合、ロギングと例外処理は忘れないでくださいね。
こちらのソースコードは、以下で公開されているサンプルソースを元に作成しています。
https://docs.microsoft.com/ja-jp/dotnet/machine-learning/
資料を印刷して読みたい方、PDFファイルのアドレスは以下です。
https://docs.microsoft.com/ja-jp/dotnet/opbuildpdf/machine-learning/toc.pdf?branch=live