ML.NET技術研究系列-1入門篇

近期團隊在研究機器學習,希望通過機器學習實現補丁發布評估,系統異常檢測。業務場景歸納一下:

  1. 收集整理數據(發布相關的異常日志、告警數據),標識出補丁發布情況(成功、失敗)
  2. 選擇一個機器學習的Model進行Train訓練
  3. 基于訓練出的模型(準確度要高)進行最新補丁發布情況預測

典型的機器學習-監督學習的場景。作為.Net的忠實用戶,最近火熱的ML.NET務必要嘗試、應用一把。今天這篇文章作為一個入門,分享給大家。

先拉個提綱吧:

1. ML.Net Model Builder 介紹及安裝部署

2. 典型場景示例

一、ML.Net Model Builder介紹及安裝部署

   首先,ML.Net Model Builder是什么?它有什么作用?

   https://marketplace.visualstudio.com/items?itemName=MLNET.07

   Model Builder是一個簡單的UI工具,供開發人員在其應用程序中構建,培訓和發布自定義機器學習模型。

   沒有ML專業知識的開發人員可以使用這個簡單的可視化界面連接到存儲在文件或SQL Server中的數據,訓練模型并生成用于模型培訓和消費的代碼。

   一句話總結一下:機器學習建模工具,通過一個VS Designer 可視化構建一個機器學習模型。同時生成一個示例和向導代碼,可重復使用。

   1. 安裝部署

   官方的推薦是:Visual Studio 2017 15.9.12 or later

   我本機安裝了VS2019和VS2017 Enterprise版,直接通過https://marketplace.visualstudio.com/items?itemName=MLNET.07 下線了VS擴展插件MLNET_Model_Builder.vsix。雙擊安裝:

   VSIXInstaller.NoApplicableSKUsException: This extension is not installable on any currently installed products.

   當前安裝的VS無法安裝這個擴展,一頓google,https://github.com/dotnet/machinelearning-samples/issues/451   依舊解決不了。重新安裝了VS2017和VS2019 然并卵。

   最后,找到官方的推薦的VS:Visual Studio 2017 15.9.12 or later  安裝了社區版的VS2019的 vs_community__425161747.1541050689 

   

   終于安裝成功。

   2. 新建一個 .Net Core控制臺Project,添加Machine Learning項目

   

    彈出 ML.Net Model Builder設計器,說明可以開始機器學習建模了。

   3. 開始機器學習建模

   微軟將機器學習建模的典型場景進行了抽象和分類,主要有以下三種: 

   regression:回歸類機器學習模型:典型場景有:價格預測、銷售額預測等等

   binary classification:二元分類機器學習模型,典型場景有:用戶評論情感分析(消極 or 積極)、交易風險預測(是 or 否)

   multi-classification:多維分類機器學習模型。典型場景有:用戶畫像、數據分類

   另外,ML.Net 還支持自定義建模。

   

 4. 準備Train 機器學習訓練需要的樣本數據

   通過微軟提供的示例樣本數據和場景下,目前機器學習訓練的樣本數據都是結構化的數據,確定的維度、值。同時,需要對要預測的維度數據進行Label標識和標注。

   總結概況一下:

  1.    樣本數據必須是結構化的數據,確定的列和值
  2.    樣本數據由各個維度列和一個預測維度列組成
  3.    樣本數據中預測維度列的值需要手工標注,以便進行機器學習訓練

   從上面的總結可以看出,ML.NET 屬于監督學習這一類。

   樣本數據的格式:支持CSV(逗號間隔)、TSV(Tab間隔)和SQL Server。

   至于怎么另存為TSV文件,其實很簡單,Copy示例數據到文本編輯器,另存為**.tsv文件即可。https://raw.githubusercontent.com/dotnet/machinelearning/master/test/data/wikipedia-detox-250-line-data.tsv

   選擇輸入結構化的樣本數據后,要指定一個機器學習要預測的列。

5. Train訓練、評估

   指定輸入的數據和要預測的列,進行訓練。訓練的過程會評估AutoML中提供的各種算法的準確度。

   Train訓練的時間,隨數據量的不同而不同

   訓練完成后,會輸出一個最佳準確度的算法,同時生產一個模型文件,MLModel.zip, 供后續預測使用。

6. 生成可重復執行的代碼

   即將ML.NET Model Builder 設計器向導的配置,生成可重復執行的代碼:兩個C# Project,一個Model的Project,一個Console的Project。

