【问题标题】:What is the recommended way to distribute a scikit learn classifier in spark?在 spark 中分发 scikit learn 分类器的推荐方法是什么?
【发布时间】:2017-02-01 23:36:29
【问题描述】:

我已经使用 scikit learn 构建了一个分类器,现在我想使用 spark 在大型数据集上运行 predict_proba。我目前使用一次腌制分类器:

import pickle
pickle.dump(clf, open('classifier.pickle', 'wb'))

然后在我的 spark 代码中,我使用 sc.broadcast 广播这个 pickle,以便在我的 spark 代码中使用,该代码必须在每个集群节点上加载它。

这可行,但泡菜很大(大约 0.5GB),而且效率似乎很低。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 你用的是哪个分类器?
  • @miraculixx RandomForestClassifer
  • 请查看我的答案以获得一些选项,您介意使用sc.broadcast 或一些指针分享您的方法吗?谢谢。

标签: apache-spark scikit-learn pyspark


【解决方案1】:

这可行,但泡菜很大(大约 0.5GB)

请注意,森林的大小将是O(M*N*Log(N)),其中 M 是树的数量,N 是样本的数量。 (source)

有没有更好的方法来做到这一点?

您可以尝试减少 RandomForestClassifier 模型或序列化文件的大小:

  • 将模型的大小减小optimizing hyperparameters,尤其是max_depth, max_leaf_nodes, min_samples_split,因为这些参数会影响集成中使用的树的大小

  • 压缩泡菜,例如如下。请注意有several options,其中一个可能更适合您,因此您需要尝试:

    with gzip.open('classifier.pickle', 'wb') as f:
        pickle.dump(clf, f)
    
  • 使用 joblib 代替 pickle,它压缩得更好,也是 recommended approach

     from sklearn.externals import joblib
        joblib.dump(clf, 'filename.pkl') 
    

    这里需要注意的是,joblib 会在一个目录中创建多个文件,因此您必须将它们压缩起来以便传输。

  • 最后但同样重要的是,您还可以尝试在使用 RandomTreeClassifier 拟合/预测之前通过降维来减小输入的大小,如决策树上的 practical tips 中所述。

YMMV

【讨论】:

  • 谢谢。关于joblib,它是保存单个文件还是整个文件集合?
  • 另外,对于 python 2 中的这个任务,是否推荐 cPickle 而非 pickle?
  • 查看我在 joblib 上的更新 - 是的,它保存了一组文件。您可以压缩它们以进行运输,但不确定解压缩如何与 sc.broadcast 一起使用(请参阅我对您问题的其他评论)
  • 感谢您的编辑。 python可以做joblib解决方案所需的压缩和解压吗?
猜你喜欢
  • 2019-06-09
  • 1970-01-01
  • 2019-06-21
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
  • 2015-05-09
  • 2014-02-25
相关资源
最近更新 更多