什么是ML.NET?
ML.NET是Microsoft用于.NET应用程序的开源跨平台机器学习库,允许您使用C#、F# 或任何其他.NET语言执行机器学习任务。
此外,ML.NET支持在其他机器学习框架中构建的模型,例如TensorFlow、ONNX、Infer.NET等。
对于那些还没有深入的数据科学技能和各种机器学习算法知识的人,ML.NET还提供AutoML,它可以自动训练某些类型的机器学习模型,帮助您更专注于设置实验和使用训练好的模型。
所有这些因素结合在一起,使ML.NET成为一种非常有效的方式,可以使用您已经拥有的应用程序和您已经知道的技能来处理机器学习任务。
在本文中,我们将使用C#来探索ML.NET可以执行的高级任务,以及在哪里可以找到有关您可能想要执行的每种机器学习任务的更多信息。
注意:我还建议阅读使用AutoML和ML.NET来预测视频游戏的ESRB评级,因为它是针对单个任务对ML.NET的深入介绍。
安装ML.NET
ML.NET可以通过Visual Studio中的NuGet包管理器为任何支持.NET Standard的项目安装(几乎所有.NET项目都可以这样做)。
要将ML.NET添加到项目中,请转到NuGet包管理器并安装最新版本的Microsoft.ML。我还建议您安装Microsoft.ML.AutoML,因为这里的许多示例都表明,代码和AutoML是开始使用ML.NET的好方法。
有关使用NuGet包管理器的更多详细信息,请参阅Microsoft关于NuGet包管理器的文档。
支持AutoML的任务
首先,我将重点介绍ML.NET中使用AutoML支持的五个机器学习任务。由于它们支持AutoML,因此这些任务更容易进入,因此我将为每种类型的任务提供一些代码。为每个任务提供完整的代码和详细信息最好在单独的文章中完成,因此如果您对特定任务的更详细信息感兴趣,请询问,我很乐意提供更多内容。
二进制分类
二元分类任务涉及预测一个分类标签,在给定一组相关特征的情况下,该标签应该被分配给某个东西。例如,给定贷款申请人的一些特征,二元分类模型将预测该贷款是否应该被批准或拒绝。
二元分类任务仅限于预测具有两个可能值的单列。如果有两个以上的可能值,那就是一个多类分类任务,我们将在下面讨论。
使用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分别代表数据集中的一行和算法的最终预测。
注意:ML.NET也支持不使用AutoML的分类,但为简洁起见,本文省略了该代码
多类分类
多类分类任务与二元分类任务非常相似,因为您试图在给定一组特征的情况下预测单个标记列的分类值。二元分类问题和多类分类问题之间的主要区别在于,对于二元分类问题,某物可能只有两个可能的值,而在多类分类问题中,某物可能属于三个或更多可能的类别。
使用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的情况下使用多类分类模型。
有关多类分类的更多代码示例,请查看我关于使用AutoML和ML.NET预测视频游戏的ESRB评级的文章和视频,这也是针对单个任务对ML.NET的深入介绍。
回归
回归任务涉及预测给定一组特征的数值。例如,您可以使用回归模型在给定一组已知的其他因素的情况下预测汽油价格,或者使用回归模型来预测在给定夜间天气因素的情况下您可能需要在早上为汽车除霜的时间长度。
每当您需要计算单个数值时,您都可能会处理回归问题。
为您的回归实验执行模型训练的代码类似于分类实验的代码:
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目前不支持的5个机器学习任务。其中每一个的代码都将比本文所能承受的范围更广,因此请联系并索取更多关于您最感兴趣的内容的内容。
预测时间序列数据
预测涉及根据历史数据预测一批未来的回归值。当您进行预测时,您正在从某个窗口预测未来的值,其中预测的每个值都具有一定程度的置信水平。
这与天气预报的工作方式类似。在预测不久的将来的值时,使用大量相关历史数据的天气预报最为准确。它们可用于预测未来某个时间的值,但随着时间范围的延长,这些预测的准确性会显着下降。
聚类
聚类用于根据与附近数据点的相似性将各种数据点组合成组。这可用于确定哪些客户彼此相似以用于营销、分组以进行推荐或其他目的。在处理地理数据时,这也是确定办公室或手机信号塔最佳位置的好方法。
聚类通常通过选择任意数量的聚类并允许机器学习遵循K-Means聚类算法来优化每个聚类的中心位置,从而最小化每个数据点到其聚类中心的总距离。聚类算法也倾向于在可能的情况下尝试将聚类彼此隔开。
异常检测
异常检测可用于将单个交易标记为异常以进行额外调查。异常检测通常用于病毒检测、信用卡欺诈检测和识别异常网络活动。您可以将异常检测视为一种自动形式的二元分类,其中某些东西要么是正常的,要么是异常的。
图像分类
图像分类类似于二进制或多类分类,但它不是处理数字特征,而是处理图像以确定给定图像中的特征。与分类问题一样,您必须为ML.NET提供各种尺寸、照明和排列方式不同的标记图像,这些图像具有您尝试检测的内容,以便它能够可靠地对图像进行分类。
物体检测
对象检测类似于图像分类,但不是告诉您图像属于特定类别,而是对象检测为您提供图像中的实际边界框,告诉您该特定对象的位置。此外,对象检测能够在单个图像中定位多个对象,这超出了图像分类的限制。
对象检测是Azure认知服务的一部分,在撰写本文时只能通过模型生成器在ML.NET中使用。
结论
希望本文有助于阐明ML.NET可以实现的一些事情——无论是使用AutoML还是不使用AutoML。
观看此博客(和我的YouTube频道),了解更多关于ML.NET的未来内容,让我知道您对学习最感兴趣的是什么。
同时,我建议查看Microsoft在ML.NET上的文档以获取更多详细信息,或者在GitHub上查看他们的ML.NET示例
https://accessibleai.dev/post/ml_net_tasks/