龙空技术网

使用 C# 和 ML.NET 进行机器学习简介

AI中国 87

前言:

现时我们对“net cli”大约比较重视,同学们都想要知道一些“net cli”的相关资讯。那么小编在网络上收集了一些对于“net cli””的相关资讯,希望同学们能喜欢,看官们一起来学习一下吧!

今年在Build会议之后,我们真正感受到微软试图改进的主要领域之一是机器学习和人工智能应用程序的开发方式。直到最近,创建机器学习模型并在 .NET 应用程序中使用它并不容易。更准确地说,微软机器学习框架 ML.NET 的第一个版本于2018年发布。

在此之前,开发人员通常使用Python创建模型,然后将它们与其他框架或库一起使用。例如,您可以使用 Pytorch 创建和训练模型,然后将其集成到 C# 应用程序中。但是,无法在 .NET 生态系统中训练模型。ML.NET 改变了这一切,它成为了.NET Core 3的一部分。 就我个人而言,我一直对这个工具以及它从一开始就超级稳定的方式着迷。

从机器学习的基础知识到更复杂的主题,如神经网络、对象检测和 NLP,本课程将指导您成为 ML.NET 超级英雄。

在本文中,我们将探讨几个主题:

为什么选择机器学习?什么是机器学习?机器学习的类型机器学习算法剖析从 ML.NET 开始1. 为什么选择机器学习?

在我们深入研究摆在我们面前的问题之前,让我们花点时间思考一下微软为什么要引入这项技术,以及为什么我们今天应该考虑学习机器学习。嗯,这有几个原因。第一个是技术正在跨越鸿沟。我们正在从只有少数人实践和理解的晦涩科学时期走向一个成为规范的地方。今天,我们可以构建自己的机器学习模型,可以在我们自己的家中解决现实问题。PythonR成为该领域的领先语言,他们已经拥有广泛的库。

你应该考虑探索机器学习、深度学习和数据科学的另一个原因是我们正在产生大量数据。作为人类,我们无法处理这些数据并使之成为科学,但机器学习模型可以。统计数据表明,从时间开始到2005年。人类已经产生了130艾字节的数据。Exabyte 是一个真实的词,顺便说一下,我检查了它基本上,如果你从 TB 扩展,你会得到 PBBYTE,当你从 PB 扩展时,你会得到 Exabyte

有趣的是,从那一刻到2010年。我们产生了 1200 EB 的数据,直到 2015 。我们产生了 7900 EB 的数据。对未来的预测告诉我们,只有越来越多的数据,那就是2025年。我们将拥有 193 ZB 的数据,比 Exabyte 高一级。简而言之,我们拥有越来越多的数据,并且越来越实际地使用它。

另一个有趣的事实是,机器学习背后的想法可以追溯到很久以前。你可以把它看作是这种奇怪的蒸汽朋克科学,因为我们今天使用和探索的概念是基于一些“古老”的知识。拜斯定理于1763年提出,马尔可夫链于1913年提出。学习机的想法可以追溯到50年代,图灵的学习机弗兰克·罗森布拉特的感知器这意味着我们有50 +年的知识来支持我们。总而言之,我们正处于历史的一个特定时刻,我们拥有大量知识,我们拥有大量数据,我们拥有技术。因此,我们有责任尽可能使用这些工具。

2. 什么是机器学习?

机器学习被认为是人工智能的一个分支,它使用统计技术使计算机能够学习如何解决某些问题,而不是显式编程。主要思想是开发一个数学模型,该模型将能够根据某些现象的示例集合做出一些预测。此模型通常事先针对某些数据进行训练。简而言之,数学模型使用对旧数据的见解来预测新数据。整个过程称为预测建模。如果我们用数学来表达,我们试图近似一个映射函数 – f 从输入变量 X 到输出变量 y

我们试图使用这种方法解决两大类问题:回归分类。回归问题需要预测数量。这意味着我们的输出是连续的实值,通常是整数或浮点值。例如,我们希望根据过去几个月的数据预测公司股票的价格。分类问题有点不同。他们试图将输入分为某些类别。这意味着这些任务的输出是离散的。例如,我们试图根据水果的尺寸来预测水果的类别。

3. 机器学习的类型

