【问题标题】:Spark achieve parallel Cross Validation for Scala apiSpark实现Scala api的并行交叉验证
【发布时间】:2017-05-19 15:52:19
【问题描述】:

Pyspark 提供了通过https://github.com/databricks/spark-sklearn 并行化模型交叉验证的绝佳可能性 作为 sklearn 的 GridSearchCV 的简单替换

from spark_sklearn import GridSearchCV

我怎样才能为 Spark 的 Scala CrossValidator 实现类似的功能,即并行化每个折叠?

【问题讨论】:

    标签: scala apache-spark cross-validation apache-spark-ml


    【解决方案1】:

    从火花 2.3 开始:

    您可以使用 setParallelism(n) 方法和 CrossValidator 或在创建时完成此操作。即:

    cv.setParallelism(2) 
    

    cv = CrossValidator(estimator=lr, estimatorParamMaps=grid, evaluator=evaluator, \ 
                        parallelism=2)  // Evaluate up to 2 parameter settings in parallel
    

    在火花 2.3 之前:

    你不能在 Spark Scala 中做到这一点。您无法在 Scala Spark 中并行化交叉验证。

    如果您已经阅读了spark-sklearn 的文档,GridSearchCV 是并行化的,但模型训练不是。因此,这在规模上是无用的。此外,由于著名的SPARK-5063,您可以并行化 Spark Scala API 的交叉验证:

    RDD 转换和动作只能由驱动程序调用,不能在其他转换内部调用;例如,rdd1.map(x => rdd2.values.count() * x) 无效,因为值转换和计数操作无法在 rdd1.map 转换内部执行。有关详细信息,请参阅 SPARK-5063。

    摘自README.md

    此软件包包含一些工具,可将 Spark 计算框架与流行的 scikit-learn 机器库集成。在其他工具中:

    并行训练和评估多个 scikit-learn 模型。它是 scikit-learn 中默认包含的多核实现的分布式模拟。 将 Spark 的 Dataframes 无缝转换为 numpy ndarrays 或稀疏矩阵。 (实验)将 Scipy 的稀疏矩阵分发为稀疏向量的数据集。 它侧重于具有少量数据且可以并行运行的问题。

    对于小型数据集,它使用 Spark 分配对估计器参数(scikit-learn 中的 GridSearchCV)的搜索, 对于不适合内存的数据集,我们建议使用 Spark MLlib 中的分布式实现。

    注意:这个包分发简单的任务,如网格搜索交叉验证。它不分发单个学习算法(与 Spark MLlib 不同)。

    【讨论】:

    • 您的意思是并行评估不同的参数集,每组按顺序使用交叉验证?到目前为止CrossValidator 似乎只按顺序测试参数组合。那里如何启用并行性?
    • 是的,我就是这个意思。并行性只能在一个级别上启用:模型选择或模型训练,而不是两者兼而有之。
    • 默认 spark CrossValidator 将与 ML 一起分配模型,但不分配参数选择。能不能切换到这么类似的模式?
    • 我没听懂你的最后一个问题。
    • 最新版本的spark对这个功能有一些支持。
    猜你喜欢
    • 2020-05-30
    • 2016-10-21
    • 2016-06-23
    • 2016-12-15
    • 1970-01-01
    • 2017-05-04
    • 2019-11-16
    • 2016-11-15
    • 2013-10-10
    相关资源
    最近更新 更多