所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html

微软Infer.NET机器学习组件:http://www.cnblogs.com/asxinyu/p/4329742.html

关于本文档的说明

  本文档基于Infer.NET 2.6对Infer.NET User Guide进行中文翻译,但进行了若干简化和提炼,按照原网站的思路进行,但不局限与其顺序。

  欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利。

  本人正在研究基于Infer.NET组件,并计划将其应用于实际的预测之中,该组件功能强大,封装很完善,但也有很多难以理解的地方,同时官方也给出了大量的例子,限于个人精力有限,更新时间较慢,也希望有兴趣的朋友一起来完成该项工作。

Email:asxinyu@qq.com

  本文章地址http://www.cnblogs.com/asxinyu/p/InferNet_Demo_Learner_1.html

1.基本介绍

  一个 "learner"是一个完整的机器学习应用解决方案,例如分类系统或者推荐系统。这些 Learners都能够直接在命令行或者.NET程序中调用,而无须学习Infer.NET的 API接口. 每一个learner都包括训练,预测以及评估能力。Learners的源代码包括了一些综合使用Infer.NET 的构建复杂稳定的机器学习功能程序的例子。本文是在前一篇文章基础上进行介绍。本文英文原文地址:原文

2.标准数据格式的映射

我们一起回顾以下分类器映射接口IClassifierMapping ,它声明了4个方法:

2.1 GetInstances

  1. IEnumerable<TInstance> GetInstances(TInstanceSource instanceSource);

GetInstances方法手动给学习者提供了实例样本集(培训或测试集),可以在训练和预测中使用。此外,这两个泛型类型,TInstance TInstanceSource,可以自由选择。例如,TInstance可能被绑定到一个类提供的特性和标签;也可能引用或索引到这样一个类的一个对象。为了配合缓存,贝叶斯机器分类器假设相同的实例源总是提供相同的实例。

2.2 GetFeatures

  1. TFeatures GetFeatures(
  2.     TInstance instance, 
  3.     TInstanceSource instanceSource = default(TInstanceSource));

GetFeatures 为指定的样本实例提供所有特征值(指标)。这种方法也同样用在训练和预测中。注意,如果实例本身包含一个对应的特征值,则没有必要指定源。贝叶斯机器分类器需要将TFeatures绑定到 MicrosoftResearch.Infer.Maths.Vector中。为了配合缓存,GetFeatures假设相同的实例源总是提供相同的实例。你可能想给所有实例添加一个恒定的特性,如添加1个特征值一直为1的特征。这将使分类器具有特性值转移的不变性(通过为每个类添加一个预期值)。此外,特性之间的相关性存在越少越好(高度相关特性可能导致训练算法的收敛速度慢)。

2.3 GetLabel

  1. TLabel GetLabel(TInstance instance, 
  2.     TInstanceSource instanceSource = default(TInstanceSource), 
  3.     TLabelSource labelSource = default(TLabelSource));

GetLabel提供了实例需要的实际数据的标签值(类别值),这个方法在训练的过程中被调用。一个标签的来源如果独立与实例源,将会更灵活,因为在某些实际情况中,实际的数据源特性和标签值可能是分开的。如果实例本身包括了标签的数据,那么这里的就可以省略了。为了缓存标签数据和避免转换为本地数据格式的带来的损失,贝叶斯机器分类器假设对于相同的实例调用GetLabel都获取相同的标签。

2.4 GetClassLabels

  1. IEnumerable<TLabel> GetClassLabels(
  2.     TInstanceSource instanceSource = default(TInstanceSource), 
  3.     TLabelSource labelSource = default(TLabelSource));

GetClassLabels方法可以获取分类数据中所有标签数据集。它不仅包括确定当前任务有多个标签,还可以获取对应标签的类型标签。在最简单的情况下,当标签是Bool类型时,GetClassLabels 将返回{true,false}。GetClassLabels可以在分类过程中保证每一个类型的标签都是有效的。IClassifierMapping接口需要这种方法,是因为通常情况下,它有可能不能推出完整的样本标签集合,也就是说,训练集或测试集可能并不包含所有标签类型。

由于可以很灵活的选择合适的数据类型TInstance,TInstanceSource,TLabelSource和TLabel(TFeatures需要Vector类型),一般直接提供一个简单、高效的IClassifierMapping接口实现就可以了,所以提供标准的数据格式是一个使用分类器非常方便的方法。正如前面提到的,贝叶斯机器分类器最终需要将标准的数据格式的转换为Infer.NET算法可以接受的本地数据格式。然而,在很多情况下,在程序中使用本地数据格式要比需要转换的标准数据格式更加有用。IClassifierMapping的一个实现的例子就是本教程前面的性别预测的例子。

