見出し画像

VB.netからC#で書かれた時系列予測(AI・機械学習)の処理を呼び出す・その5

架空の体重を計測したCSVファイルを作りました。
体重の増減、本物のように見えるけれど、中身はまったくランダムな数値にしています。

日時,体重
2019/1/1,70
2019/1/2,69.7
2019/1/3,69.6
~省略~
2019/12/29,66.8
2019/12/30,67.2
2019/12/31,67.5

プログラムを動かすために、必要なデータ類を準備するのも大事です。
プログラムを作ったけれど、試しに動かすデータが無ければ、正しく動作する処理なのか判断できません。

デバッガで値を入れるのも大事ですが、実際に工夫してデータを作るのも大事です。
今回はCSVファイルですので、エクセルで乱数を作成し、日々の体重増減が1kg以内にしています。

このコード、以下のWebアドレスに掲載されているものを基本にしています。
https://docs.microsoft.com/ja-jp/dotnet/machine-learning/

印刷して学びたい場合もPDFファイルがあるので参考になります。
https://docs.microsoft.com/ja-jp/dotnet/opbuildpdf/machine-learning/toc.pdf?branch=live

#学習 #勉強 #AI #機械学習 #プログラミング

#Visual #CSharp #BASIC #ソースコード #Windows #自動判定

#時間 #予測 #次の日の値

肝心のC#で作ったクラスライブラリーのソースコードは以下になります。

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.Transforms.TimeSeries;

namespace ClassLibrary1
{

//学習を行うためのデータクラス
public class ModelInput
{
//計測した日付
[LoadColumn(0)]
public DateTime MeasurementDateTime { get; set; }

//体重
[LoadColumn(1)]
public float BodyWeight { get; set; }
}


public class ModelOutput
{
//予測期間の予測値
public float[] ForecastedBodyWeight { get; set; }

//予測期間の予測される最小値
public float[] LowerBodyWeight { get; set; }

//予測期間の予測される最大値
public float[] UpperBodyWeight { get; set; }
}

public class Class1
{
public void SampleMachineLearning(string SpecifyWorkingFolder)
{

//csvの物理的な場所
string csvFilePath = Path.Combine(SpecifyWorkingFolder, "BodyWeight.csv");

//MLContext の新しいインスタンスで mlContext 変数を初期化します。
//MLContext クラスは、すべての ML.NET 操作の開始点で、mlContext を初期化することで、
//モデル作成ワークフローのオブジェクト間で共有できる新しい ML.NET 環境が作成されます。
//これは Entity Framework における DBContext と概念的には同じです。
MLContext mlContext = new MLContext();

//データを読み込んで変換する
//ML.NET では、数値またはテキストの表形式データを記述する柔軟で効率的な方法として、IDataView クラスを使います。
//IDataView は、テキスト ファイルを読み込むか、またはリアルタイムで読み込むことができます
//(たとえば、SQL データベースまたはログ ファイル)。
//入力データのクラス TaxiTrip
//トレーニング用CSV dataPath
//CSVにヘッダがあるか true=ある false=なし
//CSVの区切文字 ,
IDataView dataView = mlContext.Data.LoadFromTextFile <ModelInput>(csvFilePath, hasHeader: true, separatorChar: ',');

//時系列解析パイプラインを定義する
//1. SsaForecastingEstimator を使用して時系列データセット内の値を予測するパイプラインを定義します。

//forecastingPipeline では、1 年目用の 365 のデータ ポイントとサンプルを取得するか、
//seriesLength パラメーターで指定された 30 日(月単位) 間隔に時系列データセットを分割します。
//これらの各サンプルは、毎週または 7 日間の期間で解析されます。
//次の期間の予測値がどのようになるかを判断する際には、前の 7 日間の値を使用して予測が行われます。
//モデルは、horizon パラメーターで定義されているように、7 つの期間を将来まで予測するように設定されています。
//予測は情報に基づいた推測であるため、100 % 正確であるとは限りません。
//したがって、上限と下限によって定義される最善のシナリオと最悪のシナリオにおける値の範囲を把握しておくことをお勧めします。
//この場合、下限と上限の信頼レベルは95 % に設定されています。
//信頼レベルは、状況に応じて増減できます。
//値が大きいほど、望ましい信頼レベルを達成するために上限と下限の範囲が広くなります。

var forecastingPipeline = mlContext.Forecasting.ForecastBySsa(
//変換後のカラム名
outputColumnName: "ForecastedBodyWeight",

//変換前のカラム名
inputColumnName: "BodyWeight",

//ウインドウの長さ、7日間のデータから予測
windowSize: 7,

//バッファーに保持される長さ
seriesLength: 30,

//トレーニングに使用される長さ
trainSize: 365,

//何日間の予測をするか
horizon: 1,

//予測の信頼度
confidenceLevel: 0.95f,

//信頼度の下限を設定するカラム名
confidenceLowerBoundColumn: "LowerBodyWeight",

//信頼度の上限を設定するカラム名
confidenceUpperBoundColumn: "UpperBodyWeight");


//2. Fit メソッドを使用して、モデルをトレーニングし、以前に定義した forecastingPipeline にデータを適合させます。
SsaForecastingTransformer forecaster = forecastingPipeline.Fit(dataView);


//TimeSeriesPredictionEngine を作成します。
//TimeSeriesPredictionEngine は、単一の予測を行うための便利な方法です。
var forecastEngine = forecaster.CreateTimeSeriesEngine<ModelInput, ModelOutput>(mlContext);

//実際に予測させます
Forecast(dataView, forecastEngine);

}

//モデルを使用して需要を予測する

static void Forecast(IDataView testData, TimeSeriesPredictionEngine<ModelInput, ModelOutput> forecaster)
{
//Predict メソッドを使用して、次の 7 日間のレンタルを予測します。
ModelOutput forecast = forecaster.Predict();


//予測出力を反復処理し、コンソールに表示します。
Console.WriteLine("BodyWeight Forecast");
Console.WriteLine("---------------------");

for (Int64 i = 0; i < forecast.ForecastedBodyWeight.Length; i++)
{
Console.WriteLine(i.ToString());
Console.WriteLine("ForecastedBodyWeight:" + forecast.ForecastedBodyWeight[i].ToString());
Console.WriteLine("UpperBodyWeight:" + forecast.UpperBodyWeight[i].ToString());
Console.WriteLine("LowerBodyWeight:"+forecast.LowerBodyWeight[i].ToString());
Console.WriteLine("");
}

}

}
}

いいなと思ったら応援しよう!