微信
手机版
网站地图

带你进入ML.Net(.net core/C#)机器学习的国际

2019-03-27 15:55:51 投稿人 : admin 围观 : 597 次 0 评论

网上现已看到不少关于ML.Net的教程,信任很初中校花多小伙伴们现已对怎样运用ML.Net有了必定的了带你进入ML.Net(.net core/C#)机器学习的世界解。有必定经历的小伙伴都知道,在学习一个结构或库之前最好是先了解清楚该结构所表达的范畴机制,由于结构规划的时分一般都是以范畴概念来界说一系列的高层接口。本文就从这个视点去学习ML.Net,经过本文你不光能够了解到ML.Net的运用,还会琪色带你进入ML.Net(.net core/C#)机器学习的世界了解到机器学习乃至深度学习的一些通用机制,这些常识能够协助你快速入门其他相关的库,比方Tensorflow。咱们先从一个小比方开端!

项目地址:https://github.com/CrystalWindSnake/Test.MlNet.git

Datas\datas-formula.xlsx:数据生成带你进入ML.Net(.net core/C#)机器学习的世界进程,包括公式等。

Datas\datas.csv:从datas-formula.xlsx另存得到的数据文件,项意图数据源为此文件。

1、 自己造的数据

带你进入ML.Net(.net core/C#)机器学习的世界

以上数据能够在项目中Datas\datas.csv中找到。字段input1,、input2为输入,result为某种核算成果后的分类。我特意把核算进程中用到的变量和公式列躲藏了,这个时分你能够通知我,假如我输入是input1=20、input2=15,result的成果是啥吗?明显你不行能知道,由于你不知道数据在从输进口(input1、input2)到输出口(result)中心的核算进程。

机器学习本质上来说便是经过许多的样本数据然后推断出这个中心的核算过综影视之勾搭渣夫程。那么这次咱们就用ML.Net来完结。

2、 通用机制

带你进入ML.Net(.net core/C#)机器学习的世界

上图是示例程序运用ML.Net完结的数据流进程。咱们来一个个环节去了解。

(1) 数据读取与数据视图

带你进入ML.Net(.net core/C#)机器学习的世界

 private TrainTestData PrepareData()
{
var dv = _MLContext.Data.LoadFromTextFile(FileHelper.DataPath, separatorChar: ',', hasHeader: true);
return _MLContext.MulticlassClassification.TrainTestSplit(dv, testFraction: 0.2);
}


1. 数据从数据文件读取,运用的是TextLoader。

2. 运用Loade带你进入ML.Net(.net core/C#)机器学习的世界r的意图是为了取得一个数据视图IDataView,这个视图表达了数据的数据结构(比方各有哪些字段,每个字段的类型)。

3. 为什么特意把Lomncc33ader和IDataView分隔规划?由于这姿态你就能够经过不同的Loader来把多个不同的数据源汇总到一个数据视图上。

4. 数据视图的数据结构是由运用者来界说。比方咱们的比方中,文件中实践有7列数据(示例图上我特意躲藏了其间的3列),福州越城记但咱们练习模型的数据只需求(input1、红豆红俞静input2、result),因而咱们能够界说结构只有这3列。结构规划者考虑到让运用者界说每个列的成果的代码比较繁琐,因而加了一个功用便是能够让数据视图与你自界说类型来绑定。实践上你能够看成是结构经过反射得到自界说类型,然后主动生成数据视图的结构界说。

5. 到此为止,咱们得到了一个包括3列字段的数据视图,数据来源于csv文件。

(2) 数据转化与管道

现在尽管咱们得到了一个数据视图,但还不能直接把该视图传给Trainer做练习,由于练习器对传入的数据视图有要求,究竟练习器是不知道未来运用者会传入什么结构的数据,那倒不如让运用者来按练习器的要求标准数据视图。

要求如下:

视图中有必要有一个字段表明一切的输入(用向量表明,能够理解为一个数值数组),该字段有必要叫" Features"。机器学习中称为特征。

大部分的Trainer都要求传入的视图中有一字段表明输出唐树龙成果(有必要是数值,比方float或ui外物不行必nt),该字段有必要叫"Label", 机器学习中透明秀称为标签。留意,有些练习器是不需求标签字段,比方聚类模型,由于这种无监督模型是不需求通知他正确答案。

持续咱们的比方

 private EstimatorChain CreatePipeline()
{
var toFeatures = _MLContext.Transforms.Concatenate(outputColumnName: DefaultColumnNames.Features, inputColumnNames: FileHelper.FeatureNames);
var toLabel = _MLContext.Transforms.Conversion.MapValue带你进入ML.Net(.net core/C#)机器学习的世界ToKey(outputColumnName: DefaultColumnNames.Label, inputColumnName: FileHelper.LabelName);
var trainer = _MLContext.MulticlassClassification.Trainers.LightGbm();
var toValueLabel = _MLContext.Transforms.Conversion.MapKeyToValue(outputColumnName: "PredictedResult", inputColumnName: DefaultColumnNames.PredictedLabel);
var pipeline = toFeatures
.Append(toLabel)
.Appen最原始的愿望txtd(trainer)
.Append(toValueLabel)拒嫁断袖王爷;

return pipeline;
}

1. 把input1、input2连接到一个向量字段"Features"

2. 把result这个字符串的字段,做【MapValueToKey】转化到一个uint类型的字段"Labe刘柏漠l"。比方result字段有g19623种字符串成果(a,b,c),那么终究Label字段就转化为(0,1,2)这姿态的值。

3. 在ML.Net中,经过ITransformer表明数据转化,其实就像一个函数,输入,经过核算,输出。多个这样的转化器连接起来就组成一个管道。

4. 一个转化器是能够带有状况的,比带你进入ML.Net(.net core/C#)机器学习的世界如上一步的【MapValueToKey】,数据经过他后,他的内部会保持一个字典(称为元数据),这样之后咱们这个模型(包括了一系列的ITransformer的管道)能够保存和康复,在输入新的数据时,就能够得到共同的key

5. 看起来Trainer与ITransformer很挨近,同样是输入,经过核算,输出。仅仅Trainer的核算进程中的元数据(参数等)是需求经过练习(Fit)才干得到,而ITransformer是运用者直接界说他的核算(转化)进程。

6. 每个品种的Trainer输出的数据视图会有些不一样。比方咱们现在做多分类,输出必定有Score和PredictedLabel这两个字段,前者一般是表明猜测成果每个品种的概率,后者是猜测立秋宋刘翰成果。留意,猜测成果是uint,这个时分咱们需求把uint转为本来数据源中的字符串表明,所以咱们在练习器后边参加一个【MapKeyToValue】,作为之前【MapValueToKey】的方向操作,这时分就需求用上之前说的【MapValueToKey】中的元数据字典。

7. 所以,咱们的管道能够按这样的次序来界说。Concatenate(input1,input2)=> MapValueToKey(result) => Trainer(Features,Label) => MapKeyToValue(PredictedLabel)

(3) 练习

var model = pipeline.Fit(trainTestSet.TrainSet);

之前现已有提到过,Trainer经过练习(Fit),便是一个经过样本数据的输入(特征)和输出(标签),然后不断重复调整内部的核算元数据(便是各种参数)。运用ML.Net便是简略的调用管道的办法Fit,天然要传入咱们准备好的数据视图。

(4) 评价

 private void EvaluateModel(IDataView dv, TransformerChain model)
{
var evls = model.Transform(dv);
var metrics = _MLContext.MulticlassClassification.Evaluate(evls);
ConsoleHelper.PrintEvaluateResult(metrics);
}

怎么评价模型的质量,已然咱们有样本数据(有输入,有正确的成果),那么只需求把测验数据输入管道,用输出的成果与正确的成果比照,就知道准确率。留意一点:练习模型的数据与评价模型的数据不要有交集,因而在一开端加载数康小虎据视图的时分,就能够把数据按必定的份额来划分为练习集和测验集。

(5) 猜测

 var predictionEngine = model.CreatePredictionEngine(_MLContext);
var input = new DataInfo
{
Input1 = 10,
Input2艾佛兰德拉 = 20
};
var p = predictionEngine.Predict(input);
Console.WriteLine($"l带你进入ML.Net(.net core/C#)机器学习的世界abel key:{p.PredictedLabel},PredictedName:{p.PredictedResult}");

经过Fit后的Model能够生成一个猜测引擎(PredictionEngine)的目标,其实便是让你能够界说输入和输出视图绑定到你自界说类上。这样你就无需自行把待猜测数据转化成数据视图才干够得到猜测输出。

3、 总结

至此,根本能够用ML.Net做各种机器学习的使命。假如你这时分去看看python的相关库,比方scikit-learn乃至是tensorflow,你会惊奇发现他们的机制与本文说的迥然不同。

有人会疑问,已然pyt余峻承hon现已有这么老练的库,为什么还去斗奶学ML.Net。自己觉得,假如你仅仅简略玩玩,不需求做自己的进程或事务的封装,直接用python会比较好。但假如你需求保护一个长时间项目,那么强类型言语的优势很明显,许多时分你不需求每次看着文档去写代码。因而ML.Net是值得重视的,现在来说,.net core渠道上机器学习范畴还需求一个特征工程库,python现已有featuretools,期望不久的未来能够看到.net core渠道也有这纪忠哲姿态优异的库。

之后我会不定期跟进ML.Net,还计划写一些怎么综合利用python和ML.Net来协作完结机器学习项目,敬请重视。

相关文章

标签列表