机器学习 – 清风亦平凡 https://www.mlplus.net 关注IT世界,记录平凡生活 Mon, 27 May 2019 16:36:39 +0000 zh-CN hourly 1 https://wordpress.org/?v=6.4.3 ML.NET 来对鸢尾花分类 https://www.mlplus.net/2019/05/27/mlnetiris/ https://www.mlplus.net/2019/05/27/mlnetiris/#respond Mon, 27 May 2019 01:10:56 +0000 https://www.mlplus.net/?p=1651 主要目的演示如何使用 ML.NET 为鸢尾花数据集构建聚类分析模型。了解ML.NET使用基本流程。

问题

问题的本质即基于花卉特征将鸢尾花数据归入不同的组。 这些特征包括:花萼的长度和宽度以及花瓣的长度和宽度。 需通过这些特征了解数据集的结构,并预测数据实例与此结构的拟合相似分类。

创建控制台应用程序

  1. 打开 Visual Studio。 从菜单栏中选择“文件” > “新建” > “项目”。 在“新项目”对话框中,依次选择“Visual C#”和“.NET Core”节点。 然后,选择“控制台应用程序(.NET Core)”项目模板。 在“名称”文本框中,键入“MLNet”,然后选择“确定”按钮
  2. 在项目中创建一个名为“数据”的目录来保存数据集和模型文件:
    在“解决方案资源管理器”中,右键单击项目,然后选择“添加” > “新文件夹”。 键入“Data”,然后按 Enter。
  3. 安装“Microsoft.ML NuGet”包:
    在“解决方案资源管理器”中,右键单击项目,然后选择“管理 NuGet 包”。 选择“nuget.org”作为包源,然后选择“浏览”选项卡并搜索“Microsoft.ML”,选择列表中的“v0.11.0”包,再选择“安装”按钮。 选择“预览更改”对话框上的“确定”按钮,如果你同意所列包的许可条款,则选择“接受许可”对话框上的“我接受”按钮。

准备数据

  1. 下载 iris.data 数据集并将其保存至在上一步中创建的“data”文件夹。 若要详细了解鸢尾花数据集,请参阅鸢尾花数据集维基百科页面,以及该数据集的源鸢尾花数据集页面。
  2. 在“解决方案资源管理器”中,右键单击“iris.data”文件并选择“属性” 在“高级”下,将“复制到输出目录”的值更改为“如果较新则复制”。

该 iris.data 文件包含五列,分别代表以下内容:

  • 花萼长度(厘米)
  • 花萼宽度(厘米)
  • 花瓣长度(厘米)
  • 花瓣宽度(厘米)
  • 鸢尾花类型

创建数据类

创建输入数据和预测类:

  1. 在“解决方案资源管理器”中,右键单击项目,然后选择“添加” > “新项”。
  2. 在“添加新项”对话框中,选择“类”并将“名称”字段更改为“IrisData.cs”。 然后,选择“添加”按钮。
  3. 将以下 using 指令添加到新文件:
    using Microsoft.ML.Data;

删除现有类定义并向“IrisData.cs”文件添加以下代码,其中定义了两个类 IrisData 和 ClusterPrediction


    /// <summary>
    /// 数据类
    /// </summary>
    public class IrisData
    {
        /// <summary>
        /// 花萼长度
        /// </summary>
        [LoadColumn(0)]
        public float SepalLength;
        /// <summary>
        /// 花萼宽度
        /// </summary>
        [LoadColumn(1)]
        public float SepalWidth;
        /// <summary>
        /// 花瓣长度
        /// </summary>
        [LoadColumn(2)]
        public float PetalLength;
        /// <summary>
        /// 花瓣宽度
        /// </summary>
        [LoadColumn(3)]
        public float PetalWidth;
        /// <summary>
        /// 预测类型
        /// </summary>
        [LoadColumn(4)]
        public string FlowerType;
    }

    /// <summary>
    /// 预测类
    /// </summary>
    public class ClusterPrediction
    {
        /// <summary>
        /// 包含所预测的群集
        /// </summary>
        //[ColumnName("PredictedLabel")]
        //public string PredictedClusterId;

        //预测输出类型
        public string PredictedLabelPlant;
        /// <summary>
        /// 列包含一个数组,该数组中的数与群集形心之间的距离为欧氏距离的平方。
        /// 该数组的长度等于群集数。
        /// </summary>
        [ColumnName("Score")]
        public float[] Distances;
    }

