作者 | Evan Harris
译者 | Monanfei
编辑 | Jane 
出品 | AI科技大本营(ID:rgznai100)

【导语】这篇文章为大家介绍了一个开源项目——sk-dist。在一台没有并行化的单机上进行超参数调优,需要 7.2 分钟,而在一百多个核心的 Spark 群集上用它进行超参数调优,只需要 3.4 秒,把训练 sk-learn 的速度提升了 100 倍。

sk-dist 简介
sk-dist 是一个开源项目,它使用 Spark 来分发 scikit-learn 元估计器。常见的元估计器有决策树(随机森林和其他的随机树),超参数调优器(格网搜索和随机搜索),以及多类别处理技术(一对多和一对一)。
sk-dist 的主要动机是填补传统机器学习在模型分布式训练上的空白。除去神经网络和深度学习,我们发现在单个数据集上训练单个模型并不怎么花时间,反而当我们使用元估计器(例如网格搜索或集合等),在数据集的多次迭代上训练模型的多次迭代花费了大量时间。
使用 sk-dist 的例子
以手写数字数据集为例,我们事先对图像进行了编码,以便于进行适当的分类。我们可以在一台机器上飞速的训练一个支持向量机,数据集有1797 条记录,整个训练过程不到 1 秒钟。但是,超参数调整却需要在训练集的不同子集上进行大量的训练工作。
如下图所示,我们构建了一个参数网格,本次超参数调优总共需要 1050 个训练任务。在具有一百多个核心的 Spark 群集上使用 sk-dist 进行超参数调优,我们只需要 3.4 秒,而在一台没有并行化的单机上进行超参数调优,却需要 7.2 分钟。
import time
from sklearn import datasets, svm
from skdist.distribute.search import DistGridSearchCV
from pyspark.sql import SparkSession
# instantiate spark session
spark = (  SparkSession    .builder    .getOrCreate()  )
sc = spark.sparkContext
# the digits dataset
digits = datasets.load_digits()
X = digits["data"]
y = digits["target"]
# create a classifier: a support vector classifier
classifier = svm.SVC()
param_grid = { "C": [0.01, 0.01, 0.1, 1.0, 10.0, 20.0, 50.0],    "gamma": ["scale", "auto", 0.001, 0.01, 0.1], "kernel": ["rbf", "poly", "sigmoid"]    }
scoring = "f1_weighted"
cv = 10
# hyperparameter optimization
start = time.time()
model = DistGridSearchCV(  classifier, param_grid, sc=sc, cv=cv, scoring=scoring,   verbose=True   )
model.fit(X,y)
print("Train time: {0}".format(time.time() - start))
print("Best score: {0}".format(model.best_score_))
------------------------------
Spark context found; running with spark
Fitting 10 folds for each of 105 candidates, totalling 1050 fits
Train time: 3.380601406097412
Best score: 0.981450024203508
上例展示了一个常见的超参数调优场景:首先将数据拟合到内存中,然后再去训练单个分类器。但是,超参数调优所需的拟合任务数很快就会增加。下图展示了使用 sk-dist 运行格网搜索的流程:
对于 Ibotta 传统机器学习的实际应用,我们经常发现自己处于以下类似情况:使用多个简单的分类器对中小型数据(100k~1M)进行多次迭代,企图解决超参数调优、集合模型和多类别问题。
目前的解决方案
现在,分布式的传统机器学习元估计训练有两个主流解决方案。第一个,也是最简单的一个:使用 joblib 实现 scikit-learn 内置元估计器的并行化。这和 sk-dist 非常相似,但是该方法却存在一个很大的限因素:处理性能受到单机资源的限制。即使在一台具有数百个内核的机器上实行并行化,它的性能与使用 spark 的 sk-dist 相比,也要逊色许多。这是因为 Spark 具有执行器的精细内存规范,优秀的容错能力,以及成本控制选项,例如为工作节点使用专门的实例。
另一个现存的解决方案是 Spark ML。它是Spark的本地机器学习库,支持许多与 scikit-learn 相同的算法,用于分类和回归问题。它还具有树集合和网格搜索等元估计,以及对多类别问题的支持。虽然这听起来很完美,似乎能够解决分布式 scikit-learn 机器学习问题,但是它并不能用我们感兴趣的并行方式进行训练。
如上图所示,Spark ML 将针对分布在许多执行程序上的数据训练单个模型。当数据量很大,并且不适合单机内存时,该方法很有效。但是,当数据很小时,scikit-learn 可能在单机上表现欠佳。此外,当训练随机森林模型时,Spark ML 会按顺序训练每个决策树。无论分配给任务的资源有多大,该任务的挂起时间都将与决策树的数量成线性比例。
对于网格搜索,Spark ML 采用了并行参数,该参数将并行训练单个模型。但是,每个单独的模型仍在跨执行器的分布数据上进行训练。如果纯粹沿着模型的维度而不是数据的分布,那么任务的总并行性能只能发挥一小部分。
因此,我们希望有一个新的解决方案,将我们的数据分布在与 Spark ML不同的维度上。当我们使用小型或中型数据时,将数据拟合到内存中将不再是问题。在随机森林的例子中,我们希望将训练数据完整地派送给每个执行器,在每个执行器上拟合一个独立的决策树,并将那些拟合好的决策树收回,从而集成随机森林。通过沿着该维度实行并行化,执行速度可以比串行分发数据和训练决策树快几个数量级。网格搜索和多类别等其他元估计技术也应该采用这种类似的并行方式。
sk-dist 的特点
鉴于这些现有解决方案的局限性,sk-dist 应时而生。sk-dist 最重要的是分发模型,而不是数据。
尽管 sk-dist 主要关注元估计器的分布式训练,d但它还包括使用 Spark 进行 scikit-learn 模型分布式预测的模块、几个无需使用 Spark 的前/后处理 scikit-learn 变换器、以及使用或不使用Spark 的灵活的特征编码器。
  • 分布式训练:使用 Spark 分发元估计器训练。支持以下算法:使用网格搜索和随机搜索的超参数调优,使用随机森林的树集成,其他树和随机树嵌入,以及一对多、一对一的多类别问题策略。
  • 分布式预测:使用 Spark DataFrames 分配拟合后的 scikit-learn 估计器进行预测。通过便携式的 scikit-learn 估计器,该方法使得大尺度的分布式预测成为可能。这些估计器可以与 Spark 一起使用,也可以不与 Spark 一起使用。
  • 特征编码:使用 Encoderizer 对特征进行灵活编码。 Encoderizer 可以使用或不使用Spark 并行化。它将推断数据类型和形状,自动选择并应用最佳的默认特征变换器,对数据进行编码。作为一个完全可定制的特征联合编码器,它还具有使用 Spark 进行分布式变换的附加优势。
