ML.NET介绍:常使用的数据结构IDataView介绍,进行简单机器学习

ML.NET介绍:常使用的数据结构IDataView介绍,进行简单机器学习

ML.NET一种跨平台的开源机器学习框架。ML.NET将让广大.NET开发人员可以开发自己的模型,并且将自定义的机器学习融入到其应用程序中,无需之前拥有开发或调整机器学习模型方面的专业知识。能够支持诸多机器学习任务,比如说分类(比如文本分类和情绪分析)以及回归(比如趋势预测和价格预测),使用模型用于预测,还包括该框架的核心组件,比如学习算法、转换和核心的机器学习数据结构。

在ML.NET中,IDataView类似于SQL视图:它是一个延迟计算的、不可变的、可游标的、异构的、图式化的数据集。

IDataView简介

IDataView是一组接口和组件,为机器学习和高级分析应用程序提供高效的结构化数据处理。它被设计成优雅而高效地处理高维数据和大型数据集。它不直接处理分布式数据和计算,但适用于对属于较大分布式数据集的数据分区进行单节点处理。

IDataView是ML.NET的数据管道机制。使用这个库的Microsoft团队实现了IDataView相关组件的库(加载器、转换、保护程序、培训器、预测器等),并验证了性能、可伸缩性和任务灵活性的好处。

IDataView的名称来自数据库中的对象,其中术语表通常表示可变的数据体,而视图是对一个或多个表或视图进行查询的结果,通常是不可变的。注意,表和视图都是示意图化的,被组织成符合列类型的类型化列和行。

视图在以下几个方面与表不同:

视图是可组合。新视图是通过对其他视图应用转换(查询)形成的。相反,从现有表生成新表需要复制数据,从而使表解耦;新表没有以任何方式链接到原始表。

视图是虚拟的。表已完全实现/持久化。换句话说,表包含行中的值,而视图从其他视图或表计算值,因此不包含或拥有这些值。

视图是不变的。表是可变的。由于视图不包含值,而只是从源视图计算值,因此没有修改值的机制。

请注意,不变性和组合性是需要对转换进行推理的技术(如查询优化和远程处理)的关键支持因素。不变性也是并发性和线程安全性的关键。虚拟视图最小化了I/O、内存分配和计算。只在需要满足本地信息请求时才访问信息、分配内存和执行计算。

设计要求

IDataView设计满足以下设计要求:

General schema:每个视图携带模式信息,该信息指定视图列的名称和类型,以及与列关联的元数据。系统针对相当少的列进行了优化。

开放类型系统:列类型系统是开放的,即可以在任何时间和任何程序集中引入新的数据类型。

高维数据支持(做数据分析时候,经常把数据先整理成一张大宽表,然后再进行风险预测之类的建模):列的类型系统包含齐次向量类型,因此可以将一组相关的原始值分组到单个向量值列中。

复合性支持:IDataView设计支持各种类型的组件,并支持组合多个基本组件来实现更高级别的语义。

开放组件系统:虽然ML.NET代码有一个越来越大的IDataView组件库,但是可以在其他代码库中实现与这些组件互操作的其他组件。

Cursoring:通过行游标顺序访问视图的行。多个游标可以在同一个视图上活动,可以是顺序的,也可以是并行的。特别是,视图支持通过行进行多次迭代。每个游标都有一组活动列,在游标构建时指定。通过在游标构造时传递的可选随机数生成器支持变换。

要访问视图中的数据,可以通过调用GetRowCursor方法从视图中获取行游标。行游标是视图中单个行(即当前行)上的可移动窗口。行游标提供当前行的列值。光标的MoveNext()方法前进到下一行。还有一个MoveMany(long count)方法,它在语义上等价于重复调用MoveNext(),计算时间。

注意,行游标不是线程安全的;它应该在单个执行线程中使用。但是,多个游标可以在相同或不同的线程上同时活动。

延迟计算:当只请求列的一个子集或行的一个子集时,可以并且通常避免对其他列和行的计算。某些转换、加载器和缓存场景的计算可能是推测性的或急切的,但默认情况下只执行所请求的列和行所需的计算。

不可变性和可重复性:视图提供的数据是不可变的,执行的任何计算都是可重复的。特别是,视图上的多个游标以相同的顺序(在使用相同的变换时)生成相同的行值。在这里看到的。

内存效率:IDataView设计包括协作缓冲区共享模式,消除了在浏览视图时为每行分配对象或缓冲区的需要。从内存分配的角度来看,Cursoring本质上是高效的。执行MoveNext()不需要内存分配。从游标检索基本列值也不需要内存分配。要从游标检索向量列值,调用者可以选择提供应该将值复制到其中的缓冲区。当提供的缓冲区足够大时,不需要额外的内存分配。当缓冲区没有提供或太小时,游标将分配足够大小的缓冲区来保存这些值。这种协作缓冲区共享协议消除了为每一行分配单独缓冲区的需要。为了避免在迭代时进行任何分配,客户机代码只需要在迭代循环之外预先分配足够大的缓冲区。

注意,IDataView允许需要在内存中物化数据的算法这样做。系统中没有任何东西可以阻止组件遍历源数据,并在内存中构建所需信息的完整表示。

批处理并行计算:IDataView系统能够获得一组可以并行执行的游标,每个游标提供行子集。可以在加载器级别或管道中的任意点将游标拆分为多个游标。执行拆分的组件还提供了整合逻辑。这使得计算量大的管道能够利用多个核心,而不会使每个单独的转换实现复杂化。在这里看到的。

大数据支持:在数据文件上构造视图和在视图行中进行游标不需要将整个数据放入内存中。相反,当处理整个数据时,它可以完全加载到内存中。

