65.9K
CodeProject 正在变化。 阅读更多。
Home

开始使用 Machine Learning DotNet 进行聚类模型

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2018年10月31日

CPOL

10分钟阅读

viewsIcon

16642

downloadIcon

580

在本文中,我们将了解如何使用 ML.NET 中的聚类模型来预测移动设备使用情况,包括型号、性别、2010 年之前和 2010 年之后的设备使用情况。

引言

在 Build 2018 大会上,微软推出了 ML.NET (Machine Learning .NET) 的预览版,这是一个跨平台、开源的机器学习框架。是的,现在开发我们自己的机器学习应用程序或使用机器学习框架开发定制模块变得很容易。ML.NET 是一个主要为 .NET 开发人员开发的机器学习框架。我们可以使用 C# 或 F# 来开发 ML.NET 应用程序。ML.NET 是一个开源框架,可以在 Windows、Linux 和 macOS 上运行。ML.NET 仍在开发中,现在我们可以使用预览版来学习和使用 ML.NET。

参考链接:ML.NET 介绍:跨平台、成熟且开源的机器学习框架

在本文中,我们将了解如何开发用于聚类模型的 ML.Net 应用程序。

机器学习聚类模型

机器学习不过是一组程序,用于训练计算机预测并向我们显示输出。使用机器学习的实时应用程序示例包括 Windows Cortana、Facebook 新闻源、自动驾驶汽车、未来股票预测、Gmail 垃圾邮件检测、PayPal 欺诈检测等。

机器学习主要有 3 种类型:

  • 监督学习:机器获取带标签的输入和期望的输出,例如,我们可以将其称为出租车费用检测。
  • 无监督学习:机器获取没有期望输出的输入,例如,我们可以将其称为客户细分。
  • 强化学习:在此类算法中,我们将与动态交互进行交互,例如,我们可以将其称为自动驾驶汽车。

在每种类型中,我们都将使用算法来训练机器以产生结果。我们可以看到每种机器学习类型的算法。

  • 监督学习具有回归分类算法
  • 无监督学习具有聚类关联算法
  • 强化学习具有分类控制算法

在我之前的文章中,我解释了如何使用ML.NET 的回归模型(用于监督学习)预测某项商品的未来库存。

在本文中,我们将介绍如何使用 ML.NET 的聚类模型来预测移动设备的使用情况,包括型号、性别、2010 年之前和 2010 年之后的设备使用情况。

在这个示例程序中,我们将使用 ML.NET 的机器学习聚类模型来根据性别、2010 年之前和 2010 年之后购买的手机以及手机型号来预测客户细分。有些用户可能使用 Windows Mobile,有些用户可能使用三星或 iPhone,还有些用户可能同时使用三星和 Windows 或 iPhone。为了按性别、2010 年之前和 2010 年之后购买的手机以及手机型号来细分用户数量,并找到聚类 ID 和分数,我们在本文中创建了一个示例程序。我们使用了一个简单的数据集,其中包含按性别、2010 年之前和 2010 年之后随机聚类的用户数量。

参考链接:ML.NET 聚类, 出租车费预测器(回归), https://en.wikipedia.org/wiki/Machine_learning

背景

开始使用 ML.NET 前需要了解的事项

初始化模型

要使用机器学习,首先我们需要选择最适合的机器学习算法。机器学习包含聚类、回归、分类和异常检测模块。在本文中,我们将使用聚类模型来预测手机使用情况的客户细分。

Train (训练)

我们需要训练机器学习模型。训练是模型分析输入数据的过程。训练主要用于模型学习模式并将其保存为训练好的模型。例如,我们将在应用程序中创建一个 CSV 文件,在该 CSV 文件中,我们将输入客户详细信息,如男性女性2010年之前2010年之后以及手机类型。我们在 CSV 文件中提供 100 多个记录作为包含所有必要详细信息的示例。我们需要将此 CSV 文件作为输入提供给我们的模型。我们的模型需要进行训练,并使用这些数据进行分析以预测结果。预测结果将在我们的控制台应用程序中以聚类 ID 和距离分数的形式显示给我们。

分数

这里的得分与我们的回归模型不同,回归模型中,我们有带标签的输入和带标签的输出,但对于聚类模型,我们没有所需的输出,这里的得分将包含一个数组,其中包含到聚类质心的平方欧几里得距离。

参考链接:ML.NET 聚类

必备组件