3.本地数据格式映射

IBayesPointMachineClassifierMapping接口提供可以由贝叶斯机器分类在训练和预测过程中不需要转换的数据格式,因此这个提供的格式也被称为本地数据格式。

本机数据格式有两个不同的表示方法:密集和稀疏。密集表示单个实例相关联的所有特征值都存储在一个double数组,而稀疏表示包含所有非零特征值和相应的索引。这2种表示方法产生的结果是相同的,只是计算的代价有差别。在训练和预测数据包括很多0特征值的矩阵比对应的稀疏矩阵要快一些。

除了特征值的表示功能,本机数据格式还可以修复标签的类型。在二分类问题中,标签值必须是布尔类型,在多分类问题时,标签必须从0开始的连续整数。通过原生格式提供数据需要实现下面8个方法:

1.IsSparse:IsSparse表示是否以稀疏矩阵存储,注意该特征是不能修改的。

  1. bool IsSparse(TInstanceSource instanceSource);

2.GetFeatureCount:GetFeatureCount获取分类数据中多少个特征。当使用稀疏矩阵表示时,需要建立对应的推理算法。

  1. int GetFeatureCount(TInstanceSource instanceSource);

3.GetClassCount:GetClassCount 返回实例中所有类别标签总数。

  1. int GetClassCount(
  2.     TInstanceSource instanceSource = default(TInstanceSource), 
  3.     TLabelSource labelSource = default(TLabelSource));

上述三种方法都是用于设置贝叶斯机器分类器的特征和标签的有效性。他们都在训练和预测过程中被调用。IsSparse和GetFeatureCount方法可以从GetFeatureValues和GetFeatureIndexes中确定部分返回值。下面两个方法在单个对象的预测中给单个实例传递特征值。他们的返回值不会被缓存。

4.GetFeatureValues (single-instance):GetFeatureValues返回给定实例的一个特征值数组。如果是以稀疏特性表示的(例如IsSparse返回true),这个方法只返回给定实例的所有相关非零特征值。如果表示是非稀疏表示,GetFeatureValues会返回所有的特征值,而不管他们是不是是否他们是零。

  1. double[] GetFeatureValues(
  2.     TInstance instance, 
  3.     TInstanceSource instanceSource = default(TInstanceSource));

5.GetFeatureIndexes (single-instance):GetFeatureIndexes方法如果实例是以非稀疏矩阵表示,则返回null,否则返回一个返回非零特征值对应的特征指数的数组。(??),因此,给训练和测试算法有两种提供特性值和其索引的方法。在训练时,实例可能被进一步分成多个子集(称为批次),可以不直接从内存出处理全部数据。不使用批次,也大部分使用以下两个方法。

  1. int[] GetFeatureIndexes(TInstance instance, 
  2.     TInstanceSource instanceSource = default(TInstanceSource));

6.GetFeatureValues (multi-instance):GetFeatureValues返回每个实例指定的批处理的实例的特性值(相对于是返回指定批次的特征值)。默认情况下,假定所有实例的特性和标签都是在一个处理中进行。如果这是很困难,可能是因为需要太多内存,贝叶斯机器分类器允许将训练数据映射为多个批次进行(设置BatchCount属性)。实例将运行索引从0到BatchCount - 1的批处理。训练的多个批次处理设置参考IterationCount。

  1. double[][] GetFeatureValues(
  2.     TInstanceSource instanceSource, int batchNumber = 0);

7.GetFeatureIndexes (multi-instance):如果以稀疏矩阵标准,GetFeatureIndexes返回null;否则返回指定实例上指定批次的特征索引。对同一批次的实例,这要与GetFeatureValues返回的特征值一致。IBayesPointMachineClassifierMapping最后一个方法是提供真实标签值:

  1. int[][] GetFeatureIndexes(TInstanceSource instanceSource, int batchNumber = 0);

8.GetLabels:getlabel提供给定实例或者标签数据源的实际标签类别值。注意,TLabel在二分类中是bool类型,在多份类中是int类型。在预测中不需要实用该方法。

  1. TLabel[] GetLabels(TInstanceSource instanceSource, 
  2.     TLabelSource labelSource = default(TLabelSource), 
  3.     int batchNumber = 0);

