ML.NET 示例:多类分类之鸢尾花分类
写在前面
准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正。
如果有朋友对此感兴趣,可以加入我:https://github.com/feiyun0112/machinelearning-samples.zh-cn
鸢尾花分类
| ML.NET 版本 | API 类型 | 状态 | 应用程序类型 | 数据类型 | 场景 | 机器学习任务 | 算法 |
|---|---|---|---|---|---|---|---|
| v0.7 | 动态 API | 最新版本 | 控制台应用程序 | .txt 文件 | 鸢尾花分类 | 多类分类 | Sdca Multi-class |
在这个介绍性示例中,您将看到如何使用ML.NET来预测鸢尾花的类型。 在机器学习领域,这种类型的预测被称为多类分类。
问题
这个问题集中在根据花瓣长度,花瓣宽度等花的参数预测鸢尾花(setosa,versicolor或virginica)的类型。
为了解决这个问题,我们将建立一个ML模型,它有4个输入参数:
- petal length
- petal width
- sepal length
- sepal width
并预测该花属于哪种鸢尾花类型:
- setosa
- versicolor
- virginica
确切地说,模型将返回花属于每个类型的概率。
ML 任务 - 多类分类
多类分类的广义问题是将项目分类为三个或更多类别中的一个。 (将项目分类为两个类别之一称为二元分类)。
多类分类的其他例子包括:
- 手写数字识别:预测图像中包含10个数字(0~9)。
- 问题标记:预测问题属于哪个类别(UI,后端,文档)。
- 根据患者的测试结果预测疾病阶段。
所有这些例子的共同特点是我们要预测的参数可以取几个(超过两个)值中的一个。换句话说,这个值由enum表示,而不是由integer、float、double或boolean类型表示。
解决方案
为了解决这个问题,首先我们将建立一个ML模型。然后,我们将在现有数据上训练模型,评估其有多好,最后我们将使用该模型来预测鸢尾花类型。