IrisData 是输入数据类,并且具有针对数据集每个特征的定义。 使用 LoadColumn 属性在数据集文件中指定源列的索引。ClusterPrediction 类表示应用到 IrisData 实例的聚类分析模型的输出。

 使用 ColumnName属性将 Distances 字段绑定至 Score 列。PredictedLabelPlant做为预测显示鸢尾花类型。 在聚类分析任务中,这些列具有以下含义:

  • 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.Transforms.Normalize(featuresColumnName))
                .Append(mlContext.Transforms.Conversion.MapValueToKey("Label", "FlowerType"), TransformerScope.TrainTest)
                .AppendCacheCheckpoint(mlContext)
                .Append(mlContext.MulticlassClassification.Trainers.StochasticDualCoordinateAscent())
                .Append(mlContext.Transforms.Conversion.MapKeyToValue(("PredictedLabelPlant", "PredictedLabel")))
                .Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, clustersCount: 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, fileStream);
            }

使用预测模型

要进行预测,请使用通过转换器管道获取输入类型实例和生成输出类型实例的 PredictionEngine<TSrc,TDst> 类。 将以下行添加到 Main 方法以创建该类的实例:

var predictor=model.CreatePredictionEngine<IrisData, ClusterPrediction>(mlContext);

将 TestIrisData 类创建到房屋测试数据实例:

  1. 在“解决方案资源管理器”中,右键单击项目,然后选择“添加” > “新项”。
  2. 在“添加新项”对话框中,选择“类”并将“名称”字段更改为“TestIrisData.cs”。 然后,选择“添加”按钮。
  3. 将类修改为静态,如下面的示例所示:
    static class TestIrisData
    {
        internal static readonly IrisData Setosa = new IrisData
        {
            SepalLength = 5.1f,
            SepalWidth = 3.5f,
            PetalLength = 1.4f,
            PetalWidth = 0.2f
        };
    }

此类中的一个鸢尾花数据实例。 可以添加其他方案来体验此模型。

若要查找指定项所属的群集,请返回至 Program.cs 文件并将以下代码添加进 Main 方法:

            Console.WriteLine($"Cluster: {prediction.PredictedLabelPlant}");
            Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances)}");
            Console.Read();

运行该程序以查看预测到哪个分类,以及从该实例到群集形心的距离的平方值。 结果应如下所示:

Cluster: Iris-setosa
Distances: 0.9660053 0.0008847713 0.4192338

已成功地生成用于鸢尾花聚类分析的机器学习模型并将其用于预测。

鸢尾花预测结果
鸢尾花预测结果

示例下载

鸢尾花分类预测示例



转载请注明:清风亦平凡 » ML.NET 来对鸢尾花分类

]]>
https://www.mlplus.net/2019/05/27/mlnetiris/feed/ 0
一个开源且跨平台的.NET机器学习框架ML.NET https://www.mlplus.net/2019/05/26/mldotnet/ https://www.mlplus.net/2019/05/26/mldotnet/#respond Sun, 26 May 2019 01:28:47 +0000 https://www.mlplus.net/?p=1639 ML.NET 是一个跨平台框架且允许.NET开发人员开发他们自己的模型,并将自定义ML集成到他们的应用程序中,而无需事先掌握开发或调整机器学习模型的专业知识。在采用通用机器学习语言(如R和Python)开发的模型,并将它们集成到用C#等语言编写的企业应用程序中需要付出相当大的努力。ML.NET填平了机器学习专家和软件开发者之间的差距,从而使得机器学习的平民化,即使没有机器学习背景的人们能够建立和运行模型。通过为.NET创建高质量的机器学习框架,微软已经使得将机器学习转化为企业(或通过Xamarin移动应用程序)变得更容易。这是一种使机器学习更加可用的形式。

ML.NET 由微软研究院研发,在过去的十年里发展成为一个重要的框架,它在微软的许多产品团队中都有使用,比如 Windows、必应、Azure 等等。

使用ML.NET可以解决哪些类型的问题

基于微软内部Windows,Bing和Azure等主要微软产品使用多年的机器学习构建的库目前处于预览阶段,最新版本是1.0.0 。该框架目前支持的学习模型包括

  • K-Means聚类
  • 逻辑回归
  • 支持向量机
  • 朴素贝叶斯
  • 随机森林
  • 增强树木

其他技术,如推荐引擎和异常检测,正在开发的路线图上。ML.NET将最终将接口暴露给其他流行的机器学习库,如TensorFlow,CNTK和Accord.NET。最后,还会有一些工具和语言增强功能,包括Azure和GUI / Visual Studio功能中的扩展功能。

ml.net
ml.net

如何在应用程序中使用ML.NET

ML.NET以NuGet包的形式提供,可以轻松安装到新的或现有的.NET应用程序中。

该框架采用了用于其他机器学习库(如scikit-learn和Apache Spark MLlib)的“管道(LearningPipeline)”方法。数据通过多个阶段“传送”以产生有用的结果(例如预测)。典型的管道可能涉及如下:

  • 加载数据
  • 转换数据
  • 特征提取/工程
  • 配置学习模型
  • 培训模型
  • 使用训练好的模型(例如获得预测)

管道为使用机器学习模型提供了一个标准API。这使得在测试和实验过程中更容易切换一个模型。它还将建模工作分解为定义明确的步骤,以便更容易理解现有代码。scikit-learn库实现了很多机器学习算法,我们可以多多参考scikit-learn :http://sklearn.apachecn.org/cn/0.19.0/index.html

ML.NET机器学习管道的核心组件:

  • ML数据结构(例如IDataViewLearningPipeline
  • TextLoader(将数据从分隔文本文件加载到LearningPipeline)和 CollectionDataSource 从一组对象中加载数据集
  • 转换(以获得正确格式的数据进行训练):
    • 处理/特征化文本: TextFeaturizer
    • 架构modifcation: ,ColumnConcatenatorColumnSelectorColumnDropper
    • 使用分类特征:CategoricalOneHotVectorizerCategoricalHashOneHotVectorizer
    • 处理丢失的数据: MissingValueHandler
    • 过滤器:RowTakeFilterRowSkipFilterRowRangeFilter
    • 特性选择:FeatureSelectorByCountFeatureSelectorByMutualInformation
  • 学习算法(用于训练机器学习模型)用于各种任务:
    • 二元分类:FastTreeBinaryClassifierStochasticDualCoordinateAscentBinaryClassifierAveragedPerceptronBinaryClassifierBinaryLogisticRegressorFastForestBinaryClassifierLinearSvmBinaryClassifier,和GeneralizedAdditiveModelBinaryClassifier
    • 多类分类:StochasticDualCoordinateAscentClassifierLogisticRegressor,和NaiveBayesClassifier
    • 回归:FastTreeRegressorFastTreeTweedieRegressorStochasticDualCoordinateAscentRegressorOrdinaryLeastSquaresRegressorOnlineGradientDescentRegressorPoissonRegressor,和GeneralizedAdditiveModelRegressor
    • 聚类 KMeansPlusPlusClusterer
  • 评估器(检查模型的工作情况):
    • 对于二元分类: BinaryClassificationEvaluator
    • 对于多类分类: ClassificationEvaluator
    • 对于回归: RegressionEvaluator

在构建机器学习模型时,首先需要定义您希望通过数据实现的目标。之后,您可以针对您的情况选择正确的机器学习任务。以下列表描述了您可以选择的不同机器学习任务以及一些常见用例。在ML.NET 0.2增加了一个 支持从一组对象中加载数据集的能力,以前这些只能从分隔的文本文件加载。另一个补充是交叉验证,这是一种验证机器学习模型性能的方法。交叉验证方法的一个有用方面是它不需要与用于创建模型的数据集分开的数据集。相反,它将多次提供的数据划分为不同组的训练和测试数据。ML.NET 0.2加入了一个示例代码库,演示了如何使用这个新框架,地址是https://github.com/dotnet/machinelearning-samples

二元分类

二元分类属于 监督学习,用于预测数据的一个实例属于哪些两个类(类别)任务。分类算法的输入是一组标记示例,其中每个标记都是0或1的整数。二进制分类算法的输出是一个分类器,您可以使用该分类器来预测新的未标记实例的类。二元分类场景的例子包括:

  • 如果交易日是上涨日或下跌日
  • 手写数字识别
  • 语音识别
  • 图像识别

有关更多信息,请参阅Wikipedia上的二元分类 文章。

多类分类

多元分类属于 监督学习,用于预测的数据的实例的类(类别)的任务。分类算法的输入是一组标记示例。每个标签都是0到k-1之间的整数,其中k是类的数量。分类算法的输出是一个分类器,您可以使用它来预测新的未标记实例的类。多类分类方案的例子包括:

  • 确定一只狗的品种为“西伯利亚雪橇犬”,“金毛猎犬”,“贵宾犬”等。
  • 将电影评论理解为“正面”,“中性”或“负面”。
  • 将酒店评论归类为“位置”,“价格”,“清洁度”等。

有关更多信息,请参阅Wikipedia上的多类分类文章。

分类步骤设置:

一个开源且跨平台的.NET机器学习框架ML.NET-第1张图片
  1. 首先定义问题
  2. 然后,您将以名为Features的数字属性的形式表示您的数据。这对于已经分类的训练数据和将来需要分类的测试数据都是这样做的
  3. 您将获取训练数据并将其输入分类算法以训练模型
  4. 将需要分类的新实例或采取测试数据并将其传递给分类器进行分类

聚类

聚类属于无监督机器学习,用于数据的一组实例为包含类似特征的簇的任务。聚类还可用于识别数据集中的关系,这些关系可能不是通过浏览或简单观察而在逻辑上得出的。聚类算法的输入和输出取决于所选择的方法。您可以采用分布、质心、连通性或基于密度的方法。ML.NET目前支持使用K-Means聚类的基于质心的方法。聚类场景的例子包括:

  • 根据酒店选择的习惯和特点了解酒店客人群体。
  • 识别客户群和人口统计信息,以帮助构建有针对性的广告活动。
  • 根据制造指标对库存进行分类。
  • 根据房屋类型,价值和地理位置确定一组房屋
  • 地震震中确定危险区域
  • 使用集群将电话塔放在一个新城市中,以便所有用户都能获得最佳单一强度

聚类设置步骤:

一个开源且跨平台的.NET机器学习框架ML.NET-第2张图片
  1. 你会从问题陈述开始,问题陈述是需要聚集的数据集
  2. 然后,您将使用功能在该数据集中表示点。
  3. 这里没有训练这一步,不需要学习
  4. 您直接将数据提供给聚类算法以查找最终的聚类,而无需任何训练步骤

回归

回归是 监督的机器学习,用于从一组相关的功能预测标签的值。标签可以具有任何实际价值,并且不像分类任务那样来自有限的一组值。回归算法对标签对其相关特征的依赖性进行建模,以确定标签随着特征值的变化而如何变化。回归算法的输入是一组具有已知值标签的示例。回归算法的输出是一个函数,您可以使用该函数来预测任何新的输入要素集的标注值。回归情景的例子包括:

  • 根据房屋属性(如卧室数量,位置或大小)预测房价。
  • 根据历史数据和当前市场趋势预测未来股价。
  • 根据广告预算预测产品的销售情况。



转载请注明:清风亦平凡 » 一个开源且跨平台的.NET机器学习框架ML.NET

]]>
https://www.mlplus.net/2019/05/26/mldotnet/feed/ 0
机器学习重要术语 https://www.mlplus.net/2019/04/29/machinelearningterminology/ https://www.mlplus.net/2019/04/29/machinelearningterminology/#respond Mon, 29 Apr 2019 01:00:58 +0000 https://www.mlplus.net/?p=1596 机器学习重要术语-第0张图片

准确性