我们提出的最重要的概念之一是培训或学习过程。这是每个机器学习算法的必要步骤,在此期间,算法使用数据来学习如何解决手头的任务。在实践中,我们通常会收集一些数据,我们需要根据这些数据来创建预测、分类或任何其他处理。此数据称为训练集

正如我们能够根据训练期间的行为和训练集的性质看到的那样,我们有几种类型的学习:

无监督学习 – 训练集仅包含输入。该网络试图识别类似的输入并将它们分类。这种类型的学习是出于生物学动机的,但它并不适合所有问题。监督学习 – 训练集包含输入和所需的输出。这样,网络可以检查其计算输出与所需输出相同的输出,并据此采取适当的措施。在本文中,我们重点介绍这种类型的学习,因为它在行业中使用最多。强化学习 – 训练集包含输入,但在训练期间也会为网络提供附加信息。发生的情况是,一旦网络计算了其中一个输入的输出,我们提供的信息表明结果是对还是错,并可能表明网络所犯错误的性质。有点像人工神经网络的奖励和惩罚概念。这个概念很有趣,但它超出了本书的范围,所以,一般来说,我们只会有前两种类型的训练。4. 机器学习算法剖析

让我们花点时间指出机器学习算法的主要构建块。机器学习的完整过程可以作为管道进行观察。当然,在管道的开头是数据。数据可以来自不同的来源。其他系统可以生成它,也可以人类创建它。有时我们使用网络抓取器从网络获取数据,而其他时候数据在某些数据库中可用。通常,这些数据是非结构化和稀疏的。这对算法来说可能是一个问题,这就是为什么管道的第二步是数据的预处理和特征工程。这是标准机器学习算法所必需的步骤,而更高级的方法(如深度学习)则不需要它。

在数据经过预处理和准备后,我们将其提供给我们的机器学习算法。这称为训练过程,在此期间算法需要学习。机器学习算法本身包含不同的参数,这使得这种学习成为可能。我们这是什么意思?好吧,基于这些输入值,算法创建预测 – 输出值。但是,这些预测并不是此算法提供的唯一输出。

监督学习中,我们有预期输出,因此我们可以用它来计算预测与预期结果的偏差程度。为此,我们可以使用不同的函数并以不同的方式衡量惩罚。该函数称为损失函数,该算法的目标是最小化函数计算的惩罚。在数学中,我们最小化或最大化的表达式称为目标函数。

然后我们使用计算出的惩罚来更改机器学习算法的参数,以便下次获得更好的预测。通常,这是通过最小化我们计算的惩罚来完成的。这就是机器学习算法的方式,它不仅在训练过程中产生输出值,而且它会改变自己,以便它可以改进其预测。这就是机器学习算法的隐式输出是算法本身的方式。经过训练的算法通常称为模型。这个名字来自数学。

5. 从 ML.NET 开始

ML.NETMicrosoft 的机器学习框架,它提供了一种在 .NET 生态系统中训练、创建和运行模型的简单方法。这对 .NET 开发人员来说是个好消息,因为它允许您重用作为 .NET 开发人员已有的所有知识、技能、代码和库。但是,这不仅仅是 .NET 开发人员的框架。事实上,ML.NET 证明了自己是一个出色的端到端工具,它使任何开发人员都能够创建复杂的管道并绑定到不同的数据源

如果要在项目中使用 ML.NET,则至少需要具有 .NET Core 2.0,因此请确保在计算机上安装了它。我们建议您至少使用 .NET Core 3.NET 5。您应该知道的另一件事是它当前必须在 64 位进程中运行。在制作 .NET Core 项目时请记住这一点。使用包管理器控制台进行安装非常简单。

您所要使用的只是以下命令:

Install-Package Microsoft.ML 

这可以通过使用 .NET CLI 来实现。如果要这样做,请确保已安装 .NET SDK 并运行以下命令:

dotnet add package Microsoft.ML

除此之外,以相同的方式安装Microsoft.ML.DataView很有用。或者,可以使用Visual Studio的“管理NuGetPackage”选项:

5.1 体系结构和高级概述

ML.NET 的主要目标是提供一种简单的方法来构建复杂的端到端管道,从可以转换和特征化原始数据的步骤到训练机器学习模型并将其部署到其他系统中。

