使用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 包管理器文档

e28f6b56641d373d00cca41a689003e7.png

支持自动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 允许你和你的团队使用你已经熟悉的语言将机器学习功能集成到你的应用程序中,而无需深入了解各种机器学习算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaWeb学习笔记】15 - jQuery

目录 零、官方文档 一、jQuery基本介绍 1.基本介绍 2.原理图 二、JQuery入门使用 1.下载JQuery 2.jQuery快速入门 三、jQuery对象 1.什么是jQuery对象? 2.DOM对象转换成jQuery对象 3.jQuery对象转成DOM对象 四、jQuery选择器 1.jQuery选择器介绍 2.基本选择器 3…

转义字符

2019独角兽企业重金招聘Python工程师标准>>> &quot; 这是HTML语言中的表示引号&#xff08;"&#xff09;的字符实体 常用表&#xff1a; No.文字表記10進表記16進表記文字 Comment001&quot;&#x22;""" quotation mark APL quote0…

JSP使用JSON传递数据,注意避免中文乱码

JSP传递数据时不方便使用Java中的对象类型&#xff0c;一般使用JSON来传递对象。 在使用JSON时&#xff0c;前端js如下&#xff0c;注意指定dataType&#xff1a; var htmlobj $.ajax({ url:"chat.do",type:"POST", data:{sayingContent:$("#textarea…

【求助】AIX5.3主机下 memcached的内存使用异常

2019独角兽企业重金招聘Python工程师标准>>> AIX5.3主机下 memcached 内存增长到256M后&#xff0c;就不增长了&#xff08;实际启动时设置的内存>2G&#xff09;&#xff1b; 测试发现在windows、Linux DLXEL02 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT…

MASA Framework - DDD设计(1)

DDD领域驱动设计是一个有关软件开发的方法论&#xff0c;它提出基于领域开发的开发模式&#xff0c;基于DDD理论&#xff0c;我们可以设计出高质量的软件模型。它围绕业务概念构建领域模型来控制业务的复杂度&#xff0c;解决软件难以理解和演化的问题。微服务微服务是一种架构…

linux第二课

linux第二课关机 halt shutdown重启 reboot运行终端 gnome-terminalsystem-config-date 日期与时间firefox http://www.baidu.com 火狐打开百度gedit 文件名 文本编辑器转载于:https://blog.51cto.com/2732951/1899825

mysql的indata文件_【数据分析】MySQL之不能导入本地文件“Loading local data is disable;”...

今天在使用"利用MySQL的命令行进行CSV文件的导入"时&#xff0c;遇到了这样一个问题&#xff1a;提示本地文件无法导入&#xff0c;必须要"同时获得客户端和服务器端的许可"。很难受&#xff0c;于是上网搜了一下教程&#xff0c;最后综合了以下这几个网站…

经典语录和思考总结

研发类  科学研究&#xff0c;搞设计的 技术类  工程技术&#xff0c;搞实施的 管理类  工商管理&#xff0c;人为管理&#xff0c;。。。 功成名就 成功并不是一蹴而就的&#xff0c;成功分为“成”和“功”两个阶段&#xff0c;只有积累“功”&#xff0c;才能促使“成…

Kubernetes 集群日志 和 EFK 架构日志方案

目录第一部分&#xff1a;Kubernetes 日志Node Level Logging AgentStreaming sidecar containerSidecar Logging AgentKubernetes Logging 是如何工作的Kubernetes Pod 日志存储位置Kubelet LogsKubernetes 容器日志格式Kubernetes 日志的类型Kubernetes Logging 架构Kubernet…

python运行速度慢是解释器的原因_python为什么会运行慢

我们之前一定听有人说过&#xff0c;python的执行速度比其他语言慢。python会运行慢的原因&#xff1a;1、python是动态性语言不是静态性语言这是说在python程序执行的时候&#xff0c;编译器不知道变量的类型。图1.展示了C语言中的变量与python中变量的区别。在C中编译器知道变…

LeetCode之Keyboard Row

1、题目&#xff1a; Given a List of words, return the words that can be typed using letters of alphabeton only one rows of American keyboard like the image below.Example 1: Input: ["Hello", "Alaska", "Dad", "Peace"]…

微信公众平台多客服

微信公众平台官方推出多客服功能&#xff0c;商户在微信公众平台&#xff08;http://mp.weixin.qq.com&#xff09;开通人工客服权限以后&#xff0c;于“功能-多客服”中&#xff0c;添加客服。然后可以在电脑端上使用多客服接待。其使用方法如下。 1建立客服团队 商户在微信公…

C#中类的异常处理

欢迎您成为我的读者&#xff0c;希望这篇文章能给你一些帮助。前言日常编码过程中&#xff0c;最重要的技能不是说你学会使用很多最新的编程技术或者做出一个高大上的系统。而是你在写代码过程中&#xff0c;对异常的处理&#xff0c;是否系统可以稳定&#xff0c;健壮。对于异…

Linus Torvalds: 成功的项目源于99%的汗水与1%的创新

2017年2月15日&#xff0c;在加利福尼亚州的开源领袖峰会上&#xff0c;由Linux基金会执行董事Jim Zemlin进行的一次采访中&#xff0c;Torvalds讨论了他如何管理Linux内核的开发以及他对工作的态度。\\\\Linus Torvalds认为&#xff0c;科技行业对创新的颂扬是一种自鸣得意&am…

Large sum

聪明的办法是想&#xff1a;求前10位&#xff0c;那只要前8位加起来&#xff0c;进2位就OK。 本的办法&#xff0c;就是真的加起来&#xff0c;截前面10位。如我。 numList str.split() sum 0 for i in range(0,len(numList)):sum int(numList[i][0:50])print i,numList[i][…

.NET6之MiniAPI(十六):数据保护

对于web&#xff0c;安全是一个永久的话题&#xff0c;所以ASP.NET Core数据保护提供了一个简单&#xff0c;易用的加密API&#xff0c;可以用来保护数据&#xff0c;密钥管理和轮换。ASP.NET Core的数据保护是根据本机的一个key来生成加密码&#xff0c;然后再用这个key来解密…

.NET 云原生架构师训练营(权限系统 代码实现 ActionAccess)--学习笔记

▲ 点击上方“DotNet NB”关注公众号回复“1”获取开发者路线图学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第188篇原创文章目录开发任务代码实现开发任务DotNetNB.Security.Core&#xff1a;定义 core&#xff0c;models&#xff0c;Istore&#xff1b;实现 defaul…

表格列mouse经过时高亮显示

前几天Insus.NET有练习《表格行mouse经过时高亮显示》http://www.cnblogs.com/insus/p/3715733.html &#xff0c;今天有奇想&#xff0c;是否可以实现mouse经过表的列时&#xff0c;整列高亮呢&#xff1f;Insus.NET就在前一示例中&#xff0c;修心jQuery来练习。 修改.mouseo…

REDIS调优

2019独角兽企业重金招聘Python工程师标准>>> 1、优先使用批量操作&#xff0c;例如hset&#xff0c; 2、批量命令用管道技术 3、因为redis是单线程的防止慢命令阻塞 4、可以搭建主从读写分离集群&#xff0c;费时的操作都移到读服务 用slowlog get 查看耗时操作 转载…

分库分表下极致的优化

题外话这边说一句题外话,就是ShardingCore目前已经正式加入 NCC 开源组织了,也是希望框架和社区能发展的越来越好,希望为更多.netter提供解决方案和开源组件介绍依照惯例首先介绍本期主角:ShardingCore 一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案&#xff0c;…