再ML框架里使用IDataView处理文本数据很简单,代码如下:

示例代码:

1、创建一个MLContext mlContext = new MLContext();

2、通过 MLContext创建一个TextLoader对象,并指定数据列的信息。

Data Reader 对象用来创建数据的ML.NET对象,它获取T的一个实例并从中返回数据,例如,TextLoader是一个IDataReader。例如,TextLoader是一个IDataReader。它获取文件源并生成数据。

TextLoader loader = mlContext.Data.CreateTextReader(

columns: new[]

{

new TextLoader.Column("ImagePath", DataKind.Text, 0),

});

3、按指定的路径(一个或多个),使用TextLoader对象读取文本文件数据到IDataView对象。

var data = loader.Read(path);

或者 loader.Read(new MultiFileSource(dataLocation));

4、在DataView中过滤行

有时你会需要对数据集过滤一部分数据,比如那些离群值(outlier)。ML.NET 中的FilterByColumn()API可以帮助对数据进行过滤。

使用方法如下面的代码所示:

IDataView trainingDataView = mlContext.Data.FilterByColumn(baseTrainingDataView, "Age", lowerBound: 18, upperBound: 60);

5、接下来说一个再ML中重要的概念对象,Estimator(评估器):

Estimator是从数据中学习的对象。学习的结果是一个Transformer。

在ML.NET中,使用这个属性创建学习管道,将不同的Estimator链接在一起:

Transformer也是ML中一个对象,它接受数据,对数据做一些工作,并返回新的转换后的数据。

ML.Net中的大多数转换器倾向于一次操作一个输入列,并生成输出列。例如,一个新的HashTransformer(“foo”,“bar”)从列“foo”中获取值,对它们进行哈希,并将它们放入列“bar”中。

var pipeline = mlContext.Transforms.LoadImages(imageFolder: imagesFolder, columns: ("ImagePath", "ImageReal"))

.Append(mlContext.Transforms.Resize("ImageReal", "ImageReal", ImageNetSettings.imageHeight, ImageNetSettings.imageWidth))

.Append(mlContext.Transforms.ExtractPixels(new[] { new ImagePixelExtractorTransform.ColumnInfo("ImageReal", "input", interleave: ImageNetSettings.channelsLast, offset: ImageNetSettings.mean) }))

.Append(mlContext.Transforms.ScoreTensorFlowModel(modelLocation, new[] { "input" }, new[] { "softmax2" }));

6、接下来是很重要的代码,调用评估器的Fit方法对提供的Data进行学习训练:

var modeld = pipeline.Fit(data);

7、Prediction function(预测函数)

Prediction function可以将transforme应用于一行数据的。

一旦您获得了模型(通过Fit()训练的transforme,或者从某处加载的transforme),您就可以使用它对model. transform (data)的常规调用进行预测。然而,当您在实际场景中使用这个模型时,您通常没有太多的例子可以预测。相反,您每次只有一个示例,您需要立即对它们做出及时的预测。

根据前面的学习模型,创建一个预测引擎,

var predictionEngine = modeld.CreatePredictionEngine(mlContext);

执行方法Predict,进行预测操作。

var output = predictionEngine .Predict(example);

预测函数不是可重入/线程安全(re-entrant / thread-safe)的。如果您希望与多个线程同时进行预测,则需要为每个线程提供一个预测函数。

ML中支持的机器学习类型:

深度学习Deep Learning

ML.NET介绍:常使用的数据结构IDataView介绍,进行简单机器学习

深度学习是机器学习的一个子集。深度神经网络等深度学习架构通常应用于计算机视觉(目标检测、图像分类、风格传递)、语音识别、自然语言处理和音频识别等领域。

现在已经支持TensorFlow with ML.NET,后续会加入Object detection,Style Transfer ,ONNX with ML.NET

Binary classification

将给定集合的元素分类为两组的任务,预测每个元素属于哪一组

ML.NET介绍:常使用的数据结构IDataView介绍,进行简单机器学习

Multi-class classification

将实例分类为三个或多个类之一的任务,预测每个实例属于哪个组。

ML.NET介绍:常使用的数据结构IDataView介绍,进行简单机器学习

预测 Regression

任务是用给定的输入变量数据预测一个数值。它被广泛用于预测和“多少/多少”预测。

ML.NET介绍:常使用的数据结构IDataView介绍,进行简单机器学习

推荐

推荐系统通常基于内容和协同过滤方法。协作方法根据用户过去的行为/喜欢程度/与其他用户相比的评分来预测用户可能喜欢什么产品。提供电源推荐和购买产品推荐的两个示例程序。

ML.NET介绍:常使用的数据结构IDataView介绍,进行简单机器学习

Clustering

对一组对象进行分组,使同一组(称为集群)中的对象比其他组中的对象更相似的ML任务。这是一个探索性的任务。它不跨特定标签对项目进行分类。提供了 “客户细分”和“鸢尾花识别”两个示例。

ML.NET介绍:常使用的数据结构IDataView介绍,进行简单机器学习

ML.NET首先是一个框架,这意味着它经扩展后可以添加流行的机器学习库,比如TensorFlow、Accord.NET和CNTK。我们致力于将开发ML.NET的内部功能方面的全部经验带给开源界的ML.NET。随着时间的推移,ML.NET将充分利用流行的深度学习库(比如TensorFlow、Caffe2和CNTK)以及一般的机器学习库(比如Accord.NET),从而支持其他机器学习场景,比如推荐系统、异常检测及其他方法(比如深度学习)。


分享到:


相關文章: