дÔÚÇ°Ãæ
×¼±¸½üÆÚ½«Î¢ÈíµÄmachinelearning-samples·Òë³ÉÖÐÎÄ£¬Ë®Æ½ÓÐÏÞ£¬ÈçÓдí©£¬Çë´ó¼Ò¶à¶àÖ¸Õý¡£
Èç¹ûÓÐÅóÓѶԴ˸ÐÐËȤ£¬¿ÉÒÔ¼ÓÈëÎÒ£ºhttps://github.com/feiyun0112/machinelearning-samples.zh-cn
eShopDashboardML - ÏúÊÛÔ¤²â
ML.NET °æ±¾ | API ÀàÐÍ | ״̬ | Ó¦ÓóÌÐòÀàÐÍ | Êý¾ÝÀàÐÍ | ³¡¾° | »úÆ÷ѧϰÈÎÎñ | Ëã·¨ |
---|---|---|---|---|---|---|---|
v0.7 | ¶¯Ì¬ API | ×îа汾 | ASP.NET Core WebÓ¦ÓóÌÐòºÍ¿ØÖÆÌ¨Ó¦ÓóÌÐò | SQL Server ºÍ .csv Îļþ | ÏúÊÛÔ¤²â | »Ø¹é | FastTreeTweedie »Ø¹é |
eShopDashboardMLÊÇÒ»¸öʹÓÃML.NET ½øÐУ¨Ã¿¸ö²úÆ·ºÍÿ¸öµØÇø£©ÏúÊÛÔ¤²âµÄWebÓ¦ÓóÌÐò¡£
¸ÅÊö
Õâ¸öÖÕ¶ËʾÀýÓ¦ÓóÌÐòͨ¹ýÕ¹ÏÖÒÔÏÂÖ÷Ìâ×ÅÖØ½éÉÜML.NET APIµÄÓ÷¨:
- ÈçºÎѵÁ·£¬½¨Á¢ºÍÉú³ÉMLÄ£ÐÍ
- ʹÓÃ.NET CoreʵÏÖÒ»¸ö¿ØÖÆÌ¨Ó¦ÓóÌÐò¡£
- ÈçºÎʹÓþ¹ýѵÁ·µÄMLÄ£ÐÍ×öϸöÔµÄÏúÊÛÔ¤²â
- ʹÓÃASP.NET Core RazorʵÏÖÒ»¸ö¶ÀÁ¢µÄ£¬µ¥ÌåWebÓ¦ÓóÌÐò¡£
¸ÃÓ¦ÓóÌÐò»¹Ê¹ÓÃÒ»¸öSQL ServerÊý¾Ý¿â´æ´¢³£¹æ²úƷĿ¼ºÍ¶©µ¥ÐÅÏ¢£¬¾ÍÏñÐí¶àʹÓÃSQL ServerµÄµäÐÍWebÓ¦ÓóÌÐòÒ»Ñù¡£ÔÚ±¾ÀýÖУ¬ÓÉÓÚËüÊÇÒ»¸öʾÀý£¬Òò´ËĬÈÏÇé¿öÏÂʹÓÃlocaldb SQLÊý¾Ý¿â£¬Òò´Ë²»ÐèÒªÉèÖÃÕæÕýµÄSQL Server¡£ÔÚµÚÒ»´ÎÔËÐÐWebÓ¦ÓóÌÐòʱ£¬½«´´½¨localdbÊý¾Ý¿â²¢°üº¬Ê¾ÀýÊý¾Ý¡£
Èç¹ûҪʹÓÃÕæÕýµÄSQL Server»òAzure SQLÊý¾Ý¿â£¬Ö»Ðè¸ü¸ÄÓ¦ÓóÌÐòÖеÄÁ¬½Ó×Ö·û´®¼´¿É¡£
ÕâÊÇWebÓ¦ÓóÌÐòµÄÒ»¸öÏúÊÛÔ¤²âÆÁÄ»½ØÍ¼Ê¾Àý£º
ÑÝÁ·£ºÈçºÎÉèÖÃ
Á˽âÈçºÎÔÚ Visual Studio ÖÐÉèÖÃÒÔ¼°¶Ô´úÂëµÄ½øÒ»²½ËµÃ÷£º
ÔÚ Visual Studio ÖÐÉèÖà eShopDashboard ²¢ÔËÐÐWebÓ¦ÓóÌÐò
- ´´½¨ºÍѵÁ·ÄúµÄMLÄ£ÐÍ
- ´Ë²½ÖèÊÇ¿ÉÑ¡µÄ£¬ÒòΪWebÓ¦ÓóÌÐòÒÑÅäÖÃΪʹÓÃÔ¤ÏÈѵÁ·µÄÄ£ÐÍ¡£ µ«ÊÇ£¬Äú¿ÉÒÔ´´½¨×Ô¼ºµÄѵÁ·Ä£ÐÍ£¬²¢½«Ô¤ÏÈѵÁ·µÄÄ£ÐÍÓëÄú×Ô¼ºµÄÄ£Ðͽ»»»¡£
ÑÝÁ·£ºML.NET´úÂëʵÏÖ
ÎÊÌâ
Õâ¸öÎÊÌâÊÇ»ùÓÚ֮ǰµÄÏúÊÛÇé¿öÎ§ÈÆµØÇøºÍ²úÆ·½øÐÐÏúÊÛÔ¤²â
Êý¾Ý¼¯
ΪÁ˽â¾öÕâ¸öÎÊÌ⣬Äú½¨Á¢ÁËÁ½¸ö¶ÀÁ¢µÄMLÄ£ÐÍ£¬ËüÃÇÒÔÒÔÏÂÊý¾Ý¼¯×÷ΪÊäÈ룺
Êý¾Ý¼¯ | ÁÐ |
---|---|
products stats | next, productId, year, month, units, avg, count, max, min, prev |
country stats | next, country, year, month, max, min, std, count, sales, med, prev |
ML ÈÎÎñ - »Ø¹é
Õâ¸öʾÀýµÄMLÈÎÎñÊǻع飬ËüÊÇÒ»¸öÓмලµÄ»úÆ÷ѧϰÈÎÎñ£¬ÓÃÓÚ´ÓÒ»×éÏà¹ØµÄÌØÕ÷/±äÁ¿ÖÐÔ¤²âÏÂÒ»¸öÖÜÆÚµÄÖµ£¨ÔÚ±¾ÀýÖÐÊÇÏúÊÛÔ¤²â£©¡£
½â¾ö·½°¸
ΪÁ˽â¾öÕâ¸öÎÊÌ⣬Ê×ÏÈÎÒÃǽ«½¨Á¢MLÄ£ÐÍ£¬Í¬Ê±¸ù¾ÝÏÖÓÐÊý¾ÝѵÁ·Ã¿¸öÄ£ÐÍ£¬ÆÀ¹ÀÆäÓжàºÃ£¬×îºóʹÓÃÄ£ÐÍÔ¤²âÏúÊÛ¡£
×¢Ò⣬¸ÃʾÀýʵÏÖÁËÁ½¸ö¶ÀÁ¢µÄÄ£ÐÍ£º
- ÏÂÒ»¸öÖÜÆÚ£¨Ô£©²úÆ·ÐèÇóÔ¤²âÄ£ÐÍ
- ÏÂÒ»¸öÖÜÆÚ£¨Ô£©µØÇøÏúÊÛÔ¤²âÄ£ÐÍ
µ±È»£¬µ±Ñ§Ï°/Ñо¿´ËʾÀýʱ£¬Äú¿ÉÒÔÖ»¹Ø×¢ÆäÖÐÒ»¸ö³¡¾°/Ä£ÐÍ¡£
1. ½¨Á¢Ä£ÐÍ
ÄúÐèҪʵÏֵĵÚÒ»²½ÊǶ¨ÒåÒª´ÓÊý¾Ý¼¯Îļþ¼ÓÔØµÄÊý¾ÝÁУ¬ÈçÏÂÃæµÄ´úÂëËùʾ£º
½¨Á¢²¢ÑµÁ·Ä£ÐÍ
var textLoader = mlContext.Data.TextReader(new TextLoader.Arguments ???????????????????????{ ???????????????????????????Column = new[] { ???????????????????????????????new TextLoader.Column("next", DataKind.R4, 0 ), ???????????????????????????????new TextLoader.Column("productId", DataKind.Text, 1 ), ???????????????????????????????new TextLoader.Column("year", DataKind.R4, 2 ), ???????????????????????????????new TextLoader.Column("month", DataKind.R4, 3 ), ???????????????????????????????new TextLoader.Column("units", DataKind.R4, 4 ), ???????????????????????????????new TextLoader.Column("avg", DataKind.R4, 5 ), ???????????????????????????????new TextLoader.Column("count", DataKind.R4, 6 ), ???????????????????????????????new TextLoader.Column("max", DataKind.R4, 7 ), ???????????????????????????????new TextLoader.Column("min", DataKind.R4, 8 ), ???????????????????????????????new TextLoader.Column("prev", DataKind.R4, 9 ) ???????????????????????????}, ???????????????????????????HasHeader = true, ???????????????????????????Separator = "," ???????????????????????});
È»ºó£¬ÏÂÒ»²½Êǹ¹½¨×ª»»¹ÜµÀ£¬²¢Ö¸¶¨ÒªÊ¹ÓÃʲôѵÁ·Æ÷/Ëã·¨¡£
ÔÚ±¾ÀýÖУ¬Äú½«½øÐÐÒÔÏÂת»»£º
- Á¬½Óµ±Ç°ÌØÕ÷Éú³ÉÃûΪNumFeaturesµÄÐÂÁÐ
- ʹÓöÀÈȱàÂëת»»productId
- Á¬½ÓËùÓÐÉú³ÉµÄÌØÕ÷Éú³ÉÃûΪ¡®Features¡®µÄÐÂÁÐ
- ¸´ÖÆ¡°next¡±Áн«ÆäÖØÃüÃûΪ¡°Label¡±
- Ö¸¶¨¡°Fast Tree Tweedie¡±ÑµÁ·Æ÷×÷ΪËã·¨Ó¦ÓÃÓÚÄ£ÐÍ
ÔÚÉè¼Æ¹ÜµÀÖ®ºó£¬Äú¿ÉÒÔ½«Êý¾Ý¼¯¼ÓÔØµ½DataViewÖУ¬¶øÇҴ˲½ÖèÖ»ÊÇÅäÖã¬DataViewÊÇÑÓ³Ù¼ÓÔØ£¬ÔÚÏÂÒ»²½ÑµÁ·Ä£ÐÍ֮ǰÊý¾Ý²»»á±»¼ÓÔØ¡£
var trainingPipeline = mlContext.Transforms.Concatenate(outputColumn: "NumFeatures", "year", "month", "units", "avg", "count", "max", "min", "prev" ) ???.Append(mlContext.Transforms.Categorical.OneHotEncoding(inputColumn:"productId", outputColumn:"CatFeatures")) ???.Append(mlContext.Transforms.Concatenate(outputColumn: "Features", "NumFeatures", "CatFeatures")) ???.Append(mlContext.Transforms.CopyColumns("next", "Label")) ???.Append(trainer = mlContext.Regression.Trainers.FastTreeTweedie("Label", "Features"));var trainingDataView = textLoader.Read(dataPath);
2. ѵÁ·Ä£ÐÍ
ÔÚ½¨Á¢¹ÜµÀÖ®ºó£¬ÎÒÃÇͨ¹ýʹÓÃËùÑ¡Ëã·¨ÄâºÏ»òʹÓÃѵÁ·Êý¾ÝÀ´ÑµÁ·Ô¤²âÄ£ÐÍ¡£ Ôڸò½ÖèÖУ¬Ä£Ðͱ»½¨Á¢£¬ÑµÁ·²¢×÷Ϊ¶ÔÏ󷵻أº
var model = trainingPipeline.Fit(trainingDataView);
3. ÆÀ¹ÀÄ£ÐÍ
ÔÚ±¾ÀýÖУ¬Ä£ÐÍµÄÆÀ¹ÀÊÇÔÚʹÓý»²æÑéÖ¤·½·¨ÑµÁ·Ä£ÐÍ֮ǰִÐеģ¬Òò´ËÄú½«»ñµÃָʾģÐÍ׼ȷ¶ÈµÄÖ¸±ê¡£
var crossValidationResults = mlContext.Regression.CrossValidate(trainingDataView, trainingPipeline, numFolds: 6, labelColumn: "Label"); ???????????ConsoleHelper.PrintRegressionFoldsAverageMetrics(trainer.ToString(), crossValidationResults);
4. ±£´æÄ£Ð͹©×îÖÕÓû§µÄÓ¦ÓóÌÐòÉÔºóʹÓÃ
Ò»µ©´´½¨ºÍÆÀ¹ÀÁËÄ£ÐÍ£¬¾Í¿ÉÒÔ½«Ëü±£´æµ½.ZIPÎļþÖУ¬ÈκÎ×îÖÕÓû§µÄÓ¦ÓóÌÐò¶¼¿ÉÒÔͨ¹ýÒÔÏ´úÂëʹÓÃËü£º
using (var file = File.OpenWrite(outputModelPath)) ???model.SaveTo(mlContext, file);
5. Óüòµ¥µÄ²âÊÔÔ¤²âÊÔÓÃÄ£ÐÍ
¼òµ¥µØËµ£¬Äú¿ÉÒÔ´Ó.ZIPÎļþÖмÓÔØÄ£ÐÍ£¬´´½¨Ò»Ð©Ê¾ÀýÊý¾Ý£¬´´½¨¡°Ô¤²âº¯Êý¡±£¬×îºó½øÐÐÔ¤²â¡£
ITransformer trainedModel;using (var stream = File.OpenRead(outputModelPath)){ ???trainedModel = mlContext.Model.Load(stream);}var predictionFunct = trainedModel.MakePredictionFunction<ProductData, ProductUnitPrediction>(mlContext);Console.WriteLine("** Testing Product 1 **");// Build sample dataProductData dataSample = new ProductData(){ ???productId = "263", ???month = 10, ???year = 2017, ???avg = 91, ???max = 370, ???min = 1, ???count = 10, ???prev = 1675, ???units = 910};//model.Predict() predicts the nextperiod/month forecast to the one providedProductUnitPrediction prediction = predictionFunct.Predict(dataSample);Console.WriteLine($"Product: {dataSample.productId}, month: {dataSample.month + 1}, year: {dataSample.year} - Real value (units): 551, Forecast Prediction (units): {prediction.Score}");
ÒýÓÃ
eShopDashboardMLÊý¾Ý¼¯ÊÇ»ùÓÚUCI(http://archive.ics.uci.edu/ml/datasets/online+retail) µÄÒ»¸ö¹«¹²ÔÚÏßÁãÊÛÊý¾Ý¼¯
Daqing Chen, Sai Liang Sain, ºÍ Kun Guo, ÔÚÏßÁãÊÛÒµµÄÊý¾ÝÍÚ¾ò: »ùÓÚRFMÄ£Ð͵ÄÊý¾ÝÍÚ¾ò¿Í»§Ï¸·Ö°¸ÀýÑо¿, Êý¾Ý¿âÓªÏúÓë¿Í»§Õ½ÂÔ¹ÜÀíÔÓÖ¾, Vol. 19, No. 3, pp. 197a€¡°208, 2012 (ӡˢǰÔÚÏß·¢²¼: 27 August 2012. doi: 10.1057/dbm.2012.17).
ML.NET ʾÀý£º»Ø¹éÖ®ÏúÊÛÔ¤²â
ÔÎĵØÖ·£ºhttps://www.cnblogs.com/feiyun0112/p/10090896.html