使用C# 探索 ML.NET 中的不同機器學習任務

張善友發表於2022-02-12

什麼是 ML.NET?

ML.NET 是 Microsoft 開源的針對 .NET 應用程式的 跨平臺機器學習庫,允許您使用 C#、F# 或任何其他 .NET 語言執行機器學習任務。此外,ML.NET 支援在其他機器學習框架中構建的模型,如TensorFlow,ONNX,PyTorch 等,它也具有極高的效能,可用於各種機器學習任務。

對於那些還沒有深厚的資料科學技能和各種機器學習演算法知識的人來說,ML.NET 還提供AutoML,Auto ML 是 ML.NET 的子集,它抽象出選擇機器學習演算法、為這些演算法調整超引數以及相互比較演算法以確定最佳效能的過程。這有助於剛接觸資料科學的人找到一個表現良好的模型,而不需要更大的資料科學技能。

所有這些因素結合在一起,使 ML.NET 成為一種非常有效的方式,可以使用您已經擁有的應用程式和您已經知道的技能來處理機器學習任務。

安裝 ML.NET

對於支援 .NET Standard 的任何專案,都可以通過 Visual Studio 中的 NuGet Package Manager 安裝 ML.NET(幾乎所有 .NET 專案都可以執行此操作)。如果要向專案新增 ML.NET,請轉到 NuGet 包管理器並安裝最新版本的 。我還建議您安裝Microsoft.ML和 Microsoft.ML.AutoML,因為AutoML是開始使用 ML.NET 的好方法。有關使用 NuGet 包管理器的更多詳細資訊,請參閱 Microsoft 的 NuGet 包管理器文件

image

支援自動ML的任務

首先,我將重點介紹使用 AutoML 支援的 ML.NET 五個機器學習任務。由於它們支援AutoML,因此這些任務更容易入門,因此我將為每種型別的任務提供一些程式碼。我建議最好檢視Microsoft關於 ML.NET 的文件以獲取更多詳細資訊,或者在GitHub上檢視他們的 ML.NET 示例。

二元分類

二元分類任務涉及預測一個分類標籤,該標籤應分配給給定一組相關特徵的某些內容。例如,給定貸款申請人的一些特徵,二元分類模型將預測該貸款是否應被批准或拒絕。

二元分類任務僅限於預測具有兩個可能值的單個列。如果有兩個以上的可能值,則這是一個多類別分類任務,我們將在下面討論。

使用 AutoML 執行二元分類試驗的程式碼可能如下所示:

public ITransformer PerformBinaryClassification(IDataView trainingData, IDataView validationData)
{
     // Set up the experiment
     MLContext context = new MLContext();
     uint maxSeconds = 10;
     BinaryClassificationExperiment experiment = context.Auto().CreateBinaryClassificationExperiment(maxSeconds);

    // Run the experiment and wait synchronously for it to complete
     ExperimentResult<BinaryClassificationMetrics> result =
         experiment.Execute(trainingData, validationData, labelColumnName: "ShouldApproveLoan");

    // result.BestRun.ValidationMetrics has properties helpful for evaluating model performance
     double accuracy = result.BestRun.ValidationMetrics.Accuracy;
     double f1Score = result.BestRun.ValidationMetrics.F1Score;
     string confusionTable = result.BestRun.ValidationMetrics.ConfusionMatrix.GetFormattedConfusionTable();

    // Return the best performing trained model
     ITransformer bestModel = result.BestRun.Model;
     return bestModel;
}

然後,您可以使用該訓練的模型通過以下程式碼進行預測:

public LoanPrediction PredictBinaryClassification(ITransformer bestModel, IDataView trainingData, LoanData loan)
{
     MLContext context = new MLContext();

    // Create an engine capable of evaluating one or more loans in the future
     PredictionEngine<LoanData, LoanPrediction> engine =
         context.Model.CreatePredictionEngine<LoanData, LoanPrediction>(bestModel, trainingData.Schema);

    // Actually make the prediction and return the findings
     LoanPrediction prediction = engine.Predict(loan);
     return prediction;
}

此處 LoanData 和LoanPrediction 分別表示資料集中的行和演算法的最終預測的類。

多類別分類