确保您的计算机上已安装所有先决条件。如果尚未安装,请下载并安装Visual Studio 2017 15.6 或更高版本,并安装“.NET Core 跨平台开发”工作负载。

Using the Code

步骤 1 - 创建 C# 控制台应用程序

安装先决条件后,在桌面上依次点击“开始”>>“程序”>>“Visual Studio 2017”>>“Visual Studio 2017”。点击“新建”>>“项目”。选择“Visual C#”>>“Windows 桌面”>>“控制台应用程序 (.NET Framework)”。输入项目名称并点击“确定”。

步骤 2 – 添加 Microsoft ML 包

右键单击您的项目并单击“管理 NuGet 包”。

选择“浏览”选项卡并搜索Microsoft.ML

点击安装,我接受并等待安装完成。

我们可以看到 Microsoft.ML 包已安装,并且所有 Microsoft.ML 的引用都已添加到我们的项目引用中。

步骤 3 – 创建训练数据

现在我们需要创建一个模型训练数据集。为此,我们将添加一个 CSV 文件来训练模型。我们将在项目中创建一个名为Data的新文件夹来添加我们的 CSV 文件。

添加数据文件夹

右键单击项目并添加新文件夹,将其命名为“Data”。

创建训练 CSV 文件

右键单击“Data”文件夹,点击“添加”>>“新建项”>>选择文本文件并将其命名为“custTrain.csv”。

选择“StockTrain.csv”的属性,将“复制到输出目录”更改为“始终复制”

添加您的 CSV 文件数据,如下所示

这里,我们添加了包含以下字段的数据

(特征)

  • Male - 手机使用总数 (特征)
  • Female – 手机使用总数 (特征)
  • Before2010 – 手机使用总数 (特征)
  • After2010 – 手机使用总数 (特征)
  • MobilePhone – 手机类型。

注意:我们需要至少 100 条数据记录才能训练我们的模型。

步骤 4 – 为输入数据和预测创建类

现在,我们需要为输入数据和预测创建一个类。为此,右键单击我们的项目并添加新类,将其命名为“CustData.cs”。

在我们的类中,首先需要导入Microsoft.ML.Runtime.Api,用于列和ClusterPrediction类的创建。

using Microsoft.ML.Runtime.Api;

接下来,我们需要将所有列(与 CSV 文件中的顺序相同)添加到我们的类中,并将其设置为第 0 到第 3 列。

class CustData
    {
        [Column("0")]
        public float Male;

        [Column("1")]
        public float Female;

        [Column("2")]
        public float Before2010;

        [Column("3")]
        public float After2010;
    } 

创建预测类。现在我们需要创建一个预测类,在这个类中我们需要添加我们的预测列。这里,我们添加PredictedLabelScore列,分别命名为PredictedCustIdDistances.PredictedLabel将包含预测簇的 ID。Score列包含一个数组,其中包含到簇质心的平方欧几里得距离。数组长度等于簇的数量。有关更多详细信息,请参阅此参考链接

注意:需要注意的是,在预测列中,我们需要将列名设置为“Score”,同时将Score的数据类型设置为float[],将PredictedLabel的数据类型设置为uint

public class ClusterPrediction
    {
        [ColumnName("PredictedLabel")]
        public uint PredictedCustId;

        [ColumnName("Score")]
        public float[] Distances;
    }

步骤 5 – Program.cs

要使用 ML.NET,我们打开“program.cs”文件,首先导入所有必需的 ML.NET 引用。

using Microsoft.ML.Legacy;
using Microsoft.ML.Legacy.Data;
using Microsoft.ML.Legacy.Trainers;
using Microsoft.ML.Legacy.Transforms;

此外,将以下内容导入到您的 program.cs 文件中。

using System.Threading.Tasks; 
using System.IO;

数据集路径

我们设置了 custTrain.csv 数据和模型数据路径。对于训练数据,我们给出“custTrain.csv”路径。

最终训练好的模型需要保存才能产生结果。为此,我们将模型路径设置为“custClusteringModel.zip”文件。训练好的模型将在程序运行时自动保存到 zip 文件中,我们的 bin 文件夹中包含所有必需的文件。

static readonly string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "custTrain.csv");
static readonly string _modelPath = 
       Path.Combine(Environment.CurrentDirectory, "Data", "custClusteringModel.zip");

Main方法更改为async Task Main方法,如下所示

static async Task Main(string[] args)
        {
             
        }

