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

近期團隊在研究機器學習,但願經過機器學習實現補丁發佈評估,系統異常檢測。業務場景概括一下:git

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

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

先拉個提綱吧:算法

1. ML.Net Model Builder 介紹及安裝部署機器學習

2. 典型場景示例編輯器

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

   首先,ML.Net Model Builder是什麼?它有什麼做用?工具

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

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

   沒有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。

2、典型場景示例

  第一大章節,咱們將整個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

相關文章
相關標籤/搜索