共用方式為


使用 ML.NET CLI 分析情感

瞭解如何使用 ML.NET CLI 來自動產生 ML.NET 模型和基礎 C# 程式代碼。 您可以提供數據集和您想要實作的機器學習工作,而 CLI 會使用 AutoML 引擎來建立模型產生和部署原始程式碼,以及分類模型。

在本教學課程中,您將執行下列步驟:

  • 準備所選機器學習工作的數據
  • 從 CLI 執行 mlnet classification 命令
  • 檢閱品質計量結果
  • 了解產生的 C# 程式代碼,以在應用程式中使用模型
  • 探索用來訓練模型所生成的 C# 程式碼

注意

本文參考目前處於預覽狀態的 ML.NET CLI 工具,而且數據可能會變更。 如需詳細資訊,請流覽 ML.NET 頁面。

ML.NET CLI 是 ML.NET 的一部分,其主要目標是在學習 ML.NET 時,為 .NET 開發人員「民主化」ML.NET,因此您不需要從頭開始撰寫程式代碼。

您可以在任何命令提示字元 (Windows、Mac 或 Linux) 上執行 ML.NET CLI,根據您提供的定型數據集產生高品質的 ML.NET 模型和原始程式碼。

先決條件

您可以從 Visual Studio 或使用 dotnet run (.NET CLI) 來執行產生的 C# 程式代碼專案。

準備您的數據

