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

Eric zhou發表於2019-06-23

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

  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  安裝了VS2017的 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專案

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

  

  2. 選擇樣本資料,進行訓練,預測

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

  

  3. 開始樣本資料的訓練

   訓練的時間和資料量有關係,一般的:

  

   


   這裡我們嘗試了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

相關文章