在分类中,准确性是正确分类的项数目除以测试集内的项总数。 范围从 0(最不准确)到 1(最准确)。 准确性是模型性能的评估指标之一。 将其与精度、撤回和 F 分数结合考虑。

曲线下面积 (AUC)

二元分类中的一项评估指标,即曲线下面积值,它绘制真阳性率(y 轴)与误报率(x 轴)进行对照。 范围从 0.5(最差)到 1(最佳)。 也称为 ROC 曲线下面积,即,接受者操作特征曲线。

二元分类

一个分类事例,其中标签仅为两个类中的一个。

分类

当使用这些数据来预测某一类别,监管式机器学习任务被称为“分类”。 二元分类指的是仅预测两个类别(例如,将图像划分为“猫”或“狗”图片)。 多类分类指的是预测多个类别(例如,当将图像划分为特定品种狗的图片)。

决定系数

回归中的一项评估指标,表明数据与模型的匹配程度。 范围从 0 到 1。 值 0 表示数据是随机的,否则就无法与模型相匹配。 值 1 表示模型与数据完全匹配。 这通常称为 2、R2 或 r 平方值。

功能

正在对其进行度量的现象的一个可度量属性,通常是一个数(双精度)值。 多个特征被称为“特征向量”且通常存储为 double[]。 这些特征定义所度量现象的重要特性。

特征工程

特征工程是涉及定义一组特征和开发软件以从可用现象数据中生成特征向量(即特征提取)的过程。

F 分数

分类中的一项评估指标,它平衡精度和撤回。

超参数

机器学习算法的参数。 示例包括在决策林中学习的树的数量,或者梯度下降算法中的步长。 在对模型进行定型之前,先设置超参数的值,并控制查找预测函数参数的过程,例如,决策树中的比较点或线性回归模型中的权重 。

Label

使用机器学习模型进行预测的元素。 例如,狗的品种或将来的股票价格。

对数损失

在分类中,描述分类器准确性的评估指标。 对数损失越小,分类器越准确。

平均绝对误差 (MAE)

回归中的一项评估指标,即所有模型误差的平均值,其中模型误差是预测标签值和正确标签值之间的差距。

模型

就传统意义而言,它是预测函数的参数。 例如,线性回归模型中的权重或决策树中的拆分点。

多类分类

一个分类事例,其中标签是三个或更多类中的一个。

N 元语法

文本数据的特征提取方案:N 个单词的任何序列都将转变为特征值。

数字特征向量

只包含数值的特征向量。 这与 double[] 非常类似。

管道

要将模型与数据集相匹配所需的所有操作。 管道由数据导入、转换、特征化和学习步骤组成。 对管道进行定型后,它会转变为模型。

精度

在分类中,类的精度是正确预测为属于该类的项目的数量,除以预测为属于该类的项目的总数。

撤回

在分类中,类的撤回是正确预测为属于该类的项目的数量,除以实际属于该类的项目的总数。

回归测试

监管式机器学习任务,其中输出是一个实际值,例如,双精度值。 示例包括预测股票价格。

相对绝对误差

回归中的一项评估指标,即所有绝对误差总和除以正确标签值和所有正确标签值的平均值之间的差值总和。

相对平方误差

回归中的一项评估指标,即所有绝对平方误差总和除以正确标签值和所有正确标签值的平均值之间的平方差值总和。

均方误差根 (RMSE)

回归中的一项评估指标,即误差平方平均值的平方根。

监管式机器学习

机器学习的一个子类,其中所需的模型预测尚不可见的数据标签。 示例包括分类、回归以及结构化预测。

训练

识别给定定型数据集模型的过程。 对于线性模型,这意味着查找权重。 有关树信息,这涉及到标识拆分点。

Transform

转换数据的管道组件。 例如,从文本到数字向量。

非监管式机器学习

机器学习的子类,其中所需的模型查找数据中的隐藏(或潜在)结构。 示例包括聚类分析、主题建模和维数约简。



转载请注明:清风亦平凡 » 机器学习重要术语

]]>
https://www.mlplus.net/2019/04/29/machinelearningterminology/feed/ 0