1. 建立模型
建立模型包括:
- 使用
DataReader上传数据(iris-train.txt) - 创建一个评估器并将数据转换为一列,以便ML算法(使用
Concatenate)可以有效地使用它。 - 选择学习算法(
StochasticDualCoordinateAscent)。
初始代码类似以下内容:
// Create MLContext to be shared across the model creation workflow objects
// Set a random seed for repeatable/deterministic results across multiple trainings.
var mlContext = new MLContext(seed: 0);
// STEP 1: Common data loading configuration
var textLoader = IrisTextLoaderFactory.CreateTextLoader(mlContext);
var trainingDataView = textLoader.Read(TrainDataPath);
var testDataView = textLoader.Read(TestDataPath);
// STEP 2: Common data process configuration with pipeline data transformations
var dataProcessPipeline = mlContext.Transforms.Concatenate("Features", "SepalLength",
"SepalWidth",
"PetalLength",
"PetalWidth" );
// STEP 3: Set the training algorithm, then create and config the modelBuilder
var modelBuilder = new Common.ModelBuilder<IrisData, IrisPrediction>(mlContext, dataProcessPipeline);
// We apply our selected Trainer
var trainer = mlContext.MulticlassClassification.Trainers.StochasticDualCoordinateAscent(labelColumn: "Label", featureColumn: "Features");
modelBuilder.AddTrainer(trainer);
2. 训练
训练模型是在训练数据(已知鸢尾花类型)上运行所选算法以调整模型参数的过程。它在评估器对象中的Fit() 方法中实现。
为了执行训练,我们只需调用方法时传入在DataView对象中提供的训练数据集(iris-train.txt文件)。
// STEP 4: Train the model fitting to the DataSet
modelBuilder.Train(trainingDataView);
[...]
public ITransformer Train(IDataView trainingData)
{
TrainedModel = TrainingPipeline.Fit(trainingData);
return TrainedModel;
}
3. 评估模型
我们需要这一步来总结我们的模型对新数据的准确性。 为此,上一步中的模型针对另一个未在训练中使用的数据集(iris-test.txt)运行。 此数据集还包含已知的鸢尾花类型。
MulticlassClassification.Evaluate计算模型预测的值和已知类型之间差异的各种指标。
var metrics = modelBuilder.EvaluateMultiClassClassificationModel(testDataView, "Label");
Common.ConsoleHelper.PrintMultiClassClassificationMetrics(trainer.ToString(), metrics);
[...]
public MultiClassClassifierEvaluator.Result EvaluateMultiClassClassificationModel(IDataView testData, string label="Label", string score="Score")
{
CheckTrained();
var predictions = TrainedModel.Transform(testData);
var metrics = _mlcontext.MulticlassClassification.Evaluate(predictions, label: label, score: score);
return metrics;
}
要了解关于如何理解指标的更多信息,请参阅ML.NET指南 中的机器学习词汇表,或者使用任何有关数据科学和机器学习的可用材料.
如果您对模型的质量不满意,可以采用多种方法来改进,这将在examples类别中进行介绍。
4. 使用模型
在模型被训练之后,我们可以使用Predict() API来预测这种花属于每个鸢尾花类型的概率。
var modelScorer = new Common.ModelScorer<IrisData, IrisPrediction>(mlContext);
modelScorer.LoadModelFromZipFile(ModelPath);
var prediction = modelScorer.PredictSingle(SampleIrisData.Iris1);
Console.WriteLine($"Actual: setosa. Predicted probability: setosa: {prediction.Score[0]:0.####}");
Console.WriteLine($" versicolor: {prediction.Score[1]:0.####}");
Console.WriteLine($" virginica: {prediction.Score[2]:0.####}");
[...]
public TPrediction PredictSingle(TObservation input)
{
CheckTrainedModelIsLoaded();
return PredictionFunction.Predict(input);
}
在TestIrisData.Iris1中存储有关我们想要预测类型的花的信息。
internal class TestIrisData
{
internal static readonly IrisData Iris1 = new IrisData()
{
SepalLength = 3.3f,
SepalWidth = 1.6f,
PetalLength = 0.2f,
PetalWidth= 5.1f,
}
(...)
}
ML.NET 示例:多类分类之鸢尾花分类的更多相关文章
- ML.NET 示例:开篇
写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...
- ML.NET 示例:多类分类之问题分类
写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...
- ML.NET 示例:二元分类之信用卡欺诈检测
写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...
- ML.NET 示例:目录
ML.NET 示例中文版:https://github.com/feiyun0112/machinelearning-samples.zh-cn 英文原版请访问:https://github.com/ ...
- [Python]基于K-Nearest Neighbors[K-NN]算法的鸢尾花分类问题解决方案
看了原理,总觉得需要用具体问题实现一下机器学习算法的模型,才算学习深刻.而写此博文的目的是,网上关于K-NN解决此问题的博文很多,但大都是调用Python高级库实现,尤其不利于初级学习者本人对模型的理 ...
- 做一个logitic分类之鸢尾花数据集的分类
做一个logitic分类之鸢尾花数据集的分类 Iris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例.数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条记录都 ...
- ipv4理论知识2-分类编址、ip分类、网络标识、主机标识、地址类、地址块
分类编址 ipv4的体系结构中有分类编址和无分类编址(后续会介绍到),在分类编址时,ipv4地址分为A.B.C.D.E这5类.每类占用的IP比例和个数如下图: ipv4分类识别 计算机以二进制方式存储 ...
- OC语言类的本质和分类
OC语言类的深入和分类 一.分类 (一)分类的基本知识 概念:Category 分类是OC特有的语言,依赖于类. 分类的作用:在不改变原来的类内容的基础上,为类增加一些方法. 添加一个分类: 文件 ...
- 李洪强iOS开发之OC语言类的深入和分类
OC语言类的深入和分类 一.分类 (一)分类的基本知识 概念:Category 分类是OC特有的语言,依赖于类. 分类的作用:在不改变原来的类内容的基础上,为类增加一些方法. 添加一个分类: 文件 ...
随机推荐
- 四. Redis事务处理
Redis目前对事务的支持还是比较简单,Redis能保证一个Client发起的事务中的命令可以连续执行,而中间不会插入其他Client的命令:当一个Client在连接中发起一个multi命令的时候,这 ...
- Apktool(3)——Apktool的使用
一.apktool的作用 安卓应用apk文件不仅仅是包含有resource和编译的java代码的zip文件,如果你尝试用解压工具(如好压)解压后,你将会获得classes.dex和resource.a ...
- (后端)swagger
Swagger 文档提供了一个方法,使我们可以用指定的 JSON 或者 YAML 摘要来描述你的 API,包括了比如 names.order 等 API 信息. 你可以通过一个文本编辑器来编辑 Swa ...
- virtualbbox centos7 NAT模式外网 Host-only Adapter模式联网 双网卡
1.下载oracle VM virtualbox centos7 1.1. 下载地址:https://www.virtualbox.org/wiki/Downloads https://www.ce ...
- mssql 怎么配置指定的表 不允许删除数据?
http://www.maomao365.com/?p=5089 <span style="color:red;font-weight:bold;">前言: 前几天收到 ...
- EOS智能合约开发(一):EOS环境搭建和启动节点
EOS和以太坊很像,EOS很明确的说明它就是一个区块链的操作系统,BM在博客中也是说过的. 可以这样比喻,EOS就相当于内置激励系统的Windows/Linux/MacOS,这是它的一个定位. 包括以 ...
- hive笔记:转义字符的使用
hive中的转义符 Hadoop和Hive都是用UTF-8编码的,所以, 所有中文必须是UTF-8编码, 才能正常使用 备注:中文数据load到表里面, 如果字符集不同,很有可能全是乱码需要做转码的, ...
- jQuery中 对标签元素操作(1)
一:创建元素节点(添加) 创建元素节点并且把节点作为元素的子节点添加到DOM树上 append(): 在元素下添加元素 用法:$("id").append(" ...
- LeetCode算法题-Ugly Number(Java实现-四种解法)
这是悦乐书的第199次更新,第208篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第64题(顺位题号是263).编写一个程序来检查给定的数字是否是一个丑陋的数字.丑陋的数 ...
- Python爬虫-05:Ajax加载的动态页面内容
1. 获取AJAX加载动态页面的内容 1.1. Introduction 如果所爬取的网址是通过Ajax方式加载的,就直接抓包,拿他后面传输数据的文件 有些网页内容使用AJAX加载,只要记得,AJAX ...