sk-dist 的适用情形
并非所有的机器学习问题都适合使用 sk-dist,以下是决定是否使用 sk-dist 的一些指导原则:
  • 传统的机器学习: 广义线性模型,随机梯度下降,最近邻,决策树和朴素贝叶斯等方法与 sk-dist 配合良好。这些模型都已在 scikit-learn 中集成,用户可以使用 sk-dist 元估计器直接实现。
  • 中小型数据:大数据无法与 sk-dist 一起使用。值得注意的是,训练分布的维度是沿着模型的轴,而不是数据。数据不仅需要适合每个执行器的内存,还要小到可以广播。根据 Spark 的配置,最大广播量可能会受到限制。
  • Spark 的使用:sk-dist 的核心功能需要运行Spark。对于个人或小型数据科学团队而言,从经济上来讲可能并不可行。此外,为了以经济有效的方式充分利用 sk-dist,需要对 Spark 进行一些调整和配置,这要求使用者具备一些 Spark 的基础知识。
值得引起注意的是,虽然神经网络和深度学习在技术上可以与 sk-dist 一起使用,但这些技术需要大量的训练数据,有时需要专门的硬件设施才能工作。深度学习不是 sk-dist 的目标,因为它违反了上面的(1)和(2)。作为替代技术, Amazon SageMaker 可以配合神经网络或深度学习进行使用。
原文:
https://medium.com/building-ibotta/train-sklearn-100x-faster-bec530fc1f45
(*本文为AI科技大本营原创文章,转载请联系微信 1092722531)
推荐阅读

六大主题报告,四大技术专题,AI开发者大会首日精华内容全回顾

AI ProCon圆满落幕,五大技术专场精彩瞬间不容错过

CSDN“2019 优秀AI、IoT应用案例TOP 30+”正式发布

如何打造高质量的机器学习数据集?

从模型到应用,一文读懂因子分解机

用Python爬取淘宝2000款套套

7段代码带你玩转Python条件语句

高级软件工程师教会小白的那些事!

谁说 C++ 的强制类型转换很难懂?

你点的每个“在看”,我都认真当成了喜欢