二、典型場景示例

  第一大章節,我們將整個ML.NET的建模過程做了梳理,現在我們以微軟的示例代碼,做一個實踐應用。

  這次我們選擇用戶反饋情感分析這個場景,這幾天我想了一下,這個場景的實際價值是:線上爬取指定產品的用戶評論和反饋,通過機器學習預測出產品的熱度、問題,后續進行產品完善和市場活動。

  話不多說,開始吧。

  1. 準備TSV數據

   這個非常簡單:https://raw.githubusercontent.com/dotnet/machinelearning/master/test/data/wikipedia-detox-250-line-data.tsv,這個文本拷貝到Sublime Text中,另存為data.tsv文件

  2. 新建.Net Core Console 應用,右鍵添加 Machine Learning項目

    在選擇場景步驟中,我們選擇第一個,“情感分析”

  

  3.  選擇樣本數據,進行訓練,預測

  選擇第一步我們準備好的data.tsv文件,指定一個要預測的列Sentiment

  

  4. 開始樣本數據的訓練

   訓練的時間和數據量有關系,一般的:

  

   


   這里我們嘗試了10s和30s,推薦的算法和準確度沒有變化,只是嘗試機器學習訓練的算法要多:

  

  5. 生成可重復執行的代碼工程

   

 

  生成代碼后,會在當前解決方案中多了兩個Project,一個是Model的Project,一個Console的Project,我們深入看一下

  

  其中Model Project中主要包含:

  模型的輸入類和輸出類,其中:

  •   輸入類ModelInput是對我們輸入數據的結構化描述
  •   輸出類ModelOutput是包含預測列和評估準確度

  還有一個機器學習樣本數據訓練完成后的MLModel.zip文件,供后續數據預測用。

  Console Project中,主要形成了一個可重復執行的代碼:重點看Main函數的代碼:

  

 1  //Machine Learning model to load and use for predictions
 2         private const string MODEL_FILEPATH = @"MLModel.zip";
 3 
 4         //Dataset to use for predictions 
 5         private const string DATA_FILEPATH = @"C:\Users\zhougq\Desktop\Data.tsv";
 6 
 7         static void Main(string[] args)
 8         {
 9             MLContext mlContext = new MLContext();
10 
11             // Training code used by ML.NET CLI and AutoML to generate the model
12             //ModelBuilder.CreateModel();
13 
14             ITransformer mlModel = mlContext.Model.Load(GetAbsolutePath(MODEL_FILEPATH), out DataViewSchema inputSchema);
15             var predEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel);
16 
17             // Create sample data to do a single prediction with it 
18             ModelInput sampleData = CreateSingleDataSample(mlContext, DATA_FILEPATH);
19 
20             // Try a single prediction
21             ModelOutput predictionResult = predEngine.Predict(sampleData);
22 
23             Console.WriteLine($"Single Prediction --> Actual value: {sampleData.Sentiment} | Predicted value: {predictionResult.Prediction}");
24 
25             Console.WriteLine("=============== End of process, hit any key to finish ===============");
26             Console.ReadKey();
27         }

   上面的代碼解讀一下:

  •     構建一個MLContext
  •     MLContext上加載訓練好的模型(MLModel.zip)
  •     輸入要預測的數據
  •     預測,輸出結果(ModelOutput)

  上面的代碼是一個點睛之筆,我們可以想象一下:

  1. 每天正常的機器學習、訓練,優化模型

  2. 線上數據,通過Kafka、文本等數據源,實時接入數據,進行預測

  3. 對預測的結果進行評估、對樣本數據再糾正和標注,直至模型的準確率更高

  4. 作用與線上業務決策

  5. Loop

  是不是很贊,很簡單,很容易理解,簡化了我們對機器學習的建模、算法選擇和評估。生產力工具,技術普惠。

  給ML.NET 點贊。

  后續我們將基于ML.NET實現更多的業務場景,逐步分享給大家。

 

周國慶

2019/6/23

posted @ 2019-06-23 10:37  Eric zhou  閱讀(...)  評論(...編輯  收藏
内蒙古快3开奖结果 意甲什么时候恢复 微乐河南麻将微信版本开挂 10分赛车计划彩虹 闲来陕西麻将app 上海天天彩选4最新开奖 捕鱼来了怎么蹲核弹鱼 棋牌斗牛下载 陕西麻将版全版本 体彩七星彩预测 天才麻将少女漫画 *pk10 股票新股申购什么意思 幸运赛车彩票手机版 宝博棋牌苹果下载 北京快乐8任二计划 天天好运来抢红包