使用 ML.NET 对 K-Means 平均值聚类分析和分类
数据集 :https://en.wikipedia.org/wiki/Iris_flower_data_set
聚类分析
非监管式机器学习任务,用于将数据实例分组到包含类似特性的群集。 聚类分析还可用来识别可能无法通过浏览或简单的观察以逻辑方式推导出的数据集中的关系。 聚类分析算法的输入和输出取决于选择的方法。 可以采取分发、质心、连接或基于密度的方法。ML.NET 当前支持使用 K 平均值聚类分析的基于质心的方法。 聚类分析方案示例包括:
- 基于酒店选择的习惯和特征来了解酒店来宾群。
- 确定客户群和人口统计信息来帮助生成目标广告活动。
- 基于生产指标对清单进行分类。
聚类分析训练程序
可以使用以下算法训练聚类分析模型:
聚类分析输入和输出
输入特征数据必须为 Single。 无需标签。
该训练程序输出以下列:
异常情况检测
此任务使用主体组件分析 (PCA) 创建异常情况检测模型。 基于 PCA 的异常情况检测有助于在以下场景中构建模型:可以很轻松地从一个类中获得定型数据(例如有效事务),但难以获得目标异常的足够示例。
PCA 是机器学习中已建立的一种技术,由于它揭示了数据的内部结构,并解释了数据中的差异,因此经常被用于探索性数据分析。PCA 的工作方式是通过分析包含多个变量的数据。 它查找变量之间的关联性,并确定最能捕捉结果差异的值的组合。 这些组合的特性值用于创建一个更紧凑的特性空间,称为主体组件。
异常情况检测包含机器学习中的许多重要任务:
- 识别潜在的欺诈交易。
- 指示发生了网络入侵的学习模式。
- 发现异常的患者群集。
- 检查输入系统的值。
根据定义,异常情况属于罕见事件,因此很难收集具有代表性的数据样本用于建模。 此类别中包含的算法是专门设计用来解决使用不平衡数据集建立和定型模型的核心挑战。
异常情况检测训练程序
可以使用以下算法训练异常情况检测模型:
异常情况检测输入和输出
输入特征必须为 Single 的固定大小向量。
该训练程序输出以下列:
| 输出名称 | 类型 | 说明 |
|---|---|---|
Score |
Single | 由异常情况检测模型计算得出的非负无界分数 |
排名
排名任务从一组标记的示例构建排名程序。 该示例集由实例组组成,这些实例组可以使用给定的标准进行评分。 每个实例的排名标签是 { 0, 1, 2, 3, 4 }。 排名程序定型为用每个实例的未知分数对新实例组进行排名。 ML.NET 排名学习器基于机器已学习的排名。
排名训练算法
可以使用以下算法训练排名模型:
排名输入和输出
输入标签数据类型必须为 key 类型或 Single。 标签的值决定相关性,其中较高的值表示较高的相关性。 如果标签为 key 类型,则键索引为相关性值,其中最小索引是最不相关的。 如果标签为 Single,则较大的值表示较高的相关性。
特征数据必须为 Single 的固定大小向量,输入行组列必须为 key 类型。
该训练程序输出以下列:
| 输出名称 | 类型 | 说明 |
|---|---|---|
Score |
Single | 由模型计算以确定预测的无界分数 |
建议
推荐任务支持生成推荐产品或服务的列表。 ML.NET 使用矩阵因子分解 (MF),这是一种协作筛选算法,当目录中有历史产品评级数据时,推荐使用该算法。 例如,你为用户提供历史电影评级数据,并希望向他们推荐接下来可能观看的其他电影。
建议训练算法
可以使用以下算法训练建议模型:
系统必备
- 安装了“.NET Core 跨平台开发”工作负载的 Visual Studio 2017 15.6 或更高版本。
了解问题
此问题的本质即基于花卉特征将鸢尾花数据归入不同的组。 这些特征包括:花萼的长度和宽度以及花瓣的长度和宽度。 此教程假设每朵花的类型都是未知的。 需通过这些特征了解数据集的结构,并预测数据实例与此结构的拟合程度。
选择适当的机器学习任务
鉴于不知道每朵花属于哪个分组,应选择非监管式机器学习任务。 为将数据归入不同的组,并使同一组中的元素互相之间更为相似(与其他组中的元素相比),应使用聚类分析机器学习任务。
创建控制台应用程序
打开 Visual Studio。 从菜单栏中选择“文件” > “新建” > “项目” 。 在“新项目” 对话框中,依次选择“Visual C#” 和“.NET Core” 节点。 然后,选择“控制台应用程序(.NET Core)” 项目模板。 在“名称”文本框中,键入“IrisFlowerClustering”,然后选择“确定”按钮 。
在项目中创建一个名为“数据”的目录来保存数据集和模型文件 :
在“解决方案资源管理器”中,右键单击项目,然后选择“添加” > “新文件夹” 。 键入“Data”,然后按 Enter。
安装“Microsoft.ML NuGet”包 :
在“解决方案资源管理器”中,右键单击项目,然后选择“管理 NuGet 包” 。 选择“nuget.org”作为包源,然后选择“浏览”选项卡并搜索“Microsoft.ML”,选择列表中的“v1.0.0”包,再选择“安装”按钮 。 选择“预览更改” 对话框上的“确定” 按钮,如果你同意所列包的许可条款,则选择“接受许可” 对话框上的“我接受” 按钮。
准备数据
下载 iris.data 数据集并将其保存至在上一步中创建的“数据”文件夹 。 若要详细了解鸢尾花数据集,请参阅鸢尾花数据集维基百科页面,以及该数据集的源鸢尾花数据集页面。
在“解决方案资源管理器”中,右键单击“iris.data”文件并选择“属性” 。 在“高级”下,将“复制到输出目录”的值更改为“如果较新则复制” 。
该 iris.data 文件包含五列,分别代表以下内容 :
- 花萼长度(厘米)
- 花萼宽度(厘米)
- 花瓣长度(厘米)
- 花瓣宽度(厘米)
- 鸢尾花类型
考虑到聚类分析示例,本教程忽略最后一列。
创建数据类
创建输入数据和预测类:
在“解决方案资源管理器” 中,右键单击项目,然后选择“添加” > “新项” 。
在“添加新项”对话框中,选择“类”并将“名称”字段更改为“IrisData.cs” 。 然后,选择“添加” 按钮。
将以下
using指令添加到新文件:C#复制using Microsoft.ML.Data;
删除现有类定义并向“IrisData.cs”文件添加以下代码,其中定义了两个类 IrisData 和 ClusterPrediction :
public class IrisData
{
[LoadColumn(0)]
public float SepalLength;
[LoadColumn(1)]
public float SepalWidth;
[LoadColumn(2)]
public float PetalLength;
[LoadColumn(3)]
public float PetalWidth;
}
public class ClusterPrediction
{
[ColumnName("PredictedLabel")]
public uint PredictedClusterId;
[ColumnName("Score")]
public float[] Distances;
}
IrisData 是输入数据类,并且具有针对数据集每个特征的定义。 使用 LoadColumn 属性在数据集文件中指定源列的索引。
ClusterPrediction 类表示应用到 IrisData 实例的聚类分析模型的输出。 使用 ColumnName 属性将 PredictedClusterId 和 Distances 字段分别绑定至 PredictedLabel 和 Score 列 。 在聚类分析任务中,这些列具有以下含义:
- PredictedLabel 列包含所预测的群集的 ID。
- Score 列包含一个数组,该数组中的数与群集形心之间的距离为欧氏距离的平方。 该数组的长度等于群集数。
备注
使用 float 类型来表示输入和预测数据类中的浮点值。
定义数据和模型路径
返回到 Program.cs 文件并添加两个字段,以保存数据集文件以及用于保存模型的文件的路径 :
_dataPath包含具有用于定型模型的数据集的文件的路径。_modelPath包含用于存储定型模型的文件的路径。
将以下代码添加到 Main 方法上方,以指定这些路径:
static readonly string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "iris.data");
static readonly string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "IrisClusteringModel.zip");
要编译前面的代码,请将以下 using 指令添加到 Program.cs 文件顶部 :
using System;
using System.IO;
创建 ML 上下文
将以下附加 using 指令添加到 Program.cs 文件顶部 :
using Microsoft.ML;
using Microsoft.ML.Data;
在 Main 方法中,请使用以下代码替换 Console.WriteLine("Hello World!"); 行:
var mlContext = new MLContext(seed: 0);
Microsoft.ML.MLContext 类表示机器学习环境,并提供用于数据加载、模型定型、预测和其他任务的日志记录和入口点的机制。 这在概念上相当于在实体框架中使用 DbContext。
设置数据加载
将以下代码添加到 Main 方法以设置加载数据的方式:
IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');
泛型 MLContext.Data.LoadFromTextFile 扩展方法根据所提供的 IrisData 类型推断数据集架构,并返回可用作转换器输入的 IDataView。
创建学习管道
对于本教程,聚类分析任务的学习管道包含两个以下步骤:
- 将加载的列连接到“Features”列,由聚类分析训练程序使用 ;
- 借助 KMeansTrainer 训练程序使用 k - 平均值 + + 聚类分析算法来定型模型。
将以下代码添加到 Main 方法中:
string featuresColumnName = "Features";
var pipeline = mlContext.Transforms
.Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
.Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 3));
该代码指定该数据集应拆分为三个群集。
定型模型
前述部分中添加的步骤准备了用于定型的管道,但尚未执行。 将以下行添加到 Main 方法以执行数据加载和模型定型:
var model = pipeline.Fit(dataView);
保存模型
此时,你具有可以集成到任何现有或新 .NET 应用程序的模型。 要将模型保存为 .zip 文件,请将以下代码添加到 Main 方法中:
using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))
{
mlContext.Model.Save(model, dataView.Schema, fileStream);
}
使用预测模型
要进行预测,请使用通过转换器管道获取输入类型实例和生成输出类型实例的 PredictionEngine<TSrc,TDst> 类。 将以下行添加到 Main 方法以创建该类的实例:
var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);
将 TestIrisData 类创建到房屋测试数据实例:
在“解决方案资源管理器” 中,右键单击项目,然后选择“添加” > “新项” 。
在“添加新项”对话框中,选择“类”并将“名称”字段更改为“TestIrisData.cs” 。 然后,选择“添加” 按钮。
将类修改为静态,如下面的示例所示:
C#复制static class TestIrisData
本教程引入此类中的一个鸢尾花数据实例。 可以添加其他方案来体验此模型。 将下面的代码添加到 TestIrisData 类中:
internal static readonly IrisData Setosa = new IrisData
{
SepalLength = 5.1f,
SepalWidth = 3.5f,
PetalLength = 1.4f,
PetalWidth = 0.2f
};
若要查找指定项所属的群集,请返回至 Program.cs 文件并将以下代码添加进 Main 方法 :
var prediction = predictor.Predict(TestIrisData.Setosa);
Console.WriteLine($"Cluster: {prediction.PredictedClusterId}");
Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances)}");
运行该程序以查看哪个群集包含所指定的数据实例,以及从该实例到群集形心的距离的平方值。 结果应如下所示:
Cluster: 2
Distances: 11.69127 0.02159119 25.59896
祝贺你! 现已成功地生成用于鸢尾花聚类分析的机器学习模型并将其用于预测。 可以在 dotnet/samples GitHub 存储库中找到本教程的源代码。
使用 ML.NET 对 K-Means 平均值聚类分析和分类的更多相关文章
- kNN算法:K最近邻(kNN,k-NearestNeighbor)分类算法
一.KNN算法概述 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它 ...
- ML: 聚类算法-K均值聚类
基于划分方法聚类算法R包: K-均值聚类(K-means) stats::kmeans().fpc::kmeansruns() K-中心点聚类(K-Medoids) ...
- KNN 与 K - Means 算法比较
KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...
- 软件——机器学习与Python,聚类,K——means
K-means是一种聚类算法: 这里运用k-means进行31个城市的分类 城市的数据保存在city.txt文件中,内容如下: BJ,2959.19,730.79,749.41,513.34,467. ...
- 机器学习之路: python k近邻分类器 KNeighborsClassifier 鸢尾花分类预测
使用python语言 学习k近邻分类器的api 欢迎来到我的git查看源代码: https://github.com/linyi0604/MachineLearning from sklearn.da ...
- 机器学习框架ML.NET学习笔记【4】多元分类之手写数字识别
一.问题与解决方案 通过多元分类算法进行手写数字识别,手写数字的图片分辨率为8*8的灰度图片.已经预先进行过处理,读取了各像素点的灰度值,并进行了标记. 其中第0列是序号(不参与运算).1-64列是像 ...
- 机器学习框架ML.NET学习笔记【5】多元分类之手写数字识别(续)
一.概述 上一篇文章我们利用ML.NET的多元分类算法实现了一个手写数字识别的例子,这个例子存在一个问题,就是输入的数据是预处理过的,很不直观,这次我们要直接通过图片来进行学习和判断.思路很简单,就是 ...
- 用Python从零开始实现K近邻算法
KNN算法的定义: KNN通过测量不同样本的特征值之间的距离进行分类.它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.K通 ...
- 数据挖掘-聚类分析(Python实现K-Means算法)
概念: 聚类分析(cluster analysis ):是一组将研究对象分为相对同质的群组(clusters)的统计分析技术.聚类分析也叫分类分析,或者数值分类.聚类的输入是一组未被标记的样本,聚类根 ...
随机推荐
- In-Memory:哈希索引
SQL Server 2016支持哈希查找,用户可以在内存优化表(Memory-Optimized Table)上创建哈希索引(Hash Index),使用Hash 查找算法,实现数据的极速查找.在使 ...
- SAP销售订单需求类型的确定优秀级
需求类型的确定优秀级:1.策略组里的需求类型:2.MRP组里的:3.SO行项目类别+MRP类型4.SO行项目类别 部分截图:
- C#读写修改设置调整UVC摄像头画面-伽玛
有时,我们需要在C#代码中对摄像头的伽玛进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄像 ...
- 接口例_龟车赛跑_Java
此例演示java中接口的一般用法. 屋子里有一群程序员,每个人在写着自己的类,共同构建一个世界. 项目经理突然出现:“打扰大家一下,公司决定举办一个竞速比赛,你们写的类都可以参加.为了比赛的顺利进行, ...
- 服务器收不到支付宝notify_url异步回调请求的问题 支付宝notify 异步通知与https的问题
需确认页面是http还是https,如果是https,那么需要安装ssl证书,证书要求有如下:要求“正规的证书机构签发,不支持自签名”. 然后赶快,按照支付宝,宝爷的要求,去自检了一下自家的证书,下面 ...
- 英语fraunce法兰西
fraunce 外文词汇,中文翻译为代指法兰西(地名) 中文名:法兰西 外文名:fraunce 目录 释义 Fraunce 读音:英 [frɑ:ns] 美 [fræns] Noun(名词) 1. ...
- C/ C++ 快速上手
C++ 快速上手 (一)https://www.cnblogs.com/cosmo89929/archive/2012/12/22/2828745.html C++ 快速上手 (二)https://w ...
- Ansible-ansible命令
Ansible是用于执行"远程操作"的简单工具.该命令允许针对一组主机定义并运行单个任务剧本. 常用选项 说明 --ask-vault-pass 请求保险库密码 --become- ...
- C# 控制台定时器
C# 定时器 关于C#中timer类 在C#里关于定时器类就有3个1.定义在System.Windows.Forms里2.定义在System.Threading.Timer类里3.定义在System. ...
- Tomcat get请求中文参数乱码
场景:使用Tomcat容器进行get方式传递中文参数到后台乱码. 原因:Tomcat默认的编码方式是ISO--. 解决方案: . 设置cofg-server.xml中的<Connector> ...