开源sk-dist,超参数调优仅需3.4秒,sk-learn训练速度提升100倍相关推荐

  1. 超参数调优河伯、组合优化器CompBO,华为诺亚开源贝叶斯优化库

    视学算法报道 编辑:陈萍.杜伟 华为诺亚开源了一个贝叶斯优化的库,该库包含三个部分:河伯.T-LBO.CompBO. 贝叶斯优化可以说是一种黑盒优化算法,该算法用于求解表达式未知函数的极值问题.因其具 ...

  2. 华为诺亚开源贝叶斯优化库:超参数调优河伯、组合优化器CompBO

    ©作者 | 陈萍.杜伟 来源 | 机器之心 华为诺亚开源了一个贝叶斯优化的库,该库包含三个部分:河伯.T-LBO.CompBO. 贝叶斯优化可以说是一种黑盒优化算法,该算法用于求解表达式未知函数的极值 ...

  3. 机器学习模型评估与超参数调优详解

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:李祖贤  深圳大学,Datawhale高校群成员 机器学习分为两类 ...

  4. 一文详解超参数调优方法

    ©PaperWeekly 原创 · 作者|王东伟 单位|Cubiz 研究方向|深度学习 本文介绍超参数(hyperparameter)的调优方法. 神经网络模型的参数可以分为两类: 模型参数,在训练中 ...

  5. 深度学习-超参数调优

    在机器学习中有很多调优的方式机器学习--超参数调优,深度学习中也存在同样的方式,接下来,介绍一下深度学习框架里边的自动调参模块. 1. 基于Tensorflow的Keras tuner 官方教程如下: ...

  6. python代码设置超参数_超参数调优总结,贝叶斯优化Python代码示例

    本文介绍超参数(hyperparameter)的调优方法. 神经网络模型的参数可以分为两类,模型参数,在训练中通过梯度下降算法更新: 超参数,在训练中一般是固定数值或者以预设规则变化,比如批大小(ba ...

  7. 深度神经网络之Keras(三)——正则化、超参数调优和学习方向

    深度神经网络之Keras(三)--正则化.超参数调优和学习方向 本文将继续探索Keras框架下的深度神经网络知识,主要介绍了利用Keras构建的深度神经网络正则化及超参数调优问题. 目录 深度神经网络 ...

  8. 贝叶斯优化: 一种更好的超参数调优方式

    简介 本文受 浅析 Hinton 最近提出的 Capsule 计划 启发,希望以更通俗的方式推广机器学习算法,让有数学基础和编程能力的人能够乐享其中. 目前人工智能和深度学习越趋普及,大家可以使用开源 ...

  9. tf.saved_model.save模型导出、TensorFlow Serving模型部署、TensorBoard中的HParams 超参数调优

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 4.11 综合案例:模型导出与部署 学习目标 目标 掌握Ten ...

最新文章

  1. 表达式树 java_表达树—构建表达式树、获取表达式(二)
  2. ubuntu20分区_「图」Canonical希望Ubuntu 20.04 LTS Server Installer更快更舒适
  3. 039_External Data Source(转载)
  4. SAP Spartacus delivery mode continue button enable与否的逻辑
  5. Educational Codeforces Round 107 (Rated for Div. 2)
  6. ElasticJob-分布式作业调度神器,你们还在用Quartz吗
  7. centos7安装java6_CentOS7.6安装jdk1.8
  8. Azure PowerShell (10) 使用PowerShell导出订阅下所有的Azure VM和Cloud Service的高可用情况...
  9. 音视频基础之YUV格式
  10. 得物购买截图生成_iPhone12订单生成器app-iPhone12订单生成器网页app免费版预约 v1.0...
  11. H3C设备忘记密码修改办法
  12. 浏览器点击链接打开指定APP详解
  13. 在Golang里如何实现结构体成员指针到结构体自身指针的转换
  14. mysql计算年龄_MySQL根据出生日期计算年龄的三种方法比较
  15. HTML中placeholder用法
  16. HDU 1713 相遇周期(求两个分数的最小公倍数)
  17. 银狐小贷风控系统引领行业最前端
  18. 无法启动计算机上rasman,无法启动Remote Access Auto connection Manager错误1068 依存服务或组无法启动...
  19. 六、创建Templates(模板)
  20. python计算协方差矩阵_用Python构建协方差矩阵

热门文章

  1. Jmeter组件执行顺序与作用域
  2. 选IDC房时,用脚本截取丢失包和rtt的值作比对
  3. java之php、Android、JAVA、C# 3DES加密解密
  4. 国内ITSM解决方案-UNIPER
  5. oracle取得表中总记录数最快的方法
  6. Windows2003服务器不支持FLV视频的解决方法
  7. android 显示yuv数据格式,YUV数据格式的理解
  8. 麦肯锡顾问的整体设计:从大局需要安排工作
  9. 术语1----边界吸收
  10. 机器学习实战源码数据集