我們將使用用於「情感分析」案例的現有數據集,這是二元分類機器學習工作。 您可以使用自己的數據集,以類似的方式產生模型和程序代碼。

  1. 下載 UCI 情感捲標句子數據集 zip 檔案(請參閱下列附註中的引文),然後將它解壓縮到您選擇的任何資料夾。

    注意

    本教學課程使用了一個來自「使用深層特徵從群組到個別標籤」的數據集,該數據集由 Kotzias 等人提供。 KDD 2015,託管於 UCI 機器學習資料庫 - Dua, D. 和 Karra Taniskidou, E. (2017 年)。 UCI Machine Learning 存放庫 [http://archive.ics.uci.edu/ml]。 CA 歐文:加州大學資訊與計算機科學學院。

  2. yelp_labelled.txt 檔案複製到您先前建立的任何資料夾(例如 /cli-test)。

  3. 開啟您慣用的命令提示字元,並移至您複製資料集檔案的資料夾。 例如:

    cd /cli-test
    

    使用 Visual Studio Code 之類的任何文字編輯器,您可以開啟並探索 yelp_labelled.txt 數據集檔案。 您可以看到 結構為:

    • 檔案沒有標頭。 您將使用欄位的索引。

    • 只有兩個欄:

      文字 (欄索引 0) 標籤 (欄索引 1)
      哇。。。喜歡這個地方。 1
      餅皮不好。 0
      不好吃,口感令人噁心。 0
      ...更多文字欄位... ...(1 或 0)...

    請務必從編輯器關閉數據集檔案。

    現在,您已準備好開始使用此「情感分析」場景的 CLI。

    注意

    完成本教學課程之後,您也可以嘗試使用自己的數據集,只要這些數據集已準備好用於 ML.NET CLI 預覽目前支援的任何 ML 工作,「二元分類」、「分類」、「回歸」、「建議」

執行 'mlnet classification' 命令

  1. 執行下列 ML.NET CLI 命令:

    mlnet classification --dataset "yelp_labelled.txt" --label-col 1 --has-header false --train-time 10
    

    此指令會執行 mlnet classification 命令

    • 適用於 ML 工作分類
    • 會使用 數據集檔案 yelp_labelled.txt 作為定型和測試數據集(在內部 CLI 會使用交叉驗證,或在兩個數據集中分割,一個用於定型,另一個用於測試)
    • 您想要預測的 目標/標的數據行(通常稱為 'label'),是索引為 1 的 數據行(也就是第二個數據行,因為索引是從零開始的)
    • 不會 使用具有數據行名稱的檔案標頭,因為這個特定的數據集檔案沒有標頭
    • 實驗的目標探索/訓練時間設定為 10 秒

    您會看到來自 CLI 的輸出,如下所示:

    PowerShell 上的 ML.NET CLI 分類

    在這個特定案例中,在僅有 10 秒且有小型數據集提供的情況下,CLI 工具能夠執行相當多次的迭代,這意味著可以根據不同的演算法/配置組合、多種內部數據轉換,以及演算法的超參數進行多次訓練。

    最後,在10秒中找到的「最佳品質」模型是使用特定定型器/演算法搭配任何特定組態的模型。 根據探索時間而定,命令可能會產生不同的結果。 選擇是以顯示的多個指標為基礎,例如 Accuracy

    瞭解模型的品質計量

    評估二元分類模型的第一個最簡單計量是精確度,這是很容易理解的。 「精確度是在測試數據集中正確預測的比例。」 越接近 100% (1.00), 越好。

    不過,在某些情況下,只有使用精確度計量進行測量是不夠的,尤其是在測試數據集中標籤 (0 和 1) 不平衡時。

    如需其他計量和更多 計量的詳細資訊,例如用來評估不同模型的精確度、AUC、AUCPR 和 F1 分數等計量的詳細資訊,請參閱 瞭解 ML.NET 計量

    注意

    您可以嘗試這個相同的數據集,並為 --max-exploration-time 指定幾分鐘(例如 3 分鐘,因此您指定 180 秒),這將為您找到更好的「最佳模型」,並針對此數據集使用不同的訓練流程配置。這個數據集相當小,只有1000列。

    若要尋找「高品質且生產就緒」的模型以用於較大數據集,您應該依據數據集的大小進行使用 CLI 的實驗,通常會指定更多的探索時間。 事實上,在許多情況下,您可能需要數小時的分析時間,特別是當資料集在行數和列數上都非常龐大時。

  2. 先前的命令執行已產生下列資產:

    • 已串行化模型 .zip(「最佳模型」)可供使用。
    • 要使用 C# 程式碼來執行或評估生成的模型(以便在終端使用者應用程式中利用該模型進行預測)。
    • 用來產生該模型的 C# 定型程式代碼(學習目的)。
    • 包含 反覆運算 詳細資訊的記錄檔,其中特定列出了每個嘗試過的演算法及其 超參數 與 數據轉換 組合。

    前兩個資產(.ZIP檔案模型和要執行該模型的 C# 程式代碼)可以直接用於使用者應用程式(ASP.NET Core Web 應用程式、服務、傳統型應用程式等),以使用該產生的 ML 模型進行預測。

    第三個資產定型程式代碼會顯示 CLI 使用哪些 ML.NET API 程式代碼來定型產生的模型,因此您可以調查 CLI 所選取的特定定型器/演算法和超參數。

這些列出的資產會在教學的下列步驟中說明。

探索產生的 C# 程式代碼,以用來執行模型以進行預測

  1. 在 Visual Studio 中,開啟在原始目的地資料夾內名為 SampleClassification 資料夾中產生的方案(本教學課程中名為 /cli-test)。 您應該會看到類似以下的解決方案:

    由 CLI 所產生的 Visual Studio 解決方案

    注意

    本教學課程建議使用 Visual Studio,但您也可以使用任何文本編輯器探索產生的 C# 程式代碼(兩個專案),並在 macOS、Linux 或 Windows 電腦上搭配 dotnet CLI 執行產生的控制台應用程式。

    • 產生的 主控台應用程式 包含您必須檢閱的執行程式碼,然後您通常會重複使用「評分程式代碼」(執行 ML 模型以進行預測的程式代碼),方法是將簡單程式代碼(只需幾行)移至您想要進行預測的終端使用者應用程式。
    • 產生的 mbconfig 檔案 是一個組態檔,可用來透過 CLI 或模型產生器重新定型模型。 這也會有兩個與它相關聯的程式代碼檔案和一個 zip 檔案。
      • 定型 檔案包含使用 ML.NET API 建置模型管線的程序代碼。
      • 取用 檔案包含取用模型的程序代碼。
      • zip 檔案,這是從 CLI 產生的模型。
  2. mbconfig 檔案中開啟 SampleClassification.consumption.cs 檔案。 您會看到有輸入和輸出類別。 這些是用來保存數據的數據類別或POCO類別。 類別包含重複使用的程式代碼,如果您的數據集有數十個甚至數百個數據行,就會很有用。

    • 從數據集讀取數據時,會使用 ModelInput 類別。
    • ModelOutput 類別可用來取得預測結果(預測數據)。
  3. 開啟Program.cs檔案並探索程序代碼。 在短短幾行中,您就可以執行模型並進行範例預測。

    static void Main(string[] args)
    {
        // Create single instance of sample data from first line of dataset for model input
        ModelInput sampleData = new ModelInput()
        {
            Col0 = @"Wow... Loved this place.",
        };
    
        // Make a single prediction on the sample data and print results
        var predictionResult = SampleClassification.Predict(sampleData);
    
        Console.WriteLine("Using model to make single prediction -- Comparing actual Col1 with predicted Col1 from sample data...\n\n");
        Console.WriteLine($"Col0: {sampleData.Col0}");
        Console.WriteLine($"\n\nPredicted Col1 value {predictionResult.PredictedLabel} \nPredicted Col1 scores: [{String.Join(",", predictionResult.Score)}]\n\n");
        Console.WriteLine("=============== End of process, hit any key to finish ===============");
        Console.ReadKey();
    }
    
    • 第一行程式代碼會建立單一範例數據 。 在此情況下,單一範例數據是以要用於預測之數據集的第一個數據列為基礎。 您也可以藉由更新程式碼來建立自己的「硬式編碼」數據:

      ModelInput sampleData = new ModelInput()
      {
          Col0 = "The ML.NET CLI is great for getting started. Very cool!"
      };
      
    • 下一行程式代碼會在指定的輸入數據上使用 SampleClassification.Predict() 方法來進行預測並傳回結果(根據ModelOutput.cs架構)。

    • 最後幾行程式代碼會列印出範例數據的屬性(在此案例中為 Comment),以及情感預測結果和對應的分數,其中正面情感的分數為(1),負面情感的分數為(2)。

  4. 使用從數據集第一個數據列載入的原始範例數據,或藉由提供您自己的自定義硬式編碼範例數據來執行專案。 您應該獲得類似的預測結果:

    ML.NET CLI 從 Visual Studio 執行應用程式

嘗試將硬式編碼範例數據變更為具有不同情感的其他句子,並查看模型如何預測正面或負面情感。

將機器學習模型的預測注入到終端使用者應用程式中

您可以使用類似的「ML 模型評分程式代碼」,在使用者應用程式中執行模型並進行預測。

例如,您可以直接將該程式代碼移至任何 Windows 傳統型應用程式,例如 WPFWinForms,並以與控制台應用程式中所做的相同方式執行模型。

不過,您應該對運行 ML 模型的程式碼行進行優化(也就是快取一次載入模型 .zip 文件),並使用單例模式的物件,而不是在每個請求中建立新物件,特別是當您的應用程式需要具備可擴展性,像是 Web 應用程式或分散式服務,如下一節所述。

在可調整 ASP.NET 核心 Web 應用程式和服務中執行 ML.NET 模型 (多線程應用程式)

建立模型物件(從模型的 .zip 檔案載入的ITransformer)和 PredictionEngine 物件時應該進行優化,尤其是在可擴展的 Web 應用程式和分散式服務中。 在第一個案例中,模型物件 (ITransformer) 優化很簡單。 由於 ITransformer 對象是線程安全的,因此您可以將對象快取為單一或靜態對象,以僅載入模型一次。

對於第二個物件,PredictionEngine 物件,它並不容易,因為 PredictionEngine 物件不是安全線程,因此您無法在 ASP.NET Core 應用程式中將這個物件具現化為單一或靜態物件。 此 部落格文章中深入討論線程安全和可擴展性問題。

不過,事情比該部落格文章中說明的要容易得多。 我們為您設計了一個更簡化的方法,並開發了一個 '.NET Integration Package',您可以輕鬆地在 ASP.NET Core 應用程式和服務中使用。只需將它註冊到應用程式的依賴注入(Dependency Injection)服務中,就可以直接從您的程式碼使用它。 請檢查下列教學課程和範例,以執行此動作:

探索產生的 C# 程式代碼,其用來定型「最佳品質」模型

如需更進階的學習目的,您也可以探索 CLI 工具用來定型所產生模型的 C# 程式代碼。

該訓練程式碼會在名為 SampleClassification.training.cs的檔案中產生,因此您可以查看該訓練程式碼。

更重要的是,針對此特定案例(情感分析模型),您也可以比較產生的定型程式代碼與下列教學課程中所述的程式碼:

比較教學課程中選擇的演算法和管線組態與 CLI 工具所產生的程式代碼很有趣。 根據您花多少時間反覆運算和搜尋更好的模型,選擇的演算法可能會與其特定的超參數和管線設定不同。

在本教學課程中,您已瞭解如何:

  • 準備機器學習任務(要解決的問題)的數據
  • 在 CLI 工具中執行 'mlnet classification' 命令
  • 檢閱品質計量結果
  • 瞭解產生的 C# 程式代碼以執行模型(在使用者應用程式中使用的程式碼)
  • 探索生成的 C# 程式碼,用來訓練「最佳品質」模型(用於獲取收益)

另請參閱