多類分類任務與二元分類任務非常相似,因為您嘗試在給定一組特徵的情況下預測單個標記列的分類值。二元分類問題和多類分類問題之間的主要區別在於,對於二元分類問題,只有兩個可能的值,而在多類分類問題中,有三個或更多可能的類別可能屬於某些東西。

用於使用 AutoML 訓練多類分類實驗的程式碼可能如下所示:

public ITransformer PerformMultiClassification(IDataView trainingData, IDataView validationData)
{
     // Set up the experiment
     MLContext context = new MLContext();
     uint maxSeconds = 10;
     MulticlassClassificationExperiment experiment = context.Auto().CreateMulticlassClassificationExperiment(maxSeconds);

    // Run the experiment and wait synchronously for it to complete
     ExperimentResult<MulticlassClassificationMetrics> result =
         experiment.Execute(trainingData, validationData, labelColumnName: "RiskCategory");

    // result.BestRun.ValidationMetrics has properties helpful for evaluating model performance
     string confusionTable = result.BestRun.ValidationMetrics.ConfusionMatrix.GetFormattedConfusionTable();

    // Return the best performing trained model
     ITransformer bestModel = result.BestRun.Model;
     return bestModel;
}

除此之外,使用經過訓練的多分類模型的程式碼與使用二元分類模型的程式碼非常相似。與二元分類模型一樣,可以在不使用 AutoML 的情況下使用多類別分類模型。

迴歸

迴歸任務涉及在給定一組特徵的情況下預測數值。例如,您可以使用迴歸模型在給定一組已知其他因素的情況下預測汽油價格,或者使用迴歸來預測在給定夜間天氣因素的情況下,您可能需要在早上為汽車除霜的時間長度。任何時候你需要計算一個數值,你都可能正在處理一個迴歸問題。

用於對迴歸實驗執行模型訓練的程式碼類似於分類實驗的程式碼:

public ITransformer PerformRegression(IDataView trainingData, IDataView validationData)
{
     // Set up the experiment
     MLContext context = new MLContext();
     uint maxSeconds = 10;
     RegressionExperiment experiment = context.Auto().CreateRegressionExperiment(maxSeconds);

    // Run the experiment and wait synchronously for it to complete
     ExperimentResult<RegressionMetrics> result =
         experiment.Execute(trainingData, validationData, labelColumnName: "Temperature");

    // result.BestRun.ValidationMetrics has properties helpful for evaluating model performance
     double error = result.BestRun.ValidationMetrics.MeanAbsoluteError;

    // Return the best performing trained model
     ITransformer bestModel = result.BestRun.Model;
     return bestModel;
}

請注意,迴歸實驗的驗證指標與分類實驗的驗證指標完全不同。分類實驗處理給定正確類別的概率,而回歸實驗處理已知歷史資料的預測數值與實際數值之間的距離。

與這兩種分類模型型別一樣,在訓練迴歸模型時也可以不需要使用 AutoML,但如果對各個演算法的瞭解有限,則可能會很有幫助。

推薦

推薦演算法是迴歸演算法的變體。使用推薦演算法,您可以輸入有關不同型別的使用者以及他們過去給予商品的不同評級的資料。給定這樣的資料集,推薦模型可以根據使用者與其他已知使用者的品味的相似性來預測使用者對他們以前從未與之互動過的東西的評分。推薦模型在電影、音樂和產品推薦系統中很受歡迎,在這些系統中,重複使用者很常見,每個人都可以從使用者找到他們最喜歡的內容中受益。

AutoML 支援推薦,推薦程式碼與迴歸程式碼非常相似:

public ITransformer PerformRecommendation(IDataView trainingData, IDataView validationData)
{
     // Set up the experiment
     MLContext context = new MLContext();
     uint maxSeconds = 10;
     RecommendationExperiment experiment = context.Auto().CreateRecommendationExperiment(maxSeconds);

    // Run the experiment and wait synchronously for it to complete
     ExperimentResult<RegressionMetrics> result =
         experiment.Execute(trainingData, validationData, labelColumnName: "Rating");

    // result.BestRun.ValidationMetrics has properties helpful for evaluating model performance
     double error = result.BestRun.ValidationMetrics.MeanAbsoluteError;

    // Return the best performing trained model
     ITransformer bestModel = result.BestRun.Model;
     return bestModel;
}

推薦演算法使用矩陣分解,這是一個更復雜的主題。有關不使用 AutoML 的推薦系統的更多詳細資訊,請參閱 Microsoft 的矩陣分解教程。還有一篇來自Rubik's Code的精彩文章,進一步深入探討了這個話題。

排名

排名類似於推薦演算法,但用於將專案放入適合顯示搜尋結果的強制順序排名中。排名系統適用於顯示特定使用者或使用者組的有序建議列表。

程式碼類似於我們之前看到的程式碼,儘管驗證指標有很大不同:

public ITransformer PerformRanking(IDataView trainingData, IDataView validationData)
{
     // Set up the experiment
     MLContext context = new MLContext();
     uint maxSeconds = 10;
     RankingExperiment experiment = context.Auto().CreateRankingExperiment(maxSeconds);

    // Run the experiment and wait synchronously for it to complete
     ExperimentResult<RankingMetrics> result =
         experiment.Execute(trainingData, validationData, labelColumnName: "Temperature");

    // result.BestRun.ValidationMetrics has properties helpful for evaluating model performance
     IEnumerable<double> gains = result.BestRun.ValidationMetrics.DiscountedCumulativeGains;
     IEnumerable<double> normalizedGains = result.BestRun.ValidationMetrics.NormalizedDiscountedCumulativeGains;

    // Return the best performing trained model
     ITransformer bestModel = result.BestRun.Model;

    RankingEvaluatorOptions options = new RankingEvaluatorOptions();
     RankingMetrics metrics = context.Ranking.Evaluate(trainingData, labelColumnName: "Label", rowGroupColumnName: "Group", scoreColumnName: "Score");
     return bestModel;
}

其他解決方案型別

接下來讓我們簡要介紹一下 AutoML 當前不支援的五個機器學習任務。

預測時間序列資料

預測涉及根據歷史資料預測一批未來回歸值。當您進行預測時,您正在預測來自某個視窗的未來值,其中預測的每個值都具有一定程度的置信水平。

這與天氣預報的工作方式類似。天氣預報在預測近期值時最準確,具有大量相關的歷史資料。它們可用於預測未來某個時間的值,但隨著時間範圍的延長,這些預測的準確性會顯著下降。

聚類

聚類用於根據與附近資料點的相似性將各種資料點組合在一起。這可用於確定哪些客戶在市場營銷、建議分組或其他目的方面彼此相似。在處理地理資料時,這也是確定辦公室位置或手機訊號塔最佳位置的好方法。

聚類分析通常通過選擇任意數量的聚類並允許機器學習遵循 K-Means 聚類演算法來優化每個聚類的中心位置,以最小化從每個資料點到其聚類中心的總距離。聚類演算法還傾向於在可能的情況下嘗試將聚類彼此隔開。

異常檢測

異常檢測可用於將單個事務標記為異常,以便進行其他調查。異常檢測通常用於病毒檢測、信用卡欺詐檢測和識別異常網路活動。您可以將異常檢測視為一種自動形式的二元分類,其中某些內容要麼是正常的,要麼是異常的。

影像分類

影像分類類似於二元或多類分類,但不是處理數字特徵,而是處理影像以確定給定影像中的特徵。與分類問題一樣,您必須為 ML.NET 提供各種不同大小、照明和排列方式的標記影像,這些影像具有您嘗試檢測的事物,以便對影像進行可靠的分類。

物體檢測

物件檢測類似於影像分類,但不是告訴您影像屬於特定類,而是在影像中為您提供一個實際的邊界框,告訴您該特定物件的位置。此外,物件檢測能夠在單個影像中定位多個物件,這超出了影像分類的限制。

物件檢測是 Azure 認知服務的一部分,當前它只能通過模型生成器在 ML.NET 中使用。


結論

簡而言之,ML.NET 的 Auto ML 功能是一種令人驚歎的完全免費的方式,可幫助日常程式設計師利用您通常需要資料科學家才能獲得的功能。ML .NET 允許你和你的團隊使用你已經熟悉的語言將機器學習功能整合到你的應用程式中,而無需深入瞭解各種機器學習演算法。

相關文章