首页 今日头条正文

石原里美,将sklearn练习速度提高100多倍,美国「返利网」开源sk-dist结构,沈梦辰

选自Medium

作者:Evan Harris

参加:高璇、张倩

在本文中,Ibotta(美国版「返利网」)机器学习和数据科学司理 Evan Harris 介绍了他们的开源项目 sk-dist。这是一个分配 scikit-learn 元估量器的 Spark 通用结构,它结合了 Spark 和 scikit-learn 中的元素,能够将 sklearn 的操练速度进步 100 多倍。

在本文中,Ibotta(美国版「返高怀义利网」)机器学习和数据科学司理 Eva李丙溪n Harris 介绍了他们的开源项目 sk-dist。这是一个分配 scikit-learn 元估量器的 Spark 通用结构,它结合了 Spark 和 scikit-learn 中的元素,能够将 sklearn 的操练速度进步 100 多倍。

在 Ibotta,咱们操练了许多机器学习模型。这些模型为咱们的引荐体系、查找引擎、定价优化引擎、数据质量等供给了支撑,在与咱们的移动 app 互动的一同为数百万用户做出猜测。

尽管咱们运用 Spark 进行很多的数据处理,但咱们首选的机器学习结构是 scikit-learn。跟着核算本钱越来越低以及机器学习处理方案的上市时刻越来越重要,咱们现已踏出了加快模型操练的一步。其间一个处理方案是将 Spark 和 scikit-learn 中的元素组合,变成咱们自己的交融处理方案。

查韦斯遗体
  • 项目地址:https://github.com/Ibotta/sk-dist

何为 sk-dist

咱们很快乐推出咱们的开源项目 sk-dist。该项意图方针是供给一个分配 scikit-learn 元估量器的 Spark 通用结构。元估量器的运用包含决策树集戴瑛瑛合(随机森林和 extra randomized trees)、超参数调优(网格查找和随机查找)和多类技能(一对多和一对一)。

咱们的首要意图是添补传统机器学习模型散布挑选空间的空白。在神经网络和深度学习的空间之外,咱们发现操练模型的大部分核算时刻并未花在单个数据集上的单个模型操练上,而是花在用网格查找或集成等元估量器在数据集的屡次迭代中操练模型的屡次迭代上。

实例

以手写数字数据集为例。咱们编码了手写数字的图画以便于分类。咱们能够运用一台机器在有 1797 条记载的数据集上快速操练一个支撑向量机,只需不到一秒。可是,超参数调优需求在操练数据的不同子集上进行很多操练。

如下图所示,咱们现已构建了一个参数网格,一共需求 1050 个操练项。在一个具有 100 多个中心的 Spark 集群上运用 sk-dist 仅需 3.4 秒。这项作业的总使命时刻是 7.2 分钟,这意味着在石原里美,将sklearn操练速度进步100多倍,美国「返利网」开源sk-dist结构,沈梦辰一台没有并行化的机器上操练需求这么长的时刻。

import动态性timefrom sklearn importdatasets, svm

fromskdist.distribute.search importDistGridSearchCV

frompyspark.sql importSparkSession # instantiate spark session

spark = (

SparkSession

.人畜杂交builder

.getOrCreate

)

sc = spark.sparkContext

# the digits dataset

digits = data石原里美,将sklearn操练速度进步100多倍,美国「返利网」开源sk-dist结构,沈梦辰sets.load_digits

X = digits[ "data石原里美,将sklearn操练速度进步100多倍,美国「返利网」开源sk-dist结构,沈梦辰"]

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", "a妈妈挺动uto", 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=sc任侠家新浪博客oring,

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; runnin石原里美,将sklearn操练速度进步100多倍,美国「返利网」开源sk-dist结构,沈梦辰g withspark

Fitting 10folds foreach of 105candidates, totalling 1050fits

Train time: 3.380601406097412

Best score: 0.981450024203508

该示例说明晰一个常见状况,其间将数据拟合到内存中并操练单个分类器并不重要,但超参数调整最原始的愿望txt所需的拟合数量很快就会添加。以下是运转网格查找问题的内涵机制,如上例中的 sk-dist:

运用 sk-dist 进行网格查找

关于 Ibotta 传统机器学习的实践运用,咱们常常发现自己处于相似状况:中小型数据(100k 到 1M 记载),其间包含屡次迭代的简略分类器,合适于超参数调优、调集和多类处理方案。

现有处理方案

关于传统机器学习元估量操练,现有处理方案是散布式的。第一个是最简略的:scikit-learn 运用 joblib 内置元估量器的并行化。这与 sk-dist 十分相似,除了一个首要约束要素:功用受限。即便关于具有数百个内核的理论单台机器,Spark 依然具有如执行器的内存调优规范、容错等长处,以及本钱操控选项,例如为作业节点运用 Spot 实例。

