使用ML.NET进行自定义机器学习

ML.NET是Microsoft最近发布的用于机器学习的开源,跨平台,代码优先的框架。尽管对我们来说是一个新的框架,但该框架的根源是Microsoft Research,并且在过去十年中已被许多内部团队使用,包括那些您几乎肯定听说过的产品的开发人员-Microsoft Windows,Office和Bing,仅举几例。

ML.NET使.NET开发人员可以轻松地将机器学习集成到其应用程序中,无论是控制台,桌面还是Web。它涵盖了机器学习活动的整个生命周期,从模型的训练和评估到使用和部署。支持许多典型的有监督和无监督机器学习任务,包括分类,回归,推荐和聚类。该框架还与TensorFlow集成,使.NET开发人员能够从熟悉的环境调用深度学习模型(适用于诸如对象检测或语音分析之类的任务)。

为什么选择ML.NET?

如今,在为我们的应用程序添加机器学习或AI功能的选项方面,我们总是无所适从。借助NuGet包和仅几行代码,我们就可以利用Azure认知服务的强大功能以高度的准确性和性能执行情感分析,对象检测和OCR等复杂任务。微软确实做了令人难以置信的工作,使各种经验的开发人员都可以使用这些工具。

ML.NET如何适合?您可以使用ML.NET来执行许多与Azure一样的机器学习任务。但是,作为一个高度可配置的基于代码的框架,它肯定会花费多行代码。在差异化方面,您可能会考虑ML.NET的一些关键原因是:

  • 训练特定领域的模型:
    许多认知服务模型都在广泛的数据集上进行了训练,以便为各种用例提供??良好的体验。这非常适合接送和使用以及许多实际需求。但是,如果您正在处理特殊问题,那么通用模型可能不太适合。例如,认知服务将毫不费力地告诉您图像是否包含帽子或动物。如果您想检测和区分不同种类的帽子(例如,您自己的帽子收藏)并且不关心识别动物或其他物体,则可以从训练自己的领域特定模型中受益,ML.NET允许你轻松做。
  • 将数据保存在网络中或用户的机器上:
    许多Cognitive Services确实允许您通过提供自定义示例来训练自定义模型或扩展内置模型。在某些情况下,还可以导出和下载模型,以实现离线使用。但是,出于法规或隐私的原因,您可能不希望或被允许上传训练数据或将预测输入发送到云提供商。ML.NET可以以离线方式端到端地用于训练和预测。如果您需要训练和/或预测数据来保持内部,则ML.NET是一个不错的选择。
  • 动态生成ML模型:
    作为代码优先的框架,ML.NET使得基于编译时未知的信息来动态生成机器学习模型非常容易。如果您的应用程序支持动态内容(例如,用户定义的模式),并且您希望集成ML功能,则可以选择ML.NET。
  • 修改或扩展框架:
    作为一个开放源代码项目,ML.NET的完整源代码可在GitHub上获得,从而使您可以根据需要快速研究实现细节,修复错误甚至添加功能。
  • 避免基于消耗的定价:
    ML.NET可以免费使用,无论您执行多少操作。当然,运行自己的系统也要付费!

与Azure认知服务相比,访问这些差异化功能的最大障碍可能是ML.NET对机器学习知识的更高要求。使用ML.NET要求您更多地考虑诸如数据预处理,数据管道,算法选择,模型验证和性能指标之类的事情。虽然理解这些概念将为您提供扎实的机器学习基础,但立即解决所有这些问题可能会有些令人生畏。幸运的是,ML.NET团队已经完成了一些工作,可以帮助新手入门。

缩小差距— AutoML和Model Builder

如果您想使用ML.NET,但是构建管道,选择训练师和评估模型的想法让您三思而后行,那么您可以选择AutoML形式的选择,它是ML.NET的配套库。AutoML通过自动化生命周期的各个部分并尝试为您的数据生成最佳的机器学习模型,降低了新机器学习开发人员的进入门槛。具体来说,它会自动:

  • 从SQL或基于文本的源中加载训练数据
  • 执行输入数据的基本预处理,包括检测分类字段和删除对预测无用的字段
  • 探索潜在的算法和参数,迭代训练模型并根据输入数据评估每种算法和有效性
  • (通过CLI或Model Builder使用时)生成代码以加载经过训练的最佳模型,准备提供新的预测