在此之前,我们需要执行 2 项重要任务才能成功运行我们的程序

首先是将平台目标设置为x64。ML.NET 仅在 x64 上运行。为此,右键单击项目并选择属性 >> 选择生成并将平台目标更改为 x64。

为了运行我们的async Task Main方法,我们需要将语言版本更改为C#7.1

在项目属性 >> 生成选项卡中 >> 点击底部的“高级”按钮,将语言版本更改为C#7.1

使用训练模型

首先,我们需要训练模型并将其保存到 zip 文件中。为此,在我们的main方法中,我们调用predictionModel方法,传入CustDataClusterPrediction类,并将模型返回给main方法。

static async Task Main(string[] args)
        {
            PredictionModel<CustData, ClusterPrediction> model = await Train();
        }

  public static async Task<PredictionModel<CustData, ClusterPrediction>> Train()
        {
        }

训练并保存模型

在上述方法中,我们添加了训练模型并将模型保存到 zip 文件的功能。

学习管道

在训练中,第一步将是使用LearningPipeline()

LearningPipeline加载所有训练数据以训练模型。

文本加载器

TextLoader用于从训练 CSV 文件中获取所有数据进行训练,这里我们将useHeader设置为true以避免读取 CSV 文件的第一行。

列连接器

接下来,我们添加所有要训练和评估的特征列。

添加学习算法

KMeansPlusPlusClusterer

学习器将训练模型。我们为我们的样本选择了聚类模型,我们将使用 KMeansPlusPlusClusterer 学习器KMeansPlusPlusClusterer是 ML.NET 提供的聚类学习器之一。在这里,我们将KMeansPlusPlusClusterer添加到我们的管道中。

我们还需要设置 K 值,即我们模型使用的簇的数量。在这里,我们有 Windows Mobile、Samsung 和 Apple 3 个细分,所以我们在程序中为这 3 个聚类设置 K=4。

训练并保存模型

最后,我们将通过此方法训练并保存模型。

public static async Task<PredictionModel<CustData, ClusterPrediction>> Train()
        {
            // Start Learning
            var pipeline = new LearningPipeline();
             
            // Load Train Data
            pipeline.Add(new TextLoader(_dataPath).CreateFrom<CustData>
                                  (useHeader: true, separator: ','));
            // </Snippet6>

            // Add Features columns
            pipeline.Add(new ColumnConcatenator(
                    "Features",
                    "Male",
                    "Female",
                    "Before2010",
                    "After2010"));
             
            // Add KMeansPlus Algorithm for k=3 (We have 3 set of clusters)
            pipeline.Add(new KMeansPlusPlusClusterer() { K = 3 });
            

            // Start Training the model and return the model
            var model = pipeline.Train<CustData, ClusterPrediction>();
            return model; 
        } 

预测结果

现在是时候让我们生成模型预测结果了。为此,我们将再添加一个,在这个中,我们将给出输入。

创建一个名为“TestCustData.cs”的新

我们将值添加到我们已经创建并定义了模型训练列的TestCustDataClass

static class TestCustData
    {
        internal static readonly CustData PredictionObj = new CustData
        {
            Male = 300f,
            Female = 100f,
            Before2010 = 400f,
            After2010 = 1400f
        };
    }

我们可以在 custTrain.csv 文件中看到我们为输入提供了相同的数据。

生成模型预测结果

在我们的程序main方法中,我们将在调用Train方法后在底部添加以下代码,以预测ClusterID和距离的结果,并在命令窗口中向用户显示模型的结果。

var prediction = model.Predict(TestCustData.PredictionObj);
            Console.WriteLine($"Cluster: {prediction.PredictedCustId}");
            Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances)}");
            Console.ReadLine(); 

构建和运行

运行程序时,我们可以在命令窗口中看到如下结果

关注点

ML.NET (Machine Learning DotNet) 对于所有希望从事机器学习的 .NET 爱好者来说是一个很棒的框架。目前 ML.NET 只有预览版可用,我等不及 ML.NET 公开版的发布了。在本文中,我使用了无监督类型的聚类。如果您是 .NET 爱好者,不了解机器学习并期待从事机器学习工作,那么 ML.Net 非常适合您,它是一个很棒的框架,可以帮助您开始使用 ML.NET。希望您喜欢阅读这篇文章,很快我们将在下一篇文章中再见。

历史

  • 2018-11-01:初始版本
© . All rights reserved.