MicrosoftResearch.Infer.Learners.BayesPointMachineClassifierInternal命名空间中的NativeClassifierMapping类及其子方法是实现IBayesPointMachineClassifierMapping接口的例子。这些IClassifierMapping类的封装展示了如何从标准的数据格式转换为本地数据的过程,以及如何在训练中分批次的缓存数据。

4.评估数据格式映射

一个简单的评估测试分类器性能的方法是使用evaluator。Evaluator通过一个实现IClassifierEvaluatorMapping映射接口的实例来读取真是的标签值,由于Evaluator独立于特定分类器要求的具的数据格式,如贝叶斯分类器的IClassifierEvaluatorMapping本质上声明了一个通用的标准数据格式映射IClassifierMapping接口,只是没有GetFeatures方法。而预测输入参数的评价方法,不要通过映射。

5.创建与序列化

5.1 创建贝叶斯分类器

一旦创建映射的实例,就可以根据分类问题的类型,调用下面2个工厂方法,很容易的创建一个贝叶斯机器分类器。

  1. BayesPointMachineClassifier.CreateBinaryClassifier (二类问题)
  2. BayesPointMachineClassifier.CreateMulticlassClassifier (多类问题)

另外,这两种方法都有两个版本,一个是将输入映射到本地数据格式,一个是将输入映射到标准数据格式,分别实现IBayesPointMachineClassifierMapping和IClassifierMapping接口。工厂方法返回IBayesPointMachineClassifier类型的分类器,为训练和预测提供一些适当设置。

例如,假设我们已经实现一个从SQL数据库到贝叶斯机器分类所需的本地数据格式的映射SqlNativeMapping,可以很简单的创建一个多分类器问题的分类器:

  1. var mapping = new SqlNativeMapping();
  2. var classifier = BayesPointMachineClassifier.CreateMulticlassClassifier(mapping);

创建贝叶斯机器分类器的操作是很简单的,不需要数据输入相关计算。

5.2 序列化

序列化是通过ILearner接口的Save扩展方法实现的。该方法有2个重载版本,1个是在文件,1个是在格式化的流。训练和未训练的分类器都可以被序列化和反序列化。序列化一个贝叶斯机器分类器到一个文件的调用程序如下:

  1. classifier.Save("bpm.bin");

该程序序列化分类器的参数和用户定义的映射。它不序列化任何训练数据也没有附加任何事件处理程序。

5.3 反序列化

通过调用BayesPointMachineClassifier的一个静态方法可以加载一个之前被序列化的分类器。和保存方法类似,也可以从一个文件或者格式化流中反序列化一个分类器。

  1. var classifier = BayesPointMachineClassifier.Load
  2.         <SqlInstanceSource, Instance, SqlLabelSource, int, Discrete,
  3.         BayesPointMachineClassifierTrainingSettings,        MulticlassBayesPointMachineClassifierPredictionSettings<int>>("bpm.bin");

上述方法需要的泛型参数如下:

l TInstanceSource :源实例的类型

l TInstance :单个实例的类型

l TLabelSource :源标签的类型

l TLabel :单个标签的类型(贝叶斯分类器有2种,2类为bool,多类为Int)

l TLabelDistribution :标签的分布类型

l TTrainingSettings:训练设置类型

l TPredictionSettings :预测设置类型,分二类问题和多类问题,预测设置的类型是不一样。(BinaryBayesPointMachineClassifierPredictionSettings

和 MulticlassBayesPointMachineClassifierPredictionSettings).

反序列化的泛型参数必须和分类器序列化时的参数精确匹配。同样在反序列化时,将执行版本检查程序,如果序列化的版本不匹配,将抛出一个异常。然而,很多情况下,为了方便,存在很多方法并不需要很多具体的泛型类型,如:

  1. var classifier = BayesPointMachineClassifier.LoadMulticlassClassifier
  2.         <SqlInstanceSource, Instance, SqlLabelSource, int, Discrete>("bpm.bin");

这和前面的从文件反序列化多类贝叶斯机器分类器是等价的。

