使用C# 探索 ML.NET 中的不同机器学习任务
什么是 ML.NET?
ML.NET 是 Microsoft 開源的針對 .NET 應(yīng)用程序的 跨平臺機(jī)器學(xué)習(xí)庫,允許您使用 C#、F# 或任何其他 .NET 語言執(zhí)行機(jī)器學(xué)習(xí)任務(wù)。此外,ML.NET 支持在其他機(jī)器學(xué)習(xí)框架中構(gòu)建的模型,如TensorFlow,ONNX,PyTorch 等,它也具有極高的性能,可用于各種機(jī)器學(xué)習(xí)任務(wù)。
對于那些還沒有深厚的數(shù)據(jù)科學(xué)技能和各種機(jī)器學(xué)習(xí)算法知識的人來說,ML.NET 還提供AutoML,Auto ML 是 ML.NET 的子集,它抽象出選擇機(jī)器學(xué)習(xí)算法、為這些算法調(diào)整超參數(shù)以及相互比較算法以確定最佳性能的過程。這有助于剛接觸數(shù)據(jù)科學(xué)的人找到一個(gè)表現(xiàn)良好的模型,而不需要更大的數(shù)據(jù)科學(xué)技能。
所有這些因素結(jié)合在一起,使 ML.NET 成為一種非常有效的方式,可以使用您已經(jīng)擁有的應(yīng)用程序和您已經(jīng)知道的技能來處理機(jī)器學(xué)習(xí)任務(wù)。
安裝 ML.NET
對于支持 .NET Standard 的任何項(xiàng)目,都可以通過 Visual Studio 中的 NuGet Package Manager 安裝 ML.NET(幾乎所有 .NET 項(xiàng)目都可以執(zhí)行此操作)。如果要向項(xiàng)目添加 ML.NET,請轉(zhuǎn)到 NuGet 包管理器并安裝最新版本的 。我還建議您安裝Microsoft.ML和Microsoft.ML.AutoML,因?yàn)锳utoML是開始使用 ML.NET 的好方法。有關(guān)使用 NuGet 包管理器的更多詳細(xì)信息,請參閱 Microsoft 的 NuGet 包管理器文檔
支持自動(dòng)ML的任務(wù)
首先,我將重點(diǎn)介紹使用 AutoML 支持的 ML.NET 五個(gè)機(jī)器學(xué)習(xí)任務(wù)。由于它們支持AutoML,因此這些任務(wù)更容易入門,因此我將為每種類型的任務(wù)提供一些代碼。我建議最好查看Microsoft關(guān)于 ML.NET 的文檔以獲取更多詳細(xì)信息,或者在GitHub上查看他們的 ML.NET 示例。
二元分類
二元分類任務(wù)涉及預(yù)測一個(gè)分類標(biāo)簽,該標(biāo)簽應(yīng)分配給給定一組相關(guān)特征的某些內(nèi)容。例如,給定貸款申請人的一些特征,二元分類模型將預(yù)測該貸款是否應(yīng)被批準(zhǔn)或拒絕。
二元分類任務(wù)僅限于預(yù)測具有兩個(gè)可能值的單個(gè)列。如果有兩個(gè)以上的可能值,則這是一個(gè)多類別分類任務(wù),我們將在下面討論。
使用 AutoML 運(yùn)行二元分類試驗(yàn)的代碼可能如下所示:
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;
}
然后,您可以使用該訓(xùn)練的模型通過以下代碼進(jìn)行預(yù)測:
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 分別表示數(shù)據(jù)集中的行和算法的最終預(yù)測的類。
多類別分類
多類分類任務(wù)與二元分類任務(wù)非常相似,因?yàn)槟鷩L試在給定一組特征的情況下預(yù)測單個(gè)標(biāo)記列的分類值。二元分類問題和多類分類問題之間的主要區(qū)別在于,對于二元分類問題,只有兩個(gè)可能的值,而在多類分類問題中,有三個(gè)或更多可能的類別可能屬于某些東西。
用于使用 AutoML 訓(xùn)練多類分類實(shí)驗(yàn)的代碼可能如下所示:
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;
}
除此之外,使用經(jīng)過訓(xùn)練的多分類模型的代碼與使用二元分類模型的代碼非常相似。與二元分類模型一樣,可以在不使用 AutoML 的情況下使用多類別分類模型。
回歸
回歸任務(wù)涉及在給定一組特征的情況下預(yù)測數(shù)值。例如,您可以使用回歸模型在給定一組已知其他因素的情況下預(yù)測汽油價(jià)格,或者使用回歸來預(yù)測在給定夜間天氣因素的情況下,您可能需要在早上為汽車除霜的時(shí)間長度。任何時(shí)候你需要計(jì)算一個(gè)數(shù)值,你都可能正在處理一個(gè)回歸問題。
用于對回歸實(shí)驗(yàn)執(zhí)行模型訓(xùn)練的代碼類似于分類實(shí)驗(yàn)的代碼:
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;
}
請注意,回歸實(shí)驗(yàn)的驗(yàn)證指標(biāo)與分類實(shí)驗(yàn)的驗(yàn)證指標(biāo)完全不同。分類實(shí)驗(yàn)處理給定正確類別的概率,而回歸實(shí)驗(yàn)處理已知?dú)v史數(shù)據(jù)的預(yù)測數(shù)值與實(shí)際數(shù)值之間的距離。
與這兩種分類模型類型一樣,在訓(xùn)練回歸模型時(shí)也可以不需要使用 AutoML,但如果對各個(gè)算法的了解有限,則可能會很有幫助。
推薦
推薦算法是回歸算法的變體。使用推薦算法,您可以輸入有關(guān)不同類型的用戶以及他們過去給予商品的不同評級的數(shù)據(jù)。給定這樣的數(shù)據(jù)集,推薦模型可以根據(jù)用戶與其他已知用戶的品味的相似性來預(yù)測用戶對他們以前從未與之交互過的東西的評分。推薦模型在電影、音樂和產(chǎn)品推薦系統(tǒng)中很受歡迎,在這些系統(tǒng)中,重復(fù)用戶很常見,每個(gè)人都可以從用戶找到他們最喜歡的內(nèi)容中受益。
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;
}
推薦算法使用矩陣分解,這是一個(gè)更復(fù)雜的主題。有關(guān)不使用 AutoML 的推薦系統(tǒng)的更多詳細(xì)信息,請參閱 Microsoft 的矩陣分解教程。還有一篇來自Rubik's Code的精彩文章,進(jìn)一步深入探討了這個(gè)話題。
排名
排名類似于推薦算法,但用于將項(xiàng)目放入適合顯示搜索結(jié)果的強(qiáng)制順序排名中。排名系統(tǒng)適用于顯示特定用戶或用戶組的有序建議列表。
代碼類似于我們之前看到的代碼,盡管驗(yàn)證指標(biāo)有很大不同:
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 當(dāng)前不支持的五個(gè)機(jī)器學(xué)習(xí)任務(wù)。
預(yù)測時(shí)間序列數(shù)據(jù)
預(yù)測涉及根據(jù)歷史數(shù)據(jù)預(yù)測一批未來回歸值。當(dāng)您進(jìn)行預(yù)測時(shí),您正在預(yù)測來自某個(gè)窗口的未來值,其中預(yù)測的每個(gè)值都具有一定程度的置信水平。
這與天氣預(yù)報(bào)的工作方式類似。天氣預(yù)報(bào)在預(yù)測近期值時(shí)最準(zhǔn)確,具有大量相關(guān)的歷史數(shù)據(jù)。它們可用于預(yù)測未來某個(gè)時(shí)間的值,但隨著時(shí)間范圍的延長,這些預(yù)測的準(zhǔn)確性會顯著下降。
聚類
聚類用于根據(jù)與附近數(shù)據(jù)點(diǎn)的相似性將各種數(shù)據(jù)點(diǎn)組合在一起。這可用于確定哪些客戶在市場營銷、建議分組或其他目的方面彼此相似。在處理地理數(shù)據(jù)時(shí),這也是確定辦公室位置或手機(jī)信號塔最佳位置的好方法。
聚類分析通常通過選擇任意數(shù)量的聚類并允許機(jī)器學(xué)習(xí)遵循 K-Means 聚類算法來優(yōu)化每個(gè)聚類的中心位置,以最小化從每個(gè)數(shù)據(jù)點(diǎn)到其聚類中心的總距離。聚類算法還傾向于在可能的情況下嘗試將聚類彼此隔開。
異常檢測
異常檢測可用于將單個(gè)事務(wù)標(biāo)記為異常,以便進(jìn)行其他調(diào)查。異常檢測通常用于病毒檢測、信用卡欺詐檢測和識別異常網(wǎng)絡(luò)活動(dòng)。您可以將異常檢測視為一種自動(dòng)形式的二元分類,其中某些內(nèi)容要么是正常的,要么是異常的。
圖像分類
圖像分類類似于二元或多類分類,但不是處理數(shù)字特征,而是處理圖像以確定給定圖像中的特征。與分類問題一樣,您必須為 ML.NET 提供各種不同大小、照明和排列方式的標(biāo)記圖像,這些圖像具有您嘗試檢測的事物,以便對圖像進(jìn)行可靠的分類。
物體檢測
對象檢測類似于圖像分類,但不是告訴您圖像屬于特定類,而是在圖像中為您提供一個(gè)實(shí)際的邊界框,告訴您該特定對象的位置。此外,對象檢測能夠在單個(gè)圖像中定位多個(gè)對象,這超出了圖像分類的限制。
對象檢測是 Azure 認(rèn)知服務(wù)的一部分,當(dāng)前它只能通過模型生成器在 ML.NET 中使用。
結(jié)論
簡而言之,ML.NET 的 Auto ML 功能是一種令人驚嘆的完全免費(fèi)的方式,可幫助日常程序員利用您通常需要數(shù)據(jù)科學(xué)家才能獲得的功能。ML .NET 允許你和你的團(tuán)隊(duì)使用你已經(jīng)熟悉的語言將機(jī)器學(xué)習(xí)功能集成到你的應(yīng)用程序中,而無需深入了解各種機(jī)器學(xué)習(xí)算法。
總結(jié)
以上是生活随笔為你收集整理的使用C# 探索 ML.NET 中的不同机器学习任务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#中类的override和virtua
- 下一篇: C#中类的异常处理