#author("2019-06-10T12:01:51+09:00","default:kyo-in","kyo-in")
**µ¡³£³Ø½¬¤Ë¤è¤ë¿Þ·Á¿äÄê¡Ê³Ø½¬¥â¥Ç¥ëºîÀ®ÊÔ¡Ë [#fe389f61]
Á°²ó¤ÏºîÀ®ºÑ¤ß¤Î³Ø½¬¥â¥Ç¥ë¤òÆɤ߹þ¤ó¤Ç»ÈÍѤ·¤¿¤¬¡¤º£²ó¤ÏML.net¤Ç³Ø½¬¥â¥Ç¥ë¤òºîÀ®¤¹¤ë¼ê½ç¤ò¾Ò²ð¤¹¤ë¡¥

***³Ø½¬¥Ç¡¼¥¿¤ÎºîÀ® [#w8ce39e2]
³Ø½¬¥Ç¡¼¥¿ºîÀ®ÍѤÎUI¤òºî¤ëɬÍפ¬¤¢¤ë¡¥°Ê²¼¤ÎÎã¤Ç¤Ï»öÁ°¤Ë¥æ¡¼¥¶¤¬¤³¤ì¤«¤é²¿¤òÉÁ¤¯¤«¥é¥Ù¥ë¡ÊÀµ²ò¡Ë¤ò»ØÄꤷ¤Æ¡¤³Ø½¬¥Ç¡¼¥¿¡ÊStrokeData¡Ë¤òºîÀ®¤·¤Æ¤¤¤ë¡¥

#ref(../Âè4²ó/learning.gif,50%);

***³Ø½¬¥Ç¡¼¥¿¤ÎÆɤ߹þ¤ß [#baed2ded]
Á°²ó¤Î¡¤¥¹¥È¥í¡¼¥¯¤òÆÃħ¥Ù¥¯¥È¥ë¤ËÊÑ´¹¤·¥é¥Ù¥ë¡ÊÀµ²ò¡Ë¤¬ÉÕ¤±¤é¤ì¤¿¥Ç¡¼¥¿·²¤¬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¤Ç¤ÏÆþÎϤµ¤ì¤¿¥Ç¡¼¥¿¤ò³Ø½¬¤Ë»ÈÍѤ¹¤ë¥Ç¡¼¥¿¤Ø¤Î²Ã¹©¢ª³Ø½¬¥â¥Ç¥ë¤ÎºîÀ®
¤Ê¤É¤Îºî¶È¤ò¥Ñ¥¤¥×¥é¥¤¥ó¤È¤·¤ÆÄêµÁ¡ÊºîÀ®¡Ë¤·¤Æ¤ª¤¯¡¥¤Þ¤¿¡¤µ¡³£³Ø½¬¤Ç¤Ï¥Ç¡¼¥¿¤ÎÁ°½èÍý¤Ê¤É¤âÂ礭¤Ê»Å»ö¤È¤Ê¤ë¤Î¤Ç¡¤¥Ç¡¼¥¿¤ò½èÍý¤¹¤ë¤À¤±¤Î¥Ñ¥¤¥×¥é¥¤¥ó¤òºî¤ë¤³¤È¤â¤Ç¤­¤ë¡¥

 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 ===============");

**Äó½ÐÊýË¡ [#l8c978b9]
´°À®¤·¤¿²ÝÂê¤Î.sln¥Õ¥¡¥¤¥ë¤Î¤¢¤ë¥Õ¥©¥ë¥À¤´¤È¤Þ¤È¤á¤Æ°Ê²¼¼ø¶È¥Õ¥©¥ë¥À¡¢Âè5²ó¤ËÄó½Ð¤¹¤ë¤³¤È¡£

Äù¤áÀÚ¤ê:

6·î14Æü(¶â)18»þ

\\nas002.term.usmc.dendai.ac.jp\¼ø¶ÈÍѥ¥¯¥¹¥Ú¡¼¥¹\Àé½»¥­¥ã¥ó¥Ñ¥¹\Á°´ü\̤Íè²Ê³ØÉô\­¢¾ðÊó¥á¥Ç¥£¥¢³Ø²Ê\FI3¾ðÊó¥á¥Ç¥£¥¢´ðÁÃ¥¼¥ß(¿¹Ã«Í§¾¼)·î2\Âè05²ó\Äó½Ð

¥È¥Ã¥×   ¿·µ¬ °ìÍ÷ ¸¡º÷ ºÇ½ª¹¹¿·   ¥Ø¥ë¥×   ºÇ½ª¹¹¿·¤ÎRSS