.NET平台机器学习组件-Infer.NET(三) Learner API—数据映射与序列化的更多相关文章

  1. NET平台机器学习组件-Infer.NET

    NET平台机器学习组件-Infer.NET(三) Learner API—数据映射与序列化 阅读目录 关于本文档的说明 1.基本介绍 2.标准数据格式的映射 3.本地数据格式映射 4.评估数据格式映射 ...

  2. 【原创】.NET平台机器学习组件-Infer.NET连载(一)介绍

    Infer.NET机器学习翻译系列文章将进行连载,感兴趣的朋友请收藏或关注             本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/428 ...

  3. 【原创】.NET平台机器学习组件-Infer.NET连载(二)贝叶斯分类器

                本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 微软Infer.NET机器学习组件文章目录:http:/ ...

  4. Vue.js 组件的三个 API:prop、event、slot

    组件的构成 一个再复杂的组件,都是由三部分组成的:prop.event.slot,它们构成了 Vue.js 组件的 API.如果你开发的是一个通用组件,那一定要事先设计好这三部分,因为组件一旦发布,后 ...

  5. .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍

    Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注重与机器 ...

  6. 【目录】微软Infer.NET机器学习组件文章目录

    本博客所有文章分类的总目录链接:http://www.cnblogs.com/asxinyu/p/4288836.html 1.微软Infer.NET机器学习组件目录 1. Infer.NET连载(一 ...

  7. .NET平台机器学习资源汇总,有你想要的么?

    接触机器学习1年多了,由于只会用C#堆代码,所以只关注.NET平台的资源,一边积累,一边收集,一边学习,所以在本站第101篇博客到来之际,分享给大家.部分用过的 ,会有稍微详细点的说明,其他没用过的, ...

  8. .NET平台机器学习

    .NET平台机器学习资源汇总,有你想要的么? 接触机器学习1年多了,由于只会用C#堆代码,所以只关注.NET平台的资源,一边积累,一边收集,一边学习,所以在本站第101篇博客到来之际,分享给大家.部分 ...

  9. .NET平台机器学习资源汇总,有你想要的么?(转)

    出处:http://www.cnblogs.com/asxinyu/p/4422050.html 阅读目录 1.开源综合类 2.开源.NET平台非综合类 3.其他资源与技术博客 4.我的100篇博客之 ...

随机推荐

  1. 支持“ApplicationDbContext”上下文的模型已在数据库创建后发生更改

    异常信息 解决方法: 1.PM> Enable-Migrations 2.打开生成的Configuration.cs文件,修改代码如下 public Configuration() { Auto ...

  2. JNI和NDK编程

    Java JNI的本意是Java Native Interface(Java本地接口),它是为了方便Java调用C.C++等本地代码所封装的一层接口.通过Java JNI,用户可以调用C.C++所编写 ...

  3. xcode8 升级后注释快键键不能使用的解决方法

    1.这个是因为苹果解决xcode ghost.把插件屏蔽了.解决方法 命令运行:  sudo /usr/libexec/xpccachectl 然后必须重启电脑后生效 2.option+command ...

  4. setTimeout 学习闭包

    @(技术笔记)[css] 学习参考网站 css 网站,可供参考 javascript学习网站 var create = function (i){ return function(){ console ...

  5. STL之priority_queue

    下面以 long long 型队列介绍: Q.empty() // 判断队列是否为空 返回ture表示空 返回false表示空 bool Q.top() // 返回顶端元素的值 元素还在队列里 lon ...

  6. 四则运算安卓客户端UI截图(部分)

    1.我们组安卓手机客户端UI设计主要由林培文同学负责,界面中用到的素材全部由他一人用PS制作,所以在素材来源上当属原创啦.正因为UI由一个人设计,同时他还得分担少量后台代码的编写,颇多的工作量与人才短 ...

  7. CI框架,源代码一次性判断获取post(get)数据是否有某个字段值为空方法

    一.以下是CI框架 1.把所有的要接收的字段放在数组中 例: 我要接收:id,name,age,mobile 等字段 $req = array('id','name','age','mobile'); ...

  8. Reactive Extensions介绍

    Reactive Extensions(Rx)是对LINQ的一种扩展,他的目标是对异步的集合进行操作,也就是说,集合中的元素是异步填充的,比如说从Web或者云端获取数据然后对集合进行填充.Rx起源于M ...

  9. .NET中那些所谓的新语法之四:标准查询运算符与LINQ

    开篇:在上一篇中,我们了解了预定义委托与Lambda表达式等所谓的新语法,这一篇我们继续征程,看看标准查询运算符和LINQ.标准查询运算符是定义在System.Linq.Enumerable类中的50 ...

  10. ASP.Net请求处理机制初步探索之旅 - Part 4 WebForm页面生命周期

    开篇:上一篇我们了解了所谓的请求处理管道,在众多的事件中微软开放了19个重要的事件给我们,我们可以注入一些自定义的业务逻辑实现应用的个性化设计.本篇,我们来看看WebForm模式下的页面生命周期. ( ...