想问问各位从事数据科学工做的小伙伴:你以为,机器学习最难的点是什么?html
「不知道什么时候能完成!!」恐怕不少人都会对这一点深有体会。python
假设要用机器学习解决一个问题,首先,咱们须要构建数据集,接着构想如何解决问题。然而最痛苦的地方在于,花费大量时间以后,咱们彻底不知道本身的方案是否可行!git
机器学习的流程之因此如此艰难,部分缘由在于,这个领域存在许多经验丰富的从业者才知道的最佳实践。对于数据科学领域的新手,咱们可能会花费大量时间践行一种自认为正确的方法,但实际上那些专家从业者可能一开始就会知道,咱们选择的方法是行不通的……github
但若是那些专家们能够将这些最佳实践编纂成一个简单易用的软件包,供全部开发人员使用,结果会怎么样?设想一下:一个能够自动准备数据集,尝试不一样机器学习方法,并将结果组合在一块儿以提供高质量模型的库,而且全部这些功能只须要几行代码就能实现。激动吗?算法
上述设想实际上就是自动化机器学习(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.06505ubuntu
下文的上半部分,将介绍 AutoGluon-Tabular,并总结该论文中介绍的关键创新以及使用 AutoGluon-Tabular 在幕后发生的神奇操做。下半部分将介绍一个端到端代码示例,展现如何使用 AutoGluon-Tabular 凭借几行代码在数据科学竞赛中得到排名前1%的分数,且无需机器学习经验。
若是想快速入门并开始学习本示例,请转到“在下一次数据科学竞赛中抢占先机”部分。演示用的 Jupyter 笔记本可在 GitHub 上得到。api
虽然图像和视频领域的机器学习应用程序引发了极大的关注,但人们几十年来一直在将统计技术应用于表格数据(例如电子表格或数据库中的行和列),以构建预测模型或收集汇总统计数据。大量数据科学问题属于这一类别,例如,基于库存和需求数据的销售预测、交易数据的欺诈检测以及根据用户偏好生成产品建议。浏览器
本文将重点介绍 AutoGluon 处理表格数据的功能的子集,咱们将其称为AutoGluon-Tabular。
AutoGluon-Tabular 让咱们能够经过用户友好型 API 访问专家数据科学家使用的全部最佳实践,其设计采用如下主要原则:
若是你已是一名数据科学专家从业者,而且想知道 AutoGluon-Tabular 对本身是否有用,答案是确定的!即便对于专家来讲,AutoGluon-Tabular 也能够经过自动执行耗时的手动步骤来节省时间,例如处理丢失的数据、手动功能转换、数据拆分、模型选择、算法选择、超参数选择和调整、集成多个模型,以及在数据更改时重复此过程。
AutoGluon-Tabular 还包括用于多层堆叠集成的新技术,可显著提升模型的准确性。因为 AutoGluon 彻底开源,具备透明度和可扩展性,所以咱们能够全面了解它在流程的每一个阶段所作的工做,甚至引入本身的算法并将它们与 AutoGluon 一块儿使用。
AutoGluon-Tabular 用户只需知道如何使用三个 Python 函数:Dataset()
、fit()
和 predict()
。虽然这些 API 很简洁,但实际上在幕后有不少操做,AutoGluon-Tabular 能够借此为咱们提供高质量模型。下一节将详细介绍这些函数,并讨论它们的不一样之处。
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
对于 pandas 用户,能够轻松使用 Dataset 函数,并得到相似 pandas 的体验,这样就能够执行一些操做,如删除变量或加入多个数据集。因为 AutoGluon-Tabular 自动管理数据预处理,所以咱们不须要进行任何数据操做。
data = task.Dataset(DATASET_PATH)
fit()
函数执行全部繁重的工做,咱们将在下一节中介绍这一点。此函数有两大任务:研究数据集,而后为训练作准备,它适合多个模型,并将它们组合在一块儿以生成高精度模型。
predictor = task.fit(data_train, label=LABEL_COLUMN_NAME)
predict
函数经过新数据生成预测。预测可能致使预测类别和几率的分类问题,或连续值的回归问题。运行 fit() 函数时,将生成多个模型并保存到磁盘中。若是在之后从新访问它们,只需使用 load 命令加载预测器并使用它运行预测便可。
prediction = predictor.predict(new_data)
将数据集传递给 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 目前支持如下算法,若是没有时间限制,能够对全部这些算法进行训练:
在数据科学界有一种常见误解,即深度学习方法不能很好地处理表格数据。之因此产生这种想法是由于:在神经网络中引入了卷积,以便经过权值共享实现平移不变性。此方法对于一维信号、二维或者三维图像或视频数据集很是有效,由于这些数据集中的每一个信号采样或像素值自己的预测能力很低。在许多表格数据集应用程序中,每一个特征都具备独特的重要性,而且比图像中的单个像素具备更高的预测能力。在这些状况下,前馈或卷积神经网络架构的性能每每低于基于决策树的同类架构。
为了解决这些问题,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 引入了一种新型的多层堆叠集成,如上图所示。下面介绍了其工做原理:
为确保每一个分类器都能看到整个数据集,AutoGluon-Tabular 执行 k -折交叉验证。为了进一步提升预测准确度和减小过拟合,AutoGluon-Tabular 将对 n 个不一样的随机输入数据分区重复执行 n 次 k - 折交叉验证。数字 n 的选择方法是,在调用 fit() 函数时,估计在指定的时间限制内能够完成多少次循环。
在生活和数据科学中,事情可能不会按计划进行。当使用 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 API GitHub 页面上的说明下载 Kaggle CLI。借助 CLI,咱们能够轻松下载数据集并以编程方式提交预测结果,而无需离开 Jupyter 笔记本。
按照 AutoGluon 网页上的说明安装 AutoGluon。在大多数状况下,咱们应该可使用 pip 进行安装。
如下步骤来自 GitHub 上托管的 otto-kaggle-example.ipynb Jupyter 笔记本。让咱们详细看看每一个步骤。
此步骤假设已安装 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
在此步骤中,咱们导入一个 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
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,其他参数是可选的。在此示例中还指定了如下选项:
输出:
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/。
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)
输出:
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)
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 上的贡献页面以获取更多信息。