将Scikit-Learn与Pyspark集成

8
我正在探索Pyspark和将Scikit-learn与Pyspark集成的可能性。我想使用Scikit-learn在每个分区上训练模型。这意味着当我的RDD被定义并分布在不同的工作节点之间时,我想在每个工作节点上的每个分区上使用Scikit-learn训练一个模型(比如一个简单的K-means)。由于Scikit-learn算法需要一个Pandas数据帧,我的初始想法是为每个分区调用toPandas,然后训练我的模型。但是,toPandas函数会将DataFrame收集到Driver中,这不是我想要的。有没有其他方法实现这样的目标?

1
我不明白为什么要在每个分区上计算一个模型,这与问题的相关性是什么?实际操作中,你是如何组装模型的? - eliasah
1
还是不太合理。那些质心是在考虑了特定的向量空间后进行训练的。你不能只是拿它们来做平均或其他操作。 - eliasah
1
如果你想使用Kmeans,为什么不直接使用Spark的实现呢? - eliasah
我同意这不是最好的解决方案,但这样做的主要原因是看看如何将scikit-learn与pyspark集成。因此,我不是在寻找最佳群集。 话虽如此,您认为我们可以以某种方式使用k-means(或任何其他聚类或分类)吗?也就是说,如何将每个分区转换为类似于数组的结构? - HHH
1
这个问题变得相当广泛了。首先,你不能以那种方式将scikit-learn与spark集成。其次,不,你仍然不能以那种方式使用聚类方法,这没有任何意义。我不会回答第三个问题,因为类似数组的结构可以是RDD,也可以是任何东西,所以那也没有任何意义。 - eliasah
显示剩余3条评论
3个回答

9
目前为止,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中支持吗? - HHH
据我上次检查,这个库仅支持分布式网格搜索。现在看来情况仍然如此。不幸的是,分发算法并不是一种即插即用的方式,否则就会非常容易。除非sklearn直接在spark上实现这些算法,否则很难轻松集成。 - eliasah
在笔记本电脑上怎么样?假设我们要在Colab上集成Sklearn和PySpark,这可行吗? - Memphis Meng

0

不,scikit learn 不能与 pyspark 兼容,原因是 scikit learn 是一个只能在单个计算机上运行的软件包,而 Spark 是一个分布式环境。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接