使用 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 模型和原始程式碼。
先決條件
- .NET 8 SDK 或更新版本
- (選擇性) Visual Studio
- ML.NET CLI
您可以從 Visual Studio 或使用 dotnet run
(.NET CLI) 來執行產生的 C# 程式代碼專案。
準備您的數據
我們將使用用於「情感分析」案例的現有數據集,這是二元分類機器學習工作。 您可以使用自己的數據集,以類似的方式產生模型和程序代碼。
下載 UCI 情感捲標句子數據集 zip 檔案(請參閱下列附註中的引文),然後將它解壓縮到您選擇的任何資料夾。
注意
本教學課程使用了一個來自「使用深層特徵從群組到個別標籤」的數據集,該數據集由 Kotzias 等人提供。 KDD 2015,託管於 UCI 機器學習資料庫 - Dua, D. 和 Karra Taniskidou, E. (2017 年)。 UCI Machine Learning 存放庫 [http://archive.ics.uci.edu/ml]。 CA 歐文:加州大學資訊與計算機科學學院。
將
yelp_labelled.txt
檔案複製到您先前建立的任何資料夾(例如/cli-test
)。開啟您慣用的命令提示字元,並移至您複製資料集檔案的資料夾。 例如:
cd /cli-test
使用 Visual Studio Code 之類的任何文字編輯器,您可以開啟並探索
yelp_labelled.txt
數據集檔案。 您可以看到 結構為:檔案沒有標頭。 您將使用欄位的索引。
只有兩個欄:
文字 (欄索引 0) 標籤 (欄索引 1) 哇。。。喜歡這個地方。 1 餅皮不好。 0 不好吃,口感令人噁心。 0 ...更多文字欄位... ...(1 或 0)...
請務必從編輯器關閉數據集檔案。
現在,您已準備好開始使用此「情感分析」場景的 CLI。
注意
完成本教學課程之後,您也可以嘗試使用自己的數據集,只要這些數據集已準備好用於 ML.NET CLI 預覽目前支援的任何 ML 工作,「二元分類」、「分類」、「回歸」、 及 「建議」。
執行 'mlnet classification' 命令
執行下列 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 的實驗,通常會指定更多的探索時間。 事實上,在許多情況下,您可能需要數小時的分析時間,特別是當資料集在行數和列數上都非常龐大時。
先前的命令執行已產生下列資產:
- 已串行化模型 .zip(「最佳模型」)可供使用。
- 要使用 C# 程式碼來執行或評估生成的模型(以便在終端使用者應用程式中利用該模型進行預測)。
- 用來產生該模型的 C# 定型程式代碼(學習目的)。
- 包含 反覆運算 詳細資訊的記錄檔,其中特定列出了每個嘗試過的演算法及其 超參數 與 數據轉換 組合。
前兩個資產(.ZIP檔案模型和要執行該模型的 C# 程式代碼)可以直接用於使用者應用程式(ASP.NET Core Web 應用程式、服務、傳統型應用程式等),以使用該產生的 ML 模型進行預測。
第三個資產定型程式代碼會顯示 CLI 使用哪些 ML.NET API 程式代碼來定型產生的模型,因此您可以調查 CLI 所選取的特定定型器/演算法和超參數。
這些列出的資產會在教學的下列步驟中說明。
探索產生的 C# 程式代碼,以用來執行模型以進行預測
在 Visual Studio 中,開啟在原始目的地資料夾內名為
SampleClassification
資料夾中產生的方案(本教學課程中名為/cli-test
)。 您應該會看到類似以下的解決方案:注意
本教學課程建議使用 Visual Studio,但您也可以使用任何文本編輯器探索產生的 C# 程式代碼(兩個專案),並在 macOS、Linux 或 Windows 電腦上搭配
dotnet CLI
執行產生的控制台應用程式。- 產生的 主控台應用程式 包含您必須檢閱的執行程式碼,然後您通常會重複使用「評分程式代碼」(執行 ML 模型以進行預測的程式代碼),方法是將簡單程式代碼(只需幾行)移至您想要進行預測的終端使用者應用程式。
- 產生的 mbconfig 檔案 是一個組態檔,可用來透過 CLI 或模型產生器重新定型模型。 這也會有兩個與它相關聯的程式代碼檔案和一個 zip 檔案。
- 定型 檔案包含使用 ML.NET API 建置模型管線的程序代碼。
- 取用 檔案包含取用模型的程序代碼。
- zip 檔案,這是從 CLI 產生的模型。
在 mbconfig 檔案中開啟 SampleClassification.consumption.cs 檔案。 您會看到有輸入和輸出類別。 這些是用來保存數據的數據類別或POCO類別。 類別包含重複使用的程式代碼,如果您的數據集有數十個甚至數百個數據行,就會很有用。
- 從數據集讀取數據時,會使用
ModelInput
類別。 -
ModelOutput
類別可用來取得預測結果(預測數據)。
- 從數據集讀取數據時,會使用
開啟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)。
使用從數據集第一個數據列載入的原始範例數據,或藉由提供您自己的自定義硬式編碼範例數據來執行專案。 您應該獲得類似的預測結果:
執行應用程式
嘗試將硬式編碼範例數據變更為具有不同情感的其他句子,並查看模型如何預測正面或負面情感。
將機器學習模型的預測注入到終端使用者應用程式中
您可以使用類似的「ML 模型評分程式代碼」,在使用者應用程式中執行模型並進行預測。
例如,您可以直接將該程式代碼移至任何 Windows 傳統型應用程式,例如 WPF 和 WinForms,並以與控制台應用程式中所做的相同方式執行模型。
不過,您應該對運行 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# 程式碼,用來訓練「最佳品質」模型(用於獲取收益)
另請參閱
- 使用 ML.NET CLI 將模型定型自動化
- 教學課程:在可調整的 ASP.NET Core Web 應用程式和 Web API 上執行 ML.NET 模型
- 範例:ASP.NET Core WebAPI 上的可調整 ML.NET 模型
- ML.NET CLI 自動定型命令參考指南
- ML.NET CLI 中的 遙測