另一个现有的处理方案是 Spark ML。这是 Spark 的本机机器学习库,支撑许多与 scikit-learn 相同的算法,用于分类和回归问题。它还具有树调集和网格查找等元估量器,以及对多类问题的支撑。尽管这听起来或许是分配 scikit-learn 形式机器学习作业负载的飛俠神刀优异处理方案,但它的散布式操练并不能处理咱们感兴趣的并行性问题。

散布在不同维度

如上所示,Spark ML 将针对散布在多个执行器上的数据操练单个模型。当数据很大且无法将内存放在一台机器上时,这种办法十分有用。可是,当数据很小时,它在单台核算机上的体现或许还不如 scikit-learn。此外,当操练随机森林时,Spark ML 按次序操练性感写真集每个决策树。不管分配给使命的资源怎么,此使命的挂起时刻都将与决策树的数量成线性份额。

关于网格查找,Spark ML 的确完成了并行性参数,将并行操练单个模型。可是,每个独自的模型仍在对散布在执行器中的数据进行操练。假如依照模型的维度而非数据进行散布,那么使命的总并行度或许是它的一小部分。

终究,咱们期望将咱们的操练散布在与 Spark ML 不同的维度上。运用小型或中型数据时,将数据拟合到内存中不是问题。关于随机森林的比如,咱们期望将操练数据完好地播送给每个执行器,在每个执行器上拟合一个独立的决策树,并将那些拟合的决策树回来驱动程序以构建随机森林。沿着这个维度散布比串行散布数据和操练决策树快几个数量级。这种行为与网格查找和多类等其他元估量器技能相似。

特征

鉴于这些现有处理方案在咱们的问题空间中的局限性,咱们决议在内部开发 sk-dist。最重要的是咱们要「分配模型,而非数据」。

sk-dist 的重点是重视元估量器的散布式操练,还包含运用 Spark 进行 scikit-learn 模型散布式猜测的模块、用于无 Spark 的几个预处理/后处理的 scikit-learn 转换器以及用于有/无 Spark 的灵敏特征编码器。

散布式操练:运用 Spark 分配元估量器操练。支撑以下算法:超参数调优(网格查找和随机查找)、决策树调集(随机森林、额定随机树和随机树嵌入)以及多类技能(一对多和一对一)。

散布式猜测:运用 Spark DataFrames 散布拟合 scikit-learn 预算器的猜测办法。能够经过便携式 scikit-learn 估量器完成大规模散布式猜测,这些估量器能够运用或不运用 Spark。

特征编码:运用名为 Encoderizer 的灵敏特征转换器散布特征编码。它能够运用或不运用 Spark 并行化。它将揣度数据类型和形状,主动运用默许的特征转换器作吴金娃为规范特征编码技能的最佳猜测完成。它还能够作为彻底可定制的特征联合编码器运用,一同具有与 Spark 散布式转换器合作的附加优势。

用例

以下是判别 sk-dist 是否合适你的机器学习问题空间的一些辅导准则:

  1. 传统机器学习 :广义线性模型、随机挨揍受罚柳真真梯度下降、最近邻算法、决策树和朴素贝叶斯适用于 sk-石原里美,将sklearn操练速度进步100多倍,美国「返利网」开源sk-dist结构,沈梦辰dist。这些都可在 scikit-learn 中完成,能够运用 sk-dist 元估量器直接完成。
  2. 中小型数据 :大数据不适用于 sk-dist。请记住,操练散布的炮火小分队维度是沿着模型改变,而不是数据。数据不只需求合适每个执行器的内存,还要小到能够播送。依据 Spark 装备,最大播送巨细或许会受到约束。
  3. Spark 定位与拜访:sk-dist 的中心功用需求运转 Spark。关于个人或小型数据科学团队而言,这并不总是可行的。此外,为了运用 sk-dist 取得最大本钱效益,需求进行一些 Spark 调整和装备石原里美,将sklearn操练速度进步100多倍,美国「返利网」开源sk-dist结构,沈梦辰,这需求对 Spark 基础知识进行一些操练。

这儿一个重要的注意事项是,尽管神经网络和深度学习在技能上能够与 sk-dist 一同运用,但这些技能需求很多的操练数据,有时需求专门的基础设施才干有用。深度学习不是 sk-程开耀dist 的预期用例,由于它违反了上面的 (1) 和 (2)。在 Ibotta,咱们一直在运用 Amazon SageMaker 这些技能,咱们发现这些技能对这些作业负载的核算比运用 Spark 更有用。

原文地址:https://medium.com/building-ibotta/train-sklearn-100x-faster-bec530fc1f45

本文为机器之心编译,转载请联络本大众号取得授权。

苍猊吧
男配he档案
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。