机器学习-呐你已经是成熟的机器了学习问题请自己搞定

45次阅读

共计 11606 个字符,预计需要花费 30 分钟才能阅读完成。

想问问各位从事数据迷信工作的小伙伴:你感觉,机器学习最难的点是什么?

「不晓得何时能实现!!」恐怕很多人都会对这一点深有体会。

假如要用机器学习解决一个问题,首先,咱们须要构建数据集,接着构想如何解决问题。然而最苦楚的中央在于,破费大量工夫之后,咱们齐全不晓得本人的计划是否可行!

机器学习的流程之所以如此艰巨,局部起因在于,这个畛域存在许多经验丰富的从业者才晓得的最佳实际。对于数据迷信畛域的老手,咱们可能会破费大量工夫践行一种自认为正确的办法,但实际上那些专家从业者可能一开始就会晓得,咱们抉择的办法是行不通的……

但如果那些专家们能够将这些最佳实际编纂成一个简略易用的软件包,供所有开发人员应用,后果会怎么样?构想一下:一个能够主动筹备数据集,尝试不同机器学习办法,并将后果组合在一起以提供高质量模型的库,并且所有这些性能只须要几行代码就能实现。冲动吗?

自动化机器学习

上述构想实际上就是自动化机器学习(AutoML)背地的理念,也是 AutoGluon AutoML 库的设计理念。该库由 Amazon Web Services(AWS)在 re:Invent 2019 上开源。借助 AutoGluon,咱们能够训练最先进的机器学习模型,以进行图像分类、对象检测、文本分类和表格局数据预测,而简直无需具备机器学习方面的教训。并且咱们还能够随时随地运行 AutoGluon,无论应用笔记本电脑或工作站,或者应用功能强大的 Amazon Elastic Compute Cloud(Amazon EC2)实例,都能够运行这个库,并以利用多个内核更快地取得后果。

最近,AWS 的 AutoGluon 团队发表了一篇论文,具体介绍了 AutoGluon-Tabular 的外部工作原理,这是一种开源 AutoGluon 性能,容许您对来自电子表格和数据库表格等起源的表格数据集的机器学习模型进行训练。


AutoGluon-Tabular 论文地位如下:https://arxiv.org/abs/2003.06505

下文的上半局部,将介绍 AutoGluon-Tabular,并总结该论文中介绍的要害翻新以及应用 AutoGluon-Tabular 在幕后产生的神奇操作。下半局部将介绍一个端到端代码示例,展现如何应用 AutoGluon-Tabular 凭借几行代码在数据迷信比赛中取得排名前 1% 的分数,且无需机器学习教训。
如果想疾速入门并开始学习本示例,请转到“在下一次数据迷信比赛中抢占先机”局部。演示用的 Jupyter 笔记本可在 GitHub 上取得。

AutoML 的 AutoGluon-Tabular 解决方案

尽管图像和视频畛域的机器学习应用程序引起了极大的关注,但人们几十年来始终在将统计技术利用于表格数据(例如电子表格或数据库中的行和列),以构建预测模型或收集汇总统计数据。大量数据迷信问题属于这一类别,例如,基于库存和需要数据的销售预测、交易数据的欺诈检测以及依据用户偏好生成产品倡议。

本文将重点介绍 AutoGluon 解决表格数据的性能的子集,咱们将其称为 AutoGluon-Tabular。

AutoGluon-Tabular 让咱们能够通过用户敌对型 API 拜访专家数据科学家应用的所有最佳实际,其设计采纳以下次要准则:

  1. 繁难性:用户应可能应用几行代码即可训练分类和回归模型并部署
  2. 稳定性:用户应可能提供原始数据,而无需任何特色工程和数据操作
  3. 可预测的工夫安顿:用户应可能指定工夫估算并在该工夫限度下获得最佳模型
  4. 容错能力:用户应可能在中断时复原训练,并可能查看所有两头步骤

如果你曾经是一名数据迷信专家从业者,并且想晓得 AutoGluon-Tabular 对本人是否有用,答案是必定的!即便对于专家来说,AutoGluon-Tabular 也能够通过主动执行耗时的手动步骤来节省时间,例如解决失落的数据、手动性能转换、数据拆分、模型抉择、算法抉择、超参数抉择和调整、集成多个模型,以及在数据更改时反复此过程。

AutoGluon-Tabular 还包含用于多层重叠集成的新技术,可显著进步模型的准确性。因为 AutoGluon 齐全开源,具备透明度和可扩展性,因而咱们能够全面理解它在流程的每个阶段所做的工作,甚至引入本人的算法并将它们与 AutoGluon 一起应用。

AutoGluon API

AutoGluon-Tabular 用户只需晓得如何应用三个 Python 函数:Dataset()fit()predict()。尽管这些 API 很简洁,但实际上在幕后有很多操作,AutoGluon-Tabular 能够借此为咱们提供高质量模型。下一节将具体介绍这些函数,并探讨它们的不同之处。

第 0 步:启动 Amazon EC2 实例,装置并导入 AutoGluon

AutoGluon 能够利用多核 CPU 放慢训练速度。倡议从 C5 或 M5 系列启动 Amazon EC2 实例。抉择较高的 vCPU 数量以取得更快的性能。无关如何启动实例和拜访实例的简要指南,请浏览 Amazon EC2 入门文档。依照 AutoGluon 网页上的阐明装置 AutoGluon。在大多数状况下,应该只能运行 pip install。

要运行 AutoGluon-Tabular,首先要通知 AutoGluon 咱们感兴趣的工作是为表格数据构建预测器。将 TabularPrediction 替换为 ImageClassification 以解决图像分类问题,替换为 ObjectDetection 以解决对象检测问题,替换为 TextClassification 以解决文本分类问题。API 的其余部分放弃不变。借此即可轻松地在问题间切换,而无需重新学习 API。

from autogluon import TabularPrediction as task

第 1 步:加载数据集

对于 pandas 用户,能够轻松应用 Dataset 函数,并取得相似 pandas 的体验,这样就能够执行一些操作,如删除变量或退出多个数据集。因为 AutoGluon-Tabular 主动治理数据预处理,因而咱们不须要进行任何数据操作。

data = task.Dataset(DATASET_PATH) 

第 2 步:模型拟合

fit() 函数执行所有沉重的工作,咱们将在下一节中介绍这一点。此函数有两大工作:钻研数据集,而后为训练做筹备,它适宜多个模型,并将它们组合在一起以生成高精度模型。

predictor = task.fit(data_train, label=LABEL_COLUMN_NAME)

第 3 步:做出预测

predict 函数通过新数据生成预测。预测可能导致预测类别和概率的分类问题,或间断值的回归问题。运行 fit() 函数时,将生成多个模型并保留到磁盘中。如果在当前从新拜访它们,只需应用 load 命令加载预测器并应用它运行预测即可。

prediction = predictor.predict(new_data)

fit () 函数的魔力

将数据集传递给 task.fit() 函数时,它会执行两项操作:数据预处理和模型拟合。当初,咱们来理解一下幕后的工作状况。

数据预处理

AutoGluon-Tabular 首先查看标签列,并确定是否存在分类问题(预测类别)或回归问题(预测间断值)。而后它将启动数据预处理步骤,将数据转换为一种在 fit() 阶段将被许多不同的机器学习算法占用的表格。

在预处理步骤中,AutoGluon-Tabular 首先将每个特色分类为数字、类别、文本或日期 / 工夫。不能分类的列,如蕴含非数字信息且不反复(被视为类别)的列,将被弃用,例如用户 ID。

文本列转换为 n-gram(间断的 n 项或词序列)特色的数值向量;日期和工夫特色转换为适合的数值。为了解决短少的离散变量,AutoGluon-Tabular 会创立一个额定的未知类别,而不是输出(用平均值等代理替换)。在实在的数据集中,因为各种起因(例如数据损坏、传感器故障和人为谬误),数值可能会缺失,但这并不意味着没有任何乏味的货色。将其归类为未知容许 AutoGluon-Tabular 在用新数据生成预测时解决以前不可见的类别。在模型拟合阶段,AutoGluon-Tabular 还执行特定于模型的额定数据预处理步骤。

模型拟合

调用 fit() 函数时,AutoGluon-Tabular 将基于预处理的数据训练一系列的机器学习模型。而后应用集成和重叠将多个模型组合起来。

AutoGluon-Tabular 以专门抉择的程序训练各个模型。首先,训练性能牢靠的模型(如随机森林),而后逐渐训练须要计算量更大但可靠性更低的模型,如 k 最近邻。这种办法的益处是能够对 fit() 函数施加工夫限度,并将返回在工夫限度下能够训练的最佳模型。利用 AutoGluon-Tabular,能够灵便地决定是无约束地实现最佳精度,还是在特定的老本或工夫估算下实现最佳精度。

AutoGluon-Tabular 目前反对以下算法,如果没有工夫限度,能够对所有这些算法进行训练:

  1. 随机森林
  2. 超随机树
  3. k 最近邻
  4. LightGBM 晋升树
  5. CatBoost 晋升树
  6. AutoGluon-Tabular 深度神经网络

AutoGluon-Tabular 深度神经网络架构的新颖性

在数据科学界有一种常见误会,即深度学习办法不能很好地解决表格数据。之所以产生这种想法是因为:在神经网络中引入了卷积,以便通过权值共享实现平移不变性。此办法对于一维信号、二维或者三维图像或视频数据集十分无效,因为这些数据集中的每个信号采样或像素值自身的预测能力很低。在许多表格数据集应用程序中,每个特色都具备独特的重要性,并且比图像中的单个像素具备更高的预测能力。在这些状况下,前馈或卷积神经网络架构的性能往往低于基于决策树的同类架构。

为了解决这些问题,AutoGluon-Tabular 采纳了如下图所示的新型神经网络架构。实证钻研表明,精心设计的神经网络能够显著晋升准确度,特地是创立与其余模型类型的集成时,咱们将在下一节探讨这一点。

与罕用的纯前馈网络架构不同,AutoGluon-Tabular 为每个分类特色都引入了一个嵌入层,其中嵌入维数依据特色中惟一类别的数量按比例抉择。嵌入层的长处是,在被后续前馈层应用之前,为每个分类特色引入了一个可学习组件。而后,将分类特色的嵌入与数值特色连接成一个大矢量,该矢量既馈入一个三层前馈网络,又通过线性跳接(相似于残余网络族)间接连贯到输入预测。

集成和多层重叠

将多个模型组合起来,创立一个“集成”,从而相比每个参与者都具备更高的预测准确度,这种想法并不陈腐。集成技术最早的实现能够追溯到 20 世纪 90 年代晚期,过后呈现了晋升法(和 AdaBoost 算法)和自助聚合法(Bootstrap Aggregation)。这些技术创立了决策树的集成,这些决策树是弱分类器(不比随机猜想强多少)且不稳固(对数据集的变动很敏感)。然而,当许多决策树组合在一起时,就生成了具备高预测能力的模型,不受过拟合的影响。这些晚期成绩是许多风行机器学习包的根底,如 LightGBM、CatBoost 和 scikit-learn 的 RandomForest,这些都在 AutoGluon 中所采纳。

如果想晓得是否能够组合 RandomForest、CatBoost、k 最近邻等的输入来进一步提高模型准确度,答案是必定的。有教训的机器学习从业者曾经这样做了很多年,可能纯熟设计奇妙的办法来组合多个模型。请查看奥托团体产品分类挑战赛 Kaggle 比赛的获奖作品。第一名的解决方案包含 33 个模型,再应用这些模型的输入训练另外 3 个模型(重叠),而后进行加权均匀。

