#author("2019-06-07T12:47:05+09:00","default:kyo-in","kyo-in")
#author("2019-06-07T13:21:20+09:00","default:kyo-in","kyo-in")
**機械学習による図形推定(学習モデル作成編) [#fe389f61]
前回は作成済みの学習モデルを読み込んで使用したが,今回はML.netで学習モデルを作成する手順を紹介する.

***学習データの作成 [#w8ce39e2]
学習データ作成用のUIを作る必要がある.以下の例では事前にユーザがこれから何を描くかラベル(正解)を指定して,学習データ(StrokeData)を作成している.

#ref(../第4回/learning.gif,50%);

***学習データの読み込み [#baed2ded]
前回の,ストロークを特徴ベクトルに変換しラベル(正解)が付けられたデータ群がリストstrokeDatasに蓄積されていたとすると,
前回の,ストロークを特徴ベクトルに変換しラベル(正解)が付けられたデータ群がList<StrokeData> strokeDatasに蓄積されていたとすると,

 mLContext = new MLContext();
 IDataView trainingData = mLContext.Data.LoadFromEnumerable(strokeDatas); //1
 DataOperationsCatalog.TrainTestData splitDataView = 
 mLContext.Data.TrainTestSplit(trainingData, testFraction: 0.2); //2

1で,ML.netで使用するためデータを読み込む.mLContext.Data.LoadFromEnumerableメソッドにより,IEnumerableを実装したクラス(ArrayやList<>)などからデータを読み込める.

2で,データをトレーニング用と評価テスト用に分ける.0.2で2割のデータを評価テスト用としている.

***パイプラインの作成 [#e8fd6eca]
ML.netでは入力されたデータを実際学習に使用するデータへの加工→学習モデルの作成
ML.netでは入力されたデータを学習に使用するデータへの加工→学習モデルの作成
などの作業をパイプラインとして定義(作成)しておく.また,機械学習ではデータの前処理なども大きな仕事となるので,データを処理するだけのパイプラインを作ることもできる.

 var pipeline = mLContext.Transforms.Concatenate("Features", new[] { "DirCount" })
                .Append(mLContext.BinaryClassification.Trainers.SdcaLogisticRegression(
                   labelColumnName: "Label", featureColumnName: "Features"));
 var pipeline = mLContext.Transforms.Concatenate("Features", new[] { "DirCount" }).Append(mLContext.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: "Label", featureColumnName: "Features"));


上記コードではまず,Transforms.Concatenateで,データ(StrokeData)の"DirCount"メンバを特徴ベクトルとして,"Features"属性にしている.

続けて,.Appendで次の作業を登録する.ここではSdcaLogisticRegressionを利用した二項分類のトレーナーで学習モデルを作る作業を登録している.

SdcaLogisticRegressionでは,データの"Label"属性をラベル(正解)として,"Features"属性を特徴ベクトルとして学習を行うよう引数で指示している.


***学習モデルの作成 [#cba212d5]
前述の作成したパイプラインに学習データのトレーニング分を入力することで学習モデルを作成する.

 strokePredictModel = pipeline.Fit(splitDataView.TrainSet);


***学習モデルの保存 [#q6c66fd4]
作成した学習モデルはzipファイルで保存できる.保存する際は学習データのSchemaが必要となる.

            if (strokePredictModel != null)
            {
                Windows.Storage.StorageFolder storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
                Windows.Storage.StorageFile modelFile = await storageFolder.CreateFileAsync("model.zip", Windows.Storage.CreationCollisionOption.ReplaceExisting);
 
                IDataView data = mlContext.Data.LoadFromEnumerable<StrokeData>(strokeDatas);
                using (System.IO.Stream stream = await modelFile.OpenStreamForWriteAsync())
                {
                    mlContext.Model.Save(strokePredictModel, data.Schema, stream);
                    stream.Flush();
                }
            }

***学習モデルの評価 [#g5bc2778]
必須ではないが,テスト用のデータで作成した学習モデルの評価を行う.

 IDataView predictions = strokePredictModel.Transform(splitDataView.TestSet); 
 CalibratedBinaryClassificationMetrics metrics = 
 mLContext.BinaryClassification.Evaluate(predictions, "Label");
 
 AddMessage("");
 AddMessage("Model quality metrics evaluation");
 AddMessage("--------------------------------");
 AddMessage($"Accuracy: {metrics.Accuracy:P2}");
 AddMessage($"Auc: {metrics.AreaUnderRocCurve:P2}");
 AddMessage($"F1Score: {metrics.F1Score:P2}");
 AddMessage("=============== End of model evaluation ===============");


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS