當前位置: 妍妍網 > 碼農

ML.NET 的AI功能套用-文本分類

2024-07-06碼農


最近,人工智慧 (AI) 以驚人的速度越來越受歡迎。

OpenAI 的 ChatGPT 是人工智慧的突破,熱情高漲。
ChatGPT 引發了許多公司效仿的 AI 套用趨勢。

你到處都在閱讀和聽到關於人工智慧的資訊。名人表演奇怪舞蹈動作的視訊和影像出現,或者您聽到「實際上」已經死了幾年的藝術家的采訪和歌曲。

下面將解釋人工智慧的確切功能。作為開發人員,我們習慣於分類思考並將問題分解為小步驟,這正是所有人工智慧的工作方式。它們基於所謂的模型,這些模型已經針對各自的套用領域進行了訓練。

範例

如果您向 ChatGPT 索要圖片,則必須使用 DALL-E 等單獨的模型。

如果你要求一首詩,ChatGPT 使用語言模型。

ChatGPT 只不過是一個使用不同模型來完成手頭任務的聊天機器人。

這就是我想開始並編寫一個小型人工智慧的地方,該人工智慧將客戶評論(以自由文本形式提供)分類為正面或負面。

作為 .NET 開發人員,Microsoft 提供了一個低門檻的機器學習入門 ML.NET。這個免費的開源框架可以輕松地將 ML 模型整合到新的和現有的 .NET 應用程式中,而無需了解 Python、R 或其他 ML 庫。ML.NET 已包含許多用於常見用例的現成模型,並且可以輕松整合到現有的 .NET 套用生命周期中。

機器學習的基礎知識

術語「機器學習」描述了教電腦從數據中學習模式和關系的方法,而不是使用規則和程式邏輯對它們進行顯式編程。其目的是使機器能夠獨立於樣本數據進行「學習」,並套用這些知識來解決類似的問題。

基本上有三種型別的學習:

監督學習

監督學習是一種機器學習方法,其中為模型提供訓練數據,包括輸入數據(例如文本)和相應的所需輸出(例如「正」或「負」等分類)。使用這些範例,系統可以學習辨識將輸入與輸出相關的模式。這使它能夠在以後預測新的、看不見的輸入的正確輸出。一個經典的套用範例是影像中的物件辨識。

例:

使用 ML.NET 進行監督學習的一個套用範例是將產品評論分類為「正面」或「負面」。程式如下:

// Loading the training data with reviews and labels
var data = mlContext.Data.LoadFromTextFile<ReviewData>(pathToFile);
// Creating the processing pipeline
var pipeline = mlContext.Transforms.Text.FeaturizeText("ReviewText", "Features")
.Append(mlContext.Binary classification.Trainers.SdcaLogisticRegression("Label"));
// Training the model
var model = pipeline.Fit(data);

在這一點上,我們有一個經過訓練的模型,可以對新評論進行分類。

無監督學習

無監督學習是一種機器學習方法,其中模型僅提供未標記的輸入數據,例如文本或影像,而沒有任何相關的目標變量或分類。系統必須獨立辨識此原始數據中的結構、模式和相關性。一個典型的套用領域是聚類,其中相似的輸入數據被匯總到組中。可能的範例是基於行銷數據辨識客戶群,或者在分析文本時根據主題領域對新聞文章進行分組。

例:

無監督學習可以與文本聚類 ML.NET 一起使用,例如:

// Loading the text data
var data = mlContext.Data.LoadFromTextFile<ArticleData>(pathToFile);
// Create the text featurisation pipeline
var pipeline = mlContext.Transforms.Text.FeaturizeText("ArticleText", "Features");
// Train the clustering model
var model = mlContext.Clustering.Trainers.KMeans(pipeline, numberOfClusters: 5).Fit(data);
// Predict the cluster membership for new articles
var predictions = model.Transform(data);

例如,透過這種方式,新聞文章可以自動分類為政治、商業、體育等主題集群。

ML.NET 主要側重於監督和部份無監督學習。ML.NET 目前沒有為強化學習提供任何特定的支持,在強化學習中,人工智慧在模擬環境中透過獎勵進行訓練。這種學習範式特別用於戰略發現任務,例如遊戲或流程最佳化。

強化學習

強化學習是一種學習範式,其中人工智慧在模擬環境中透過反復試驗進行訓練。與監督學習相比,沒有具有輸入輸出對的完整訓練範例。相反,系統會收到每個操作的分數(獎勵),這表明該操作有多「好」。透過最大化累積的獎勵,人工智慧學會了為任務找到最佳策略。這種強化學習原理特別用於需要找到復雜策略的任務。例子包括棋盤遊戲,如西洋棋或圍棋,還有機器人控制、流程最佳化或自動駕駛的套用。

範例

一個經典的應用程式範例是西洋棋玩家代理。這裏的環境可能是一個棋盤,可能的動作是移動動作。然後,代理會收到每步棋的評估,例如,+1 表示確定的棋子獲勝,-5 表示即將輸掉棋子。透過許多訓練遊戲,人工智慧可以學習哪些動作可以帶來長期的勝利,從而最大限度地提高其累積獎勵。

設定開發環境

若要開始使用 ML.NET,我們需要版本 4.6.1 或更高版本的 .NET Core 或 .NET Framework 環境。ML.NET 可以在 Visual Studio、Visual Studio Code 或命令列中使用。

第一步是安裝所需的 NuGet 包 ML.NET:The first step is to install the required NuGet packages of :

Install-Package Microsoft.ML

此主包包含基本功能,例如 ML.NET 上下文、數據轉換以及包含模型和任務的目錄。對於其他功能,可以添加其他包,例如用於影像處理的 Microsoft.ML.Vision 或用於推薦系統的 Microsoft.ML.Recommender。

安裝後,我們可以在 Visual Studio 中建立 .NET Core 或 .NET Framework 控制台應用程式並開始開發。

(可選)整合工具(如 Visual Studio 中的模型生成器界面或 ML.NET CLI )可用於視覺化數據和建立模型。我稍後再談這個問題。

建立第一個 ML 模型

下面,透過範例逐步解釋 ML.NET 的基本概念:

客戶評論的分類基於自由文本。

結果應該是將這些評級歸類為正面或負面。

這是一個經典的監督學習問題。

我們建立新的 C# 控制台應用程式並匯入 ML.NET NuGet 包。

接下來,我們將數據集載入到工作記憶體中。在我們的範例中,我們需要一個 TSV(制表符分隔檔)檔。這由控制台應用程式中的簡單類表示:

此類代表 TSV 檔中的每一行。

public classReciewData
{
}

現在,我們為 TSV 數據的每一列添加內容:

public classReviewData
{
publicstring ReviewText { get; set; }
publicbool Label { get; set; }
}

不幸的是,這還不足以載入此 TSV 檔並教 ML.Net 如何參照此檔。

為此,我們需要內容:LoadColumn 加上列的索引。

public classReviewData
{
[LoadColumn(0)]
publicstring ReviewText { get; set; }
[LoadColumn(1)]
publicbool Label { get; set; }
}

這是從 ReviewText 內容到 TSV 檔 ReviewText 列的簡單對映。

現在,讓我們處理檔的儲存路徑,並將它們保存在我們的應用程式中:

首先,我們建立訓練檔的路徑,即 TSV 檔 (Review.tsv)。

string baseDirectory = @"..\\..\\AI";
string subDirectory = "TrainingData";
string trainingDataFilePath = Path.Combine(baseDirectory, subDirectory, "Reviews.tsv");

我們將使用此檔來訓練要用於分類的模型。

現在,我們定義要訓練的模型的路徑。此模型保存為 ZIP 檔。

string modelPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "model.zip");

現在我們需要一個 MLContext 變量。MLContext 可與 EF DbContext 相媲美。因此,每當要使用機器學習時,都必須與 MLContext 進行互動,類似於 EF Core 中的 DBContext。

現在我們已準備好載入數據。我們可以根據需要操作它來根據我們的要求訓練模型。

現在我們構建模型:

為此,我們需要 ML.NET 的特定型別。The IDataView:

var trainingDataView = mlContext.Data.LoadFromTextFile<ReviewData>(trainingDataFilePath, separatorChar: '\t', hasHeader: true);

現在,我可以使用 MLContext 中名為 LoadFromTextFile 的函式。<ReviewData>' 現在用於將數據投影到我們最初建立的類中。現在必須將訓練檔的路徑傳遞給此函式。作為獎勵,我們可以在這裏指定更多選項,例如 TSV 檔的分隔符以及我們的訓練檔是否有檔頭(我們有一個檔頭,所以我將此參數設定為 true)。

現在我們已經將數據載入到 DataView 中,我們可以開始預處理了。預處理是建立所謂的管道的一種方法。這以後可用於在我們有傳入數據(例如我們的客戶分數)時執行預測。為此,我們需要從建立的數據檢視 (IDataView) 中提取數據,然後對其進行轉換,以便將其用作機器學習過程的一部份。

現在,讓我們建立管道。這具有特定的返回型別:IEstimator<ITransformer>:

/// <summary>
/// Creates the machine learning pipeline for review classification.
/// </summary>
/// <param name="context">The ML context.</param>
/// <returns>The machine learning pipeline.</returns>
publicstaticIEstimator<ITransformer>CreatePipeline(MLContext context)
{
return context.Transforms.Text.FeaturizeText("Features", "ReviewText")
.Append(context.Binary classification.Trainers.SdcaLogisticRegression(labelColumnName: "Label"))
.AppendCacheCheckpoint(context);
}

**Context.Transforms.Text。**FeaturizeText 是 ML.NET 中的文本轉換元件,用於將文本數據轉換為數值要素。

「特征 」是包含生成的數值特征的新列名稱。

**「ReviewText」**是 TSV 檔中包含要轉換為數位特征的文本的列的名稱。

現在開始訓練模型:

**'。Append「 將下一步添加到管道中。使用 「Context.Binary classification.Trainers.SdcaLogisticRegression」**訓練模型,該演算法定義了要訓練模型的演算法,在本例中為 SdcaLogisticRegression 演算法。「標簽」是表示要預測的目標變量的列或列的名稱。在我們的範例中,它是對這種評估是積極的還是消極的分類。

讓我們再次總結一下:

此命令生成執行以下步驟的管道:

  1. 文本特征化:「ReviewText」列中的文本將轉換為數位要素,並儲存在新的「要素」列中。

  2. 模型訓練:「特征」列中的數值特征用於訓練具有「標簽」列中目標變量的二元分類模型。

現在,我們已經建立了管道,可以開始訓練模型了。

var pipeline = CreatePipeline(mlContext);
var model = pipeline.Fit(trainingDataView);

我們使用「管道。適合(...)' 命令根據 TSV 檔中的數據訓練模型。然後將模型儲存在記憶體中。

但是,為了保存模型而不必每次都建立和重新訓練它,我們可以使用「Save()」方法。這使我們能夠將訓練好的模型保存在特定的檔路徑中。透過這種方式,我們可以在需要時簡單地載入和使用模型,而不必每次都重新訓練它。

MlContext 中有一個選項,我們可以在其中找到 Save() 函式:

context.Model.Save(model, schema, modelPath);

首先,我們從 TSV 檔的 IDataView 傳輸經過訓練的模型和架構,然後傳輸要保存模型的路徑。

我們現在已經訓練了我們的模型並將其保存到硬碟中。

現在我們需要另一個表示訓練的 DataSet 的類,即模型的結果(預測類)。為此,我們從 TSV 檔 (ReviewData) 建立另一個與 DataSet 類具有類似結構的類。

public classReviewPrediction
{
[ColumnName("PredictedLabel")]
publicbool PredictedLabel { get; set; }
}

該內容定義在 MLContext 中使用「PredictedLabel」列的名稱來讀取其中的預測值。

為了將模型連線到預測類,我們現在需要一個 PipelineEngine。我們從 MLContext 再次建立此引擎。

var predictionEngine = mlContext.Model.CreatePredictionEngine<ReviewData, ReviewPrediction>(model);

我們將泛型型別 TSrc(源)和 TDst(目標)用於輸入和輸出類,「 ReviewData 」和「 ReviewPrediction 」(「Good rating」、「Positiv」)。

各個元件及其互動現在應該是可以理解的:為什麽我們需要將文本轉換為數位特征,為什麽我們需要準備數據以便電腦能夠理解它,以及我們的「ReviewData」類是我們的源類,「ReviewDataPrediction」是我們的目標類。

現在我們已經完成了準備步驟,我們可以進入預測階段。

現在,讓我們來處理執行預測並返回預期目標變量的程式碼。

在我們的範例中,預測結果是一個布爾值。

第一步是輸入一個分數,然後我們將其寫入「ReviewData」輸入類。

var input = newReviewData { ReviewText = inputReviewText };

變量「 ReviewText 」是一個字串變量,包含我們的審閱。

現在,我們將「 ReviewData 」型別的輸入變量傳遞到我們剛剛建立的管道。

因此,我們收到「 ReviewPrediction 」輸出類,現在可以透過該變量從模型存取目標變量。

// classify the new rating and display the result
var prediction = predictionEngine.Predict(input);
Console.WriteLine($"The classification for the rating ‘{ input.ReviewText}’ is: { (prediction.PredictedLabel ? "Positiv" : "Negativ")}");

如果模型具有良好的訓練數據,我們現在應該得到正確的預測結果。

它似乎有效。

當然,這只是一個小例子,模型並不完美,但如果你訓練得好,理想情況下它應該總是返回正確的結果。

以下擴充套件已添加到範例中,用於在輸入不正確或未知時重新訓練模型。

啟動應用程式時,您可以選擇向模型添加新數據和直接訓練,也可以建立新註釋。

在下面的文章中,我將仔細研究影像辨識和預測。

總結:

盡管本文僅限於文本分類,但仔細觀察並帶有一點創造力,所描述的方法開辟了許多可能性。例如,對某個分類的辨識可用於自動觸發進一步的過程。

總的來說,可以說人工智慧具有巨大的潛力,可以在日常生活的許多領域為我們提供支持並最佳化流程。文本分類只是眾多可能套用中的一個例子。可以假設,未來越來越多的領域將受益於人工智慧的可能性,這將為公司和個人開辟新的機會。

如果你喜歡我的文章,請給我一個贊!謝謝