【问题标题】:integrating scikit-learn with pyspark将 scikit-learn 与 pyspark 集成
【发布时间】:2023-03-09 11:51:02
【问题描述】:

我正在探索 pyspark 以及将 scikit-learn 与 pyspark 集成的可能性。我想使用 scikit-learn 在每个分区上训练一个模型。这意味着,当我的 RDD 被定义并分布在不同的工作节点之间时,我想使用 scikit-learn 并在每个工作节点上存在的每个分区上训练一个模型(比如说一个简单的 k-means)。由于 scikit-learn 算法采用 Pandas 数据帧,我最初的想法是为每个分区调用toPandas,然后训练我的模型。但是,toPandas 函数将 DataFrame 收集到驱动程序中,这不是我要寻找的东西。有没有其他方法可以实现这样的目标?

【问题讨论】:

  • 如果我能以某种方式将每个分区转换为数据帧到类似数组的结构,那是可能的,对吧?
  • 我看不出在每个分区上计算模型有什么关系。甚至是什么意思?在实践中,你如何组装模型?
  • 这仍然没有意义。考虑到某个向量空间对这些质心进行了训练。您不能只接受它们并执行平均左右。
  • 而如果你想使用Kmeans,为什么不直接使用spark的实现呢?
  • 这个问题越来越广泛。首先,您不能以这种方式将 scikit-learn 与 spark 集成。其次,不,您仍然不能以这种方式使用聚类方法,这没有任何意义。我不会回答第三个,因为类数组结构可以是 RDD,可以是任何东西,所以这也没有任何意义。

标签: apache-spark scikit-learn pyspark


【解决方案1】:

scikit-learn 目前还不能与 spark 完全集成,原因是 scikit-learn 算法没有实现分布式,因为它只在一台机器上工作。

不过,您可以在 spark-sklearn 中找到现成的 Spark - Scikit 集成工具,支持(暂时)在 Spark 上执行 GridSearch 以进行交叉验证。

编辑

截至 2020 年,spark-sklearn 已弃用,joblib-spark 是推荐的继任者。根据文档,您可以像这样轻松地将交叉验证分发到 Spark 集群:

from sklearn.utils import parallel_backend
from sklearn.model_selection import cross_val_score
from sklearn import datasets
from sklearn import svm
from joblibspark import register_spark

register_spark() # register spark backend

iris = datasets.load_iris()
clf = svm.SVC(kernel='linear', C=1)
with parallel_backend('spark', n_jobs=3):
  scores = cross_val_score(clf, iris.data, iris.target, cv=5)

print(scores)

GridSearchCV 可以以同样的方式分发。

【讨论】:

  • 如果我想执行任意模型怎么办?假设在每个分区上运行一个 kmeans。 spark-sklearn 支持吗?
  • 我上次检查时,这个库只支持分布式网格搜索。现在看来仍然如此。不幸的是,分发算法不仅仅是即插即用,否则它会非常容易。除非 sklearn 直接在 spark 上实现这些算法,否则不可能如此简单地集成。
  • 在笔记本上怎么样?假设我们将在 Colab 上集成 Sklearn 和 PySpark。有可能吗?
【解决方案2】:

不,scikit learn 不能与 pyspark 一起使用,因为 scikit learn 是一个可以在单个计算机上工作的包,而 spark 是一个分布式环境。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-06
    • 2022-09-29
    • 2018-11-01
    • 1970-01-01
    • 2022-08-11
    • 2015-05-22
    • 1970-01-01
    • 2015-10-25
    相关资源
    最近更新 更多