2019 年 7 月

第 34 卷,第 7 期

[机器学习]

使用 AutoML 构建机器学习预测系统

作者 James McCaffrey

Microsoft ML.NET 是一个大型的开源机器学习函数库,使用户可以使用 C# 语言程序(通常在 Visual Studio 中)创建预测模型。编写一个直接使用 ML.NET 创建预测模型的程序并不简单。AutoML 系统使用 ML.NET 命令行界面 (CLI) 工具自动为你创建预测模型,并生成使用该模型的示例代码,然后可以对其进行自定义。

要理解 ML.NET CLI 和 AutoML 是什么,并了解本文的目的,一个好方法是查看图 1 中的演示系统的屏幕截图。演示使用名为“people_train.tsv”的定型数据文件来创建预测模型,和一个名为“people_test.tsv”的测试数据文件来评价预测模型的准确性。演示的目的是通过年龄、性别、地理区域和年收入来预测一个人的政治倾向(保守派、温和派、自由派)。

运行中的 AutoML 和 ML.NET CLI
图 1 运行中的 AutoML 和 ML.NET CLI

演示程序通过执行以下命令在 Windows CMD shell 中运行 AutoML:

mlnet auto-train ^
--task multiclass-classification ^
--dataset ".\Data\people_train.tsv" ^
--test-dataset ".\Data\people_test.tsv" ^
--label-column-name politic ^
--max-exploration-time 5

carat 字符用于命令行界面中的续行符。同样的 AutoML 命令也可以在 PowerShell 中运行,方法是使用重音符续行符而不是 carat。

AutoML 使用不同的算法自动创建和评估几种不同的机器学习模型,比如 SgdCalibratedOva(“stochastic gradient descent calibrated one versus all”)和 AveragedPerceptronOva。在演示运行中,AutoML 确定 LightGbmMulti(“lightweight gradient boosting machine multiclass”)算法为最佳选项,对测试数据的预测准确性为 77.01%。

在研究了不同的预测模型之后,AutoML 将最佳模型保存为 MLModel.zip,并生成示例 C# 代码和一个相当长的用于模型的名为“SampleMulticlassClassification.Console.App.csproj”的 Visual Studio 项目文件。

图 2 展示了如何在 C# 程序中使用经训练的模型示例。生成的代码经过编辑,用于预测一个居住在“中部”地区、年收入为 62,000.00 美元的 33 岁男性。预测此人的政治倾向是“温和派”。

利用 AutoML 模型进行预测
图 2:使用 AutoML 模型进行预测

演示程序还显示了保守派、温和派、自由派的预测概率:(0.0034、0.9055、0.0912)。从数学意义上讲,这些概率都不是真实的,但它们确实提供了一个关于预测置信度的大致建议。在这种情况下,模型似乎相当确定 (p = 0.9055) 此人为“温和派”。

ML.NET CLI 和 AutoML 目前都处于预览模式,并且处于快速开发阶段,所以在阅读本文时,这里提供的一些信息可能已经发生变化。然而,大多数更改应以附加功能的形式出现,而不是以基础体系结构的形式出现。

本文假设你具有中级或更好的 C# 技能,并且基本熟悉在命令行界面中工作,但不假设你对 ML.NET CLI 或 AutoML 有任何了解。本文提供所有演示程序代码。可以在本文随附的下载内容中获取两个演示数据文件。

了解数据

大多数机器学习问题都是从分析和准备可用数据开始的,在使用 ML.NET CLI 和 AutoML 时也是如此。定型数据有 1,000 项,如下所示:

sex   age  region   income    politic
False  26  eastern  53800.00  conservative
False  19  western  39200.00  moderate
True   19  central  80800.00  liberal
False  52  eastern  86700.00  conservative
False  56  eastern  89200.00  liberal
...

测试数据具有相同的格式,且包含 200 项。数据是合成的,并以编程方式生成。这两个文件都是用制表符分隔的,并且都有一个 .tsv 扩展名来将它们标识为 AutoML。AutoML 还支持空格分隔 (.txt) 和逗号分隔 (.csv) 文件。AutoML 支持带或不带标题行的数据文件,但你很快就会看到,提供标题行比不提供标题行更方便。

虽然预测问题的种类很多,但基本类型有三种:多类分类、二元分类和回归。多类分类问题的目标是预测一个离散值,其中有三个或更多可能的值需要考虑。例如,在演示程序中,根据一个人的年龄、性别、地理区域和年收入来预测其政治倾向(保守派、温和派、自由派)。

二元分类问题的目标是预测一个离散值,它可以是两个可能值中的一个。例如,你可能希望根据年龄、地理区域、收入和政治倾向来预测一个人的性别(男性或女性)。如果初次接触机器学习,你可能会觉得有点奇怪,二元分类和多类分类被认为是不同的类别。事实证明,这两种类型的问题有一些基本的数学差异。

回归问题的目标是预测单个数值。例如,你可能希望根据性别、年龄、地理区域和政治倾向来预测一个人的年收入。AutoML 目前支持多类分类、二元分类和回归。最终将添加对其他类型问题的支持,比如排名和聚类分析。

演示数据文件演示了二进制、整数、分类和浮点型数据的用法。在处理二进制数据(例如性别变量)时,应使用 True 和 False(大写或小写),而不是使用 0 和 1。该演示对男性使用 False,对女性使用 True,因此可以将性别变量视为“is-female”。

务必要保留 AutoML 文件和组织的目录。我创建了一个名为“MLdotNET”的顶级目录。然后,在 MLdotNET 中,我创建了一个名为“People”的目录,作为与人员数据关联的 AutoML 文件的根目录。在“People”目录中,我创建了一个名为“Data”的目录,并在其中放置了文件 people_train.tsv 和 people_test.tsv。我在“People”根目录中执行了 AutoML 命令,因为 AutoML 在发出命令的根目录中生成子目录。

安装 AutoML

就像预发布软件经常出现的情况一样,我在安装 AutoML 时遇到了几个小故障,你可能也会遇到一些小问题。简单地说,有三个步骤来启动和运行 AutoML。如有必要,首先安装 Visual Studio。其次,根据需要安装 .NET Core SDK。最后安装包含 AutoML 的 ML.NET CLI 工具。

在没有 Visual Studio 的情况下也可以使用 AutoML,但 AutoML 创建的模型是专门为 Visual Studio 设计的。我已成功使用 Visual Studio 2017 Professional 和免费的 Visual Studio 2017 社区版。AutoML 文档声明 AutoML 与 Visual Studio 2019 兼容,但我无法让我的模型使用它进行加载。

AutoML 系统依赖于 .NET Core框架,特别是 .NET Core SDK。经过一定的试验和错误之后,我成功安装了 SDK 版本 2.2.101。安装过程使用带有美观 GUI 的标准自解压可执行文件。安装 .NET Core SDK 还提供运行时环境,因此不必单独安装它。

安装 .NET Core SDK 后,最后一步是安装 AutoML。AutoML 不是一个独立的程序,而是驻留在名为“mlnet”的工具中,这有点令人困惑。要安装 mlnet 工具,需要启动一个 shell(CMD 或 PowerShell),并发出命令 > dotnet tool install -g mlnet。该命令将访问 Internet(因此必须在线)进入默认存储库,并将 mlnet 安装到计算机上的默认位置。经过几次错误启动之后,我最终收到消息“工具'mlnet'(版本 0.3.0)已成功安装”。我通过发出命令 > dotnet tool list -g 来验证安装。

图 3 中的关系图显示了 AutoML 系统中使用的关键组件之间的关系。

AutoML 组件
图 3 AutoML 组件

多类分类

要使用 AutoML 创建多类分类问题,至少需要三个参数,例如:

mlnet auto-train ^
--task multiclass-classification ^
--dataset ".\Data\people_train.tsv" ^
--label-column-name politic ^

任务类型可以是“多类分类”、“二元分类”或“回归”。 dataset 参数指定定型数据的路径。可以使用 Windows 风格的反斜杠字符或 Linux 风格的正斜杠。test-dataset 参数为可选。如果没有 test-dataset,AutoML 将使用定型数据评估经训练后的模型。

可以提供可选的 valid­ation-dataset 参数,以便 AutoML 使用训练-验证-测试模式。在训练期间,AutoML 监视与验证数据上的模型相关联的错误,当错误开始增加时,训练可以提前停止,这样模型就不会过度拟合定型数据。

label-column-name 参数指定包含要预测的变量的列的名称。如果定型数据集没有标题,可以使用带基于 1 的列索引的 label—column-index 参数,例如 --label-column-index 5。

图 4 中的表总结了 AutoML 的 14 个参数。每个参数都具有前面带双连字符的全名和一个前面带单个连字符的区分大小写字母的快捷别名。大多数参数的含义是很容易理解。--cache 参数指示 AutoML 将所有数据加载到内存中可行(开)还是不可行(关),或自动确定要执行的操作。

图 4 AutoML 命令摘要

参数 别名 默认值
--task -T 多类分类、二元分类、回归  
--dataset -d 文件路径  
--test-dataset -t 文件路径
--validation-dataset -v 文件路径
--label-column-name -n 要预测的变量的标头中的列名称  
--label-column-index -i 要预测的变量的标头中基于 1 的列索引  
--ignore-columns -I 标头中要忽略的以逗号分隔的列名称
--has-header -h true、false true
--max-exploration-time -x 以秒为单位的时间 10
--verbosity -V 静默、最小、诊断 最小
--cache -c 开、关、自动 auto
--name -N 创建的输出项目的名称 Sample{task}
--output-path -o 要放置输出项目的目录 当前目录
--help -h    

--max-exploration-time 参数对 AutoML 结果的影响最大。通常,允许 AutoML 工作的时间越多,生成的预测模型就越好。AutoML 所做的实际上是双重探索。首先,它尝试适用于预测任务类型的不同算法。例如,对于一个多类分类问题,AutoML 目前支持 10 种算法:AveragedPerceptronOva、FastForestOva、FastTreeOva、LbfgsLogisticRegressionOva、LbfgsMaximumEntropyMulti、LightGbmMulti、LinearSvmOva、SdcaMaximumEntropyMulti、SgdCalibratedOva、SymbolicSgdLogisticRegressionOva。

其次,对于每个适用的算法,AutoML 都会尝试特定于算法的超参数的不同值。例如,FastTreeOva 算法要求为以下五个参数指定值:NumberOfLeaves、MinimumExampleCountPerLeaf、NumberOfTrees、LearningRate 和 Shrinkage。LightGbmMulti 算法需要 13 个参数的值,包括 NumberOfIterations、LearningRate 和 L2Regularization。

算法和超参数的不同组合的数量大得超乎想象。人工机器学习专家依靠直觉和经验来寻找出色的算法和一组适当的超参数,但该过程非常乏味且耗时。AutoML 会自动执行复杂搜索。

解释结果

如果参考图 1 中的屏幕截图,将看到 AutoML 显示找到的五个最佳模型的信息:

Trainer                MicroAccuracy  MacroAccuracy
1  LightGbmMulti          0.7701         0.7495
2  FastTreeOva            0.7471         0.7201
3  FastForestOva          0.7471         0.7236
4  AveragedPerceptronOva  0.4598         0.3333
5  LinearSvmOva           0.4598         0.3333

MicroAccuracy 和 MacroAccuracy 值为模型预测准确性提供了两个不同指标。MicroAccruacy 是两者中更重要的一个指标。MicroAccuracy 为正常准确性,即测试数据的正确预测数除以项目总数。测试数据集有 200 个项,其中最佳算法 LightGbmMulti 得分为 77.01%,正确率为 154/200。

MacroAccuracy 是要预测的所有类的平均准确性。例如,假设 200 个项的测试数据集有 60 个保守派项、90 个温和派项和 50 个自由派项。假设一个模型正确预测了 60 个保守派项中的 45 个 (0.7500)、90 个温和派项中的 63 个 (0.7000),以及 50 个自由派项中的 30 个 (0.6000)。则模型的 MacroAccuracy 为 (0.7500 + 0.7000 + 0.6000) / 3 = 0.6833。

当数据集高度偏向一个类时,MacroAccuracy 非常有用。例如,如果测试数据集有 180 个保守派项、10 个温和派项和 10 个自由派项,则模型就可以预测所有项的保守性,MicroAccuracy 得分为 180 / 200 = 0.9000,但 MacroAccurcy 应为 (0.9000 + 0.0000 + 0.0000) / 3 = 0.3000。因此,需要研究 MicroAccuracy 和 MacroAccuracy 值之间的巨大差异。

使用生成的模型

创建机器学习预测模型很有趣,但关键是使用该模型进行预测。AutoML 在“People”根目录中创建一个名为“SampleMulticlassClassification”的子目录。可以使用 --name 参数指定更具描述性的名称。子目录包含以 .zip 格式保存生成模型的目录和一个自动生成的 C# 控制台应用程序,后者可用作进行预测的模板。

自动生成的代码清晰易懂。双击文件“SampleMulticlassClassification.sln”将启动 Visual Studio 2017,然后使用“Solution”文件加载 C# 项目。示例代码使用测试数据集文件中的第一个数据项进行预测。我编辑了模板代码来预测一个新的、以前未见过的人员的政治倾向,如图 2**** 所示。

编辑后的预测代码首先将训练好的模型加载到内存中,然后使用该模型创建一个 PredictionEngine 对象:

static void Main(string[] args)
{
  MLContext mlContext = new MLContext();
  ITransformer mlModel =
    mlContext.Model.Load(GetAbsolutePath(MODEL_FILEPATH),
    out DataViewSchema inputSchema);
  var predEngine =
    mlContext.Model.CreatePredictionEngine<ModelInput,
    ModelOutput>(mlModel);...

接下来,自定义代码为一个人员设置预测值:

Console.WriteLine("\nPredicting politic for Age = 33,
  Sex = Male, Region = central, Income = $62,000.00");
ModelInput X = new ModelInput();
X.Age = 33; X.Sex = false;
X.Region = "central"; X.Income = 62000.00f; ...

请记住,二进制预测变量(如 Sex)为布尔值编码。注意,Income 变量后面有一个“f”来将值转换为 float 类型,这是 ML.NET 系统使用的默认浮点类型。Age 变量也是 float 类型,但不需要尾随“f”,因为该值不包含小数点,并自动强制转换为 float 类型。

预测如下所示:

ModelOutput Y = predEngine.Predict(X);
string predPolitic = Y.Prediction;
float[] predProbs = Y.Score;...

Prediction 属性是预测类的字符串表示形式(演示中为“moderate”),Score 是与每个可能的类对应的浮点值数组:(0.0034、0.9055、0.0912)。AutoML 系统使用在定型数据中第一次看到类标签的顺序。回想下定型数据,如下所示:

sex   age  region   income    politic
False  26  eastern  53800.00  conservative
False  19  western  39200.00  moderate
True   19  central  80800.00  liberal
False  52  eastern  86700.00  conservative

因此“保守派”为 [0],“温和派”为 [1],“自由派”为 [2]。使用 AutoML 时,我经常重新排列定型数据的前几行,以获得适当的顺序来预测值。

二元分类和回归

一旦了解了使用 AutoML 为多类分类问题创建和使用预测模型的原则,处理二元分类和回归问题就相对简单了。例如,可以发出以下命令来创建一个模型,根据年龄、地区、收入和政治倾向来预测一个人的性别:

mlnet auto-train ^
--task binary-classification ^
--dataset ".\Data\people_train.tsv" ^
--test-dataset ".\Data\people_test.tsv" ^
--label-column-name sex ^
--max-exploration-time 300

可以根据年龄、性别和政治倾向来预测年收入,但不能根据地区进行预测:

mlnet auto-train ^
--task regression ^
--dataset ".\Data\people_train.tsv" ^
--test-dataset ".\Data\people_test.tsv" ^--ignore-columns region ^
--label-column-name income ^
--max-exploration-time 300

与多类分类相比,二元分类和回归命令会产生不同的结果指标。二元分类显示准确性、AUC、AUPRC 和 F1 分数指标。简而言之,AUC 是接收方操作特性函数的“曲线下面积”,是衡量在一个二元分类问题中两个类能够多么理想地分离的一个指标。AUC 值越大越好。AUPRC 是“精确率召回率曲线下面积”,某种程度上是一个类似的指标,值越大越好。F1 分数是精确率和召回率的平均值,两个均为指标,值越大越好。

使用 AutoML 进行回归显示 R 平方、绝对损失、平方损失和 RMS 损失。R 平方值越大越好,绝对损失、平方损失和 RMS 损失的值则越小越好。如果初次接触机器学习,不要过分关注这些统计信息。在机器学习中,提供许多指标是一种常见做法。准确性通常是需要注意的主要指标。

但请注意,对于回归模型没有准确性指标。这是因为对于回归问题的正确预测没有固有定义。例如,如果预测年收入为 58,001.00 美元,而实际年收入为 58,000.00 美元,预测是否正确?

对于回归问题,必须定义与问题相关的准确性含义。通常,可以指定允许的百分比差异。例如,如果指定百分比 0.10,并且正确收入为 60,000.00 美元,那么任何介于 54,000.00 美元到 66,000.00 美元之间的预测收入都将被视为正确预测。

AutoML 生成的模板代码使你能够轻松计算预测问题的准确性。伪代码如下:

loop each line in test dataset file
  parse out sex, age, region, politic, and correct income
  use sex, age, region, politic to compute predicted income
  if predicted is within x% of correct
    increment number correct
  else
    increment number wrong
end-loop
return number correct / (number correct + number wrong)

通过这些示例,应对 AutoML 和 ML.NET 可以处理的问题类型有所了解。AutoML 和 ML.NET 无法处理的一种机器学习类型是基于神经网络的预测。与 AutoML 支持的传统机器学习算法相比,神经网络要复杂得多。一直有关于向 ML.NET 和 AutoML 添加神经网络功能的讨论,但短期内不太可能添加此类功能。

使用 AutoML 的一个有趣的好处是,除了生成模板代码来加载经训练的模型并使用它进行预测之外,AutoML 还会生成一个 ModelBuilder.cs 文件,其中包含用于创建、训练和保存预测模型的基础代码。例如,在 ModelBuilder.cs 文件中为多类分类示例生成的一些代码包括:

// Set the training algorithm
var trainer =   mlContext.MulticlassClassification.Trainers.
  LightGbm(labelColumnName: "politic",
  featureColumnName: "Features").Append(mlContext.Transforms.Conversion.
  MapKeyToValue("PredictedLabel", "PredictedLabel"));

var trainingPipeline = dataProcessPipeline.Append(trainer);

如果希望探索在 Visual Studio 中手动使用 ML.NET 创建预测模型,而不是自动使用 AutoML,则可以使用 ModelBuilder.cs 代码作为起点。这比从头开始编写代码要轻松得多。

总结

在我第一次看到 AutoML 时便印象深刻。可以说它有很酷的技术特性,但更重要的是,AutoML“给人的感觉很棒”。 CLI 简单易用,生成的模板代码简洁且易于修改。换而言之,AutoML 给人以战友而非敌对的感觉。

AutoML 只是快速发展的机器学习工具和系统生态系统的一部分。此生态系统正在快速扩展,就连我和我的同事们(我们的工作非常接近这些新系统源)也发现,要掌控一切很难。Azure 认知服务、Azure 机器学习工作室和 Azure Data Science Virtual Machine 等已经存在了几年的系统,现又加入了新系统,如 Azure Data Prep SDK、NimbusML 和 ONNX Runtime。这是使用 .NET 和开源技术开发机器学习系统的激动人心的时刻。


Dr.James McCaffrey 供职于华盛顿地区雷蒙德市沃什湾的 Microsoft Research。他参与开发过多个重要 Microsoft 产品(包括 Azure 和必应)。Dr.可通过 jamccaff@microsoft.com 与 McCaffrey 取得联系。

衷心感谢以下 Microsoft 技术专家对本文的审阅:Chris Lee 和 Ricky Loynd


在 MSDN 杂志论坛讨论这篇文章