可以从代码(Install-Package Microsoft.ML.AutoML),命令行界面(dotnet tool install -g mlnet)或通过GUI工具(以Visual Studio扩展,Model Builder的形式)调用AutoML 。

在本文的其余部分,我们将通过一个示例使用Model Builder自动训练机器学习模型并生成使用该模型的代码。

演练—使用Model Builder自动训练出租车票价预测模型

在本演练中,我们将基于时间,距离,乘客人数和付款方式等输入信息,构建一个预测纽约出租车票价的模型。我们将使用ML.NET示例存储库中的数据作为输入。

先决条件:

如果您没有Visual Studio 2017或2019,请在尝试安装Model Builder扩展之前安装其中之一。

步骤1:在Visual Studio中创建一个新项目

ML.NET可在.NET Core所运行的任何x86或x64环境中运行,因此我们可以从许多内置模板开始。在这种情况下,我们将创建一个新的.NET Core控制台应用程序。

创建项目后,请等到屏幕上看到熟悉的空控制台应用程序项目。

步骤2:将“机器学习”添加到您的项目中

安装扩展后,我们可以通过在解决方案资源管理器中右键单击我们的项目,然后选择添加->机器学习来调用模型生成器。完成此操作后,您会看到ML.NET Model Builder首屏引导界面。

步骤3:为您的数据集配置Model Builder

选择方案

我们与Model Builder的交互首先是从一些预定义的场景中进行选择。本质上,这些是针对特定机器学习任务量身定制的模板。在我们的案例中,我们希望预测出租车价格,因此“价格预测”是一个不错的选择。

加载训练数据

下一个任务是指定我们要用于训练的数据。价格预测是监督学习任务的一个示例,其中训练了机器学习模型,通过显示历史数据的示例来进行预测。示例包括模型输入(在我们的示例中为时间,距离和乘客数量)以及输出值(行程的实际票价)。稍后,当我们要预测票价时,我们的模型将采用新行程的详细信息,并将其与从训练数据中得出的关系一起使用,以预测票价。

为了评估机器学习模型的质量,我们通常从训练中排除部分历史数据。这样可以确保我们拥有一些已知的良好输入/输出组合(我们的模型尚未看到),可以将它们与模型的输出进行比较。为此,AutoML会自动撤消部分数据,因此我们可以为其提供完整的数据集。如果完成了可选的先决条件,则应在“选择文件”对话框中选择级联的数据集。否则,您可以粘贴训练数据的URL。使用级联数据集的好处是您将为AutoML提供更大的训练数据。

加载文件后,Model Builder将自动检测列并提供数据预览。我们需要告诉Model Builder我们要预测哪个领域;在我们的例子中是“ fare_amount”字段。

步骤4:使用模型生成器生成最佳模型

训练优化模型

Model Builder使用AutoML迭代探索选项并确定给定数据集的最佳预测算法和参数。迭代时间的上限取决于我们,主要应受训练数据集的大小影响。

ML.NET团队对各种数据集大小的迭代持续时间有一些指导。对于我们的数据集(介于2.5mb和5mb之间,取决于您是否将测试数据和训练数据连接在一起),仅十秒钟就足够了。单击“训练”后,Model Builder将开始迭代模型并显示有关其进度的一些详细信息。Model Builder评估它训练的每个模型,并将模型的RSquared得分用作比较它们的机制。

审查模型效果

执行优化后,Model Builder将概述该过程,包括它能够在迭代时间内生成的最佳五种配置的评估指标。

尽管“Model Builder”会自动选择效果最佳的模型,但是值得花一点时间查看最终指标。如果所选模型的指标不佳,则不太可能在新输入上表现良好。在这种情况下,您可能需要迭代模型训练过程。选项可能包括:

  • 增加AutoML的探索时间(允许它查找更好的算法或参数)
  • 训练数据的数量增加(提供更多示例,更好地代表您的域的可变性)
  • 预处理训练数据(公开可以提高可预测性的新功能,或删除可能无法提高的功能)

在上面的例子中,使用LightGbmRegression训练器生成了最佳模型,其RSquared得分为0.94,这应该表现良好。

步骤5:使用模型

评估后,Model Builder将自动将两个新项目添加到您的解决方案中。第一个是包含模型和输入类的库,现有项目可以引用该库。第二个是带有代码的示例控制台应用程序,该代码演示了如何加载和使用模型。

生成了这两个项目后,我们就可以看到实际的模型了。该示例应用程序使用来自训练数据集的硬编码单个输入来演示模型的用法。为了使其更具交互性,您可以使用以下内容替换Program.cs的内容,从而使您可以交互地输入行程详细信息并获得预计的票价:

using System;
using System.IO;
using System.Linq;
using Microsoft.ML;
using PredictTaxiFareML.Model.DataModels;
using static System.Console;
using static System.Environment;

namespace PredictTaxiFareML.ConsoleApp
{
    class Program
    {
        private const string Quit = "quit";
        private const string ModelPath = @"MLModel.zip";

        static void Main(string[] args)
        {
            var context = new MLContext().Model;
            var model = context.Load(GetPath(ModelPath), out _);
            var engine = context.CreatePredictionEngine<ModelInput, ModelOutput>(model);

            WriteLine("== AutoML Interactive Taxi Fare Predictor == ");
            while (GetInput(out var input))
                WriteLine($"{NewLine}Predicted fare: " +
                 $"{engine.Predict(input).Score:C}{NewLine}");
        }

        private static bool GetInput(out ModelInput input)
        {
            WriteLine($"{NewLine}Enter trip details:{NewLine}");

            input = new ModelInput
            {
                Passenger_count = ReadF("Passenger count", 1),
                Trip_time_in_secs = ReadF("Trip time (mins)", 1) * 60,
                Trip_distance = ReadF("Distance (mi)", 0),
                Vendor_id = ReadCat("Vendor", "VTS", "CMD"),
                Rate_code = ReadF("Rate code (0 - 6)", 0, 6),
                Payment_type = ReadCat("Payment type", "CRD", "CSH"),
            };

            return true;
        }

        private static float ReadF(string title,
            float min = float.MinValue, float max = float.MaxValue)
        {
            while (true)
            {
                try { return Clamp(float.Parse(Prompt(title)), min, max); }
                catch (Exception ex) { WriteLine(ex.Message); }
            }
        }

        private static string ReadCat(string title, params string[] values)
        {
            title = $"{title} [{String.Join(", ", values)}]";

            var ret = "";
            while (!values.Contains(ret))
                ret = Prompt(title);

            return ret;
        }

        private static string Prompt(string title)
        {
            Write($"  - {title}: ");
            return ReadLine().Trim().ToUpper();
        }

        private static float Clamp(float input, float min, float max)
        {
            var ret = Math.Max(Math.Min(input, max), min);

            if (Math.Abs(ret - input) > 0.1)
                WriteLine($"Clamping to {ret}");

            return ret;
        }

        private static string GetPath(string relativePath)
        {
            var root = new FileInfo(typeof(Program).Assembly.Location);
            var asmPath = root.Directory.FullName;

            return Path.Combine(asmPath, relativePath);
        }
    }
}

运行中的代码如下所示:

就是这样!我们已经成功地使用了Model Builder来自动生成优化的模型,以便根据出租车费用数据集进行预测。AutoML自动为我们处理了一些棘手的步骤,使我们无需成为机器学习专家就可以从ML.NET的某些独特功能中受益。希望这个例子有助于为您提供使用ML.NET的启发,您自己可以尝试在某些数据上创建自定义模型。

原文地址:https://www.cnblogs.com/BeanHsiang/p/11863337.html

时间: 2024-08-02 16:28:15

使用ML.NET进行自定义机器学习的相关文章

Core ML 机器学习

在WWDC 2017开发者大会上,苹果宣布了一系列新的面向开发者的机器学习 API,包括面部识别的视觉 API.自然语言处理 API,这些 API 集成了苹果所谓的 Core ML 框架.Core ML 的核心是加速在 iPhone.iPad.Apple Watch 上的人工智能任务,支持深度神经网络.循环神经网络.卷积神经网络.支持向量机.树集成.线性模型等. 概览 借助 Core ML,您可以将已训练好的机器学习模型,集成到自己的应用当中. 支持操作系统:iOS .macOS .tvOS .