正如我们已经提到的,ML.NET 旨在为.NET开发人员提供直观的设计。这就是为什么您会遇到可以在其他框架(如 ASP.NET实体框架)中找到的概念和模式。ML.NET 的核心可以在两个类MLContextDataView中找到。MLContext 类是一个单例类,其对象提供对大多数 ML.NET 功能的访问,例如在 ML.NET 上下文中称为训练器的各种机器学习算法。

DataView 类是从关系数据库管理系统借来的抽象。此类提供架构化数据的组合处理,同时能够优雅有效地处理大于主内存的数据集中的高维数据。简而言之,这个类是 ML.NET 如此之快的原因。

使用 ML.NET 构建应用程序包括几个步骤:

加载数据 – 必须将原始数据加载到内存中,并且为此使用 IDataView。创建管道 – 管道由转换数据或训练机器学习算法的步骤组成。ML.NET 提供了各种转换步骤,例如独热编码和各种机器学习算法。训练机器学习模型 – 创建管道后,可以开始训练。这是使用所有算法都支持的 Fit() 方法完成的。评估 – 可以随时评估模型,并可以根据评估做出其他决策。保存 – 训练后,模型将保存到文件中。通常,构建完整的应用程序的方式应为一个微服务训练和评估机器学习模型,另一个微服务使用它。加载 – 可以加载机器学习模型并将其用于预测。

除了提到的类之外,我们还需要提及更多组件。估算器是我们在创建管道期间创建的对象。此模型未经训练。另一方面,转换器实例是一个经过训练的模型,它还负责将模型加载回内存中。

5.2 简单示例

在这个简单的示例中,我们可以看到如何构建一个 ML.NET 管道并训练机器学习算法:

using System;using Microsoft.ML;using Microsoft.ML.Data;class Program{   public class HouseData   {       public float Size { get; set; }       public float Price { get; set; }   }   public class Prediction   {       [ColumnName("Score")]       public float Price { get; set; }   }   static void Main(string[] args)   {       MLContext mlContext = new MLContext();       // 1. Load Data       HouseData[] houseData = {           new HouseData() { Size = 1.1F, Price = 1.2F },           new HouseData() { Size = 1.9F, Price = 2.3F },           new HouseData() { Size = 2.8F, Price = 3.0F },           new HouseData() { Size = 3.4F, Price = 3.7F } };       IDataView trainingData = mlContext.Data.LoadFromEnumerable(houseData);       // 2. Create pipeline       var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })           .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));       // 3. Train model       var model = pipeline.Fit(trainingData);       // 4. Make a prediction and evaluate       var size = new HouseData() { Size = 2.5F };       var price = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size);       Console.WriteLine($"Predicted price for size: {size.Size*1000} sq ft= {price.Price*100:C}k");   }}

在这个简单的示例中,我们首先创建一个 MLContext 实例。然后我们创建一个 HouseData 数组,这是我们事先定义的类。这是一个例子,在现实世界中,我们将从文本文件或现有数据库加载数据。然后我们将该数据加载到内存中。请注意,我们使用了 LoadFromEnumerable() 方法,但还有其他方法可以与不同的系统集成。然后我们创建管道。这里我们使用 Append() 方法来添加不同的转换和机器学习算法。在这种特殊情况下,我们使用了SDCA回归算法,它是线性回归的一个版本。然后我们使用 Fit() 方法训练模型,最后使用它进行新的预测。

5.3 为什么要使用 ML.NET?

最后,让我们看看为什么要为我们的项目考虑 ML.NET。事实证明,ML.NET 的性能非常好。事实上,ML.NET 使用 95GB 的亚马逊评论数据集训练了一个准确率 9% 的情绪分析模型。由于内存错误,其他流行的机器学习框架无法处理数据集。在10%的数据集上进行训练,让所有框架完成训练,ML.NET 展示了最高的速度和准确性。性能评估在其他机器学习方案中发现了类似的结果。除此之外,ML.NET 可以使用不同技术的不同型号轻松扩展

结论

在本文中,我们开始使用 ML.NET 进行机器学习。如果您想了解更多信息,请查看我们的 ML.NET 课程。

感谢您的阅读!

原文标题:Introduction to Machine Learning with C# and ML.NET

原文链接:

作者:Nikola M. Zivkovic

编译:LCR

标签: #net cli