利用 AutoGluon-Tabular,咱们不用具备重叠和集成技术,AutoGluon-Tabular 会主动执行。AutoGluon-Tabular 引入了一种新型的多层重叠集成,如上图所示。上面介绍了其工作原理:

  • 根底层:别离训练模型拟合局部中形容的多个根底模型。
  • Concat 层:将第一层的输入与输出特色连贯在一起。
  • Stacker 层:基于 Concat 层输入训练多个 Stacker 模型。AutoGluon-Tabular 带来的新颖性在于,Stacker 重用与根底层完全相同的模型,包含在 Stacker 模型中应用其超参数。因为输出特色与根底层的输入连贯在一起,因而 Stacker 模型也有机会查看输出数据集。
  • 加权层:施行抉择的集成办法,行将 Stacker 模型引入到一个新的集成中,从而最大水平地进步验证准确度。

为确保每个分类器都能看到整个数据集,AutoGluon-Tabular 执行 k - 折穿插验证。为了进一步提高预测准确度和缩小过拟合,AutoGluon-Tabular 将对 n 个不同的随机输出数据分区反复执行 n 次 k – 折穿插验证。数字 n 的抉择办法是,在调用 fit() 函数时,预计在指定的工夫限度内能够实现多少次循环。

AutoGluon-Tabular 和容错

在生存和数据迷信中,事件可能不会按计划进行。当应用 AutoGluon-Tabular 时,咱们可能会不小心按下 Ctrl+C,或者遇到电源浪涌,导致计算机断电,或者敞开了所有正在运行的 Amazon EC2 实例,而没有意识到正在运行训练作业。呈现谬误以及事件没有按计划进行时,咱们必定不心愿被数据失落和停滞不前所困扰。AutoGluon-Tabular 为这类状况提供了一些内置爱护。

调用 fit() 函数时,AutoGluon-Tabular 首先预计所需的训练工夫,如果超出训练某层的剩余时间,则跳过该层,持续训练下一层。为了确保没有停滞不前,训练每个新模型后,会立刻将其保留到磁盘。如果的确产生了故障,AutoGluon-Tabular 只有在产生故障之前(或在达到工夫限度之前)至多对一个模型训练了一折(共 k 折),依然能够进行预测。对于在训练过程中反对两头检查点的算法,如基于树的算法和神经网络,AutoGluon-Tabular 依然能够应用这些检查点生成预测。AutoGluon-Tabular 还能够预测模型在训练过程的哪个阶段会失败,而后跳到下一阶段。

代码示例:在下一次数据迷信比赛中抢占先机

当初你应该对 AutoGluon-Tabular 的工作形式有了肯定的理解,然而数据迷信是一门实践性很强的学科,因而最好的学习办法是进行实际。
在本节中,咱们将介绍一个应用 AutoGluon-Tabular 基于数据集训练模型的端到端示例,该数据集曾在 Kaggle 上的奥托团体产品分类挑战赛上应用。执行上面的示例后,应该可能获得不错的问题,在排行榜上可位列前 1%。较量曾经完结,然而咱们依然能够提交模型,在公开排行榜和非公开排行榜上占一席之地。

参赛数据集由代表产品的 20 万行和代表产品特色的 93 列组成。产品分为训练数据集中标签列指定的 10 类。较量的指标是依据产品的 93 个特色预测产品类别。能够在较量页面上浏览无关较量的更多信息。

先决条件

如果想在一边浏览时一边运行示例,能够在 GitHub 上获取演示用的 Jupyter 笔记本。

要下载数据集并将分数提交给 Kaggle,请进入较量页面,单击“加入较量”并批准其条款和条件,而后再持续。

下文的操作中,咱们在 AWS 上的一个 c5.24xlarge EC2 实例上运行了这些示例,整个训练耗时 2 小时 30 分钟。c5.24xlarge 是通过计算优化的实例,并提供 96 个 CPU 内核。倡议抉择具备大量内核的实例类型,因为许多 AutoGluon-Tabular 算法都是多线程的,能够利用所有内核。上面的屏幕截图显示了在训练(神经网络训练)阶段在 EC2 实例上应用 htop 命令时的 CPU 应用状况。绿色程度条示意 CPU 内核繁忙。彩色条示意每个内核的利用率不到 100%。均匀负载分数 84 示意截取屏幕快照时所有 96 个 CPU 的均匀负载。

如果抉择内核数量较少的 CPU 实例,则训练工夫将更长。为节省成本,请思考在 EC2 Spot 实例上运行,这样就能够享受实例价格的折扣,然而能够抢占这些实例。因为 AutoGluon-Tabular 设计为具备容错能力,因而当容量再次可用时,咱们始终能够复原训练。

下载 Kaggle CLI

依照 Kaggle API GitHub 页面上的阐明下载 Kaggle CLI。借助 CLI,咱们能够轻松下载数据集并以编程形式提交预测后果,而无需来到 Jupyter 笔记本。

下载 AutoGluon

依照 AutoGluon 网页上的阐明装置 AutoGluon。在大多数状况下,咱们应该能够应用 pip 进行装置。

入门

以下步骤来自 GitHub 上托管的 otto-kaggle-example.ipynb Jupyter 笔记本。让咱们具体看看每个步骤。

第 1 步:下载数据集

此步骤假如已装置 Kaggle CLI,并已批准通过拜访较量页面来加入较量。

dataset = 'dataset'
!kaggle competitions download -p {dataset} -q otto-group-product-classification-challenge
!unzip -d {dataset} {dataset}/otto-group-product-classification-challenge.zip
!rm {dataset}/otto-group-product-classification-challenge.zip

输入:

Archive: dataset/otto-group-product-classification-challenge.zip
 inflating: dataset/sampleSubmission.csv 
 inflating: dataset/test.csv 
 inflating: dataset/train.csv

第 2 步:导入 AutoGluon 并检查数据集

在此步骤中,咱们导入一个 TabularPrediction 工作。如果相熟 pandas,那么就会十分相熟 task.Dataset() 函数,该函数能够读取各种表格数据文件,并返回相似 pandas 的对象。因为 AutoGluon-Tabular 并不心愿咱们进行任何预处理,因而除了删除不须要的变量或退出多个数据集之外,咱们不须要进行大量数据操作。

from autogluon import TabularPrediction as task train_data = task.Dataset(file_path=f'{dataset}/train.csv').drop('id', axis=1) train_data.head()

输入:

Loaded data from: dataset/train.csv | Columns = 95 / 95 | Rows = 61878 -> 61878
feat_1 feat_2 feat_3 feat_4 feat_5 feat_6 feat_7 feat_8 feat_9 feat_10 ... feat_85 feat_86 feat_87 feat_88 feat_89 feat_90 feat_91 feat_92 feat_93 target
0 1 0 0 0 0 0 0 0 0 0 ...1 0 0 0 0 0 0 0 0 Class_1
1 0 0 0 0 0 0 0 1 0 0 ...0 0 0 0 0 0 0 0 0 Class_1
2 0 0 0 0 0 0 0 1 0 0 ...0 0 0 0 0 0 0 0 0 Class_1
3 1 0 0 1 6 1 5 0 0 1 ...0 1 2 0 0 0 0 0 0 Class_1
4 0 0 0 0 0 0 0 0 0 0 ...1 0 0 0 0 1 0 0 0 Class_1
5 rows × 94 columns

第 3 步:拟合 AutoGluon 模型

label_column = 'target' # specifies which column do we want to predict
savedir = 'otto_models/' # where to save trained models
predictor = task.fit(train_data=train_data,
                        label=label_column,
                        output_directory=savedir,
                        eval_metric='log_loss',
                        auto_stack=True,
                        verbosity=2,
                        visualizer='tensorboard')

fit() 函数的必须参数是 train_data 和 label,其余参数是可选的。在此示例中还指定了以下选项:

  • output_directory:要保留所有模型和两头步骤的地位。
  • eval_metric:指标 AutoGluon 将用于优化模型;无关反对的指标的残缺列表,请参见文档页面。
  • auto_stack:如果心愿 AutoGluon 利用本文“集成和多层重叠”局部中所述的重叠,则此选项为 true。
  • verbosity:值为 0 示意看不到任何输入。4 是最高具体级别。
  • visualizer:如果将此设置为 tensorboard,则可在 TensorBoard 上监控训练进度以进行神经网络训练。

输入:

Beginning AutoGluon training ...
AutoGluon will save models to otto_models/
Train Data Rows: 61878
Train Data Columns: 94
Preprocessing data ...
Here are the first 10 unique label values in your data: ['Class_1' 'Class_2' 'Class_3' 'Class_4' 'Class_5' 'Class_6' 'Class_7'
 'Class_8' 'Class_9']
AutoGluon infers your prediction problem is: multiclass (because dtype of label-column == object)
If this is wrong, please specify `problem_type` argument in fit() instead (You may specify problem_type as one of: ['binary', 'multiclass', 'regression'])Feature Generator processed 61878 data points with 93 features
Original Features:
 int features: 93
Generated Features:
 int features: 0
All Features:
 int features: 93
 Data preprocessing and feature engineering runtime = 0.36s ...
AutoGluon will gauge predictive performance using evaluation metric: log_loss
This metric expects predicted probabilities rather than predicted class labels, so you'll need to use predict_proba() instead of predict()
To change this, specify the eval_metric argument of fit()
AutoGluon will early stop models using evaluation metric: log_loss
/home/ubuntu/anaconda3/envs/autogluon/lib/python3.7/imp.py:342: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working
 return _load(spec)
Fitting model: RandomForestClassifierGini_STACKER_l0 ...
 -0.5691 = Validation log_loss score
 27.63s = Training runtime
 0.03s = Validation runtime
…
…

咱们能够应用 TensorBoard 监控神经网络训练性能。装置 TensorBoard 并运行:

tensorboard —logdir otto_models/models/

随后用浏览器拜访 http://0.0.0.0:6006/。

第 4 步:获取拟合摘要

results = predictor.fit_summary() # display detailed summary of fit() process

输入:

*** Summary of fit() ***
Number of models trained: 22
Types of models trained: 
{'WeightedEnsembleModel', 'StackerEnsembleModel'}
Validation performance of individual models: {'RandomForestClassifierGini_STACKER_l0': -0.5691089791208548,...}
Best model (based on validation performance): weighted_ensemble_k0_l2
Hyperparameter-tuning used: False
Bagging used: True (with 10 folds)
Stack-ensembling used: True (with 1 levels)
User-specified hyperparameters:
{'NN': {'num_epochs': 500, 'visualizer': 'tensorboard'}, 'GBM': {'num_boost_round': 10000}, ...}
Plot summary of models saved to file: SummaryOfModels.html
*** End of fit() summary ***

要比拟集成中的所有模型,请调用 leaderboard():

lboard = predictor.leaderboard()
lboard.sort_values(by='score_val', ascending=False)

输入:

第 5 步:加载测试数据集并进行预测

dataset = 'dataset'
test_data_full = task.Dataset(file_path=f'{dataset}/test.csv')
test_data = test_data_full.drop('id', axis=1)
pred_probablities = predictor.predict_proba(test_data, as_pandas=True)

第 6 步:将后果提交给 Kaggle

submission_name = 'autogluon-submission.csv'
pred_probablities.to_csv(submission_name,index=False)
 
!kaggle competitions submit otto-group-product-classification-challenge -f {submission_name} -m "autogluon {submission_name}"

返回较量页面,随后应该会看到分数。本例中收到的分数是 0.40708,在 3,511 个提交中排名第 32 位,处于所有提交前 1% 之外。
无关如何在其余 Kaggle 较量中应用 AutoGluon 的阐明,请查看 AutoGluon 文档“如何在 Kaggle 较量中应用 AutoGluon”中的教程。


论断

本文介绍了 AutoGluon 和 AutoGluon-Tabular,并解释了如何应用它来减速数据迷信我的项目。如果想理解无关 AutoGluon-Tabular 的更多信息,以及如何在风行的 AutoML 和 Kaggle 基准测试中运行,如何与其余 AutoML 解决方案进行比拟的详细信息,请浏览 AutoGluon-Tabular 白皮书“AutoGluon-Tabular:实用于结构化数据持重而准确的 AutoML”。

AutoGluon 目前正踊跃承受 AutoGluon 我的项目的代码奉献。如果有趣味为 AutoGluon 做出奉献,请拜访 GitHub 上的奉献页面以获取更多信息。

正文完
 0