AI Boot Camp 分享之 ML.NET 机器学习指南

今天在中国七城联动,全球134场的AI BootCamp胜利落幕,广州由卢建晖老师组织,我参与分享了一个主题<ML.NET 机器学习指南和Azure Kinect .NET SDK概要>,活动虽然只有短短的2天时间的宣传,报名70人,到场40多人. 下面我和你分享一下我对ML.NET 机器学习的一些内容. 作为一个.NET开发者的你,可能很难立即进入机器学习.主要原因之一就是我们无法启动Visual Studio 使用我们所精通的.NET技术尝试这个新事物,这个领域被认为更适合该工作的编程语言

Spark ML下实现的多分类adaboost+naivebayes算法在文本分类上的应用

1. Naive Bayes算法 朴素贝叶斯算法算是生成模型中一个最经典的分类算法之一了,常用的有Bernoulli和Multinomial两种.在文本分类上经常会用到这两种方法.在词袋模型中,对于一篇文档$d$中出现的词$w_0,w_1,...,w_n$, 这篇文章被分类为$c$的概率为$$p(c|w_0,w_1,...,w_n) = \frac{p(c,w_0,w_1,...,w_n)}{p(w_0,w_1,...,w_n)} = \frac{p(w_0,w_1,...,w_n|c)*p(c

关于ML.NET v1.0 RC的发布说明

ML.NET是面向.NET开发人员的开源和跨平台机器学习框架(Windows,Linux,macOS).使用ML.NET,开发人员可以利用他们现有的工具和技能组,通过为情感分析,推荐,图像分类等常见场景创建自定义机器学习模型,将自定义AI开发并注入其应用程序. 今天我们宣布推出ML.NET 1.0 RC(Release Candidate)(1.0.0-preview版本),这是在2019年第二季度发布最终ML.NET 1.0 RTM 之前的最后预览版本. 很快,我们将结束2018年5月开源的伟

2016年GitHub排名前20的Python机器学习开源项目(转)

当今时代,开源是创新和技术快速发展的核心.本文来自 KDnuggets 的年度盘点,介绍了 2016 年排名前 20 的 Python 机器学习开源项目,在介绍的同时也会做一些有趣的分析以及谈一谈它们的发展趋势.和去年一样,KDnuggets 介绍了 GitHub 上最新的并且排名前 20 的 Python 机器学习开源项目.令人吃惊的是,去年一些最活跃的项目已经停滞不前了,也有一些项目跌出了前 20 名(在 contribution 和 commit 方面),当然,也有 13 个新项目进入了前

机器学习和深度学习资料合集

机器学习和深度学习资料合集 注:机器学习资料篇目一共500条,篇目二开始更新 希望转载的朋友,你可以不用联系我.但是一定要保留原文链接,因为这个项目还在继续也在不定期更新.希望看到文章的朋友能够学到更多.此外:某些资料在中国访问需要梯子. <Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.Deep Learning. <Deep Learning in

[转]机器学习和深度学习资料汇总【01】

本文转自:http://blog.csdn.net/sinat_34707539/article/details/52105681 <Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.Deep Learning. <Deep Learning in Neural Networks: An Overview> 介绍:这是瑞士人工智能实验室Jurgen

学习日志---机器学习导论

推荐书: 数据挖掘:实用机器学习 数据挖掘:概念与技术  韩家伟著:细读+后面的引用文章: 机器学习实战(python): 机器学习实用案例解析(R语言): 神经网络与机器学习  simon haykin著:难 Building mL system with python(机器学习系统设计): R语言官方网站:www.r-project.org WEKA:官网 www.cs.waikato.ac.nz/ml/weka/ Petaho: community.pentaho.com/projects

Spark ML Pipeline简介

Spark ML Pipeline基于DataFrame构建了一套High-level API,我们可以使用MLPipeline构建机器学习应用,它能够将一个机器学习应用的多个处理过程组织起来,通过在代码实现的级别管理好每一个处理步骤之间的先后运行关系,极大地简化了开发机器学习应用的难度.        Spark ML Pipeline使用DataFrame作为机器学习输入输出数据集的抽象.DataFrame来自Spark SQL,表示对数据集的一种特殊抽象,它也是Dataset(它是Spar