使用C# 探索 ML.NET 中的不同机器学习任务
什么是 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 包管理器文檔
支持自動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 允許你和你的團隊使用你已經熟悉的語言將機器學習功能集成到你的應用程序中,而無需深入了解各種機器學習算法。
總結
以上是生活随笔為你收集整理的使用C# 探索 ML.NET 中的不同机器学习任务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#中类的override和virtua
- 下一篇: C#中类的异常处理