在spark中分发scikit学习分类器的推荐方法是什么?



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

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

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

这个可以工作,但是pickle很大(大约0.5GB),并且看起来非常低效。

有更好的方法吗?

这个可以工作,但是pickle很大(大约0.5GB)

注意表示森林的大小为O(M*N*Log(N)),其中M为树的个数,N为样本的个数。(源)

有更好的方法吗?

您可以尝试以下几个选项来减小RandomForestClassifier模型或序列化文件的大小:

  • 通过优化超参数来减小模型的大小,特别是max_depth, max_leaf_nodes, min_samples_split,因为这些参数影响集合中使用的树的大小

  • 压缩pickle,例如如下所示。注意,有几个选项,其中一个可能更适合您,所以您需要尝试:

    with gzip.open('classifier.pickle', 'wb') as f:
        pickle.dump(clf, f)
    
  • 使用joblib而不是pickle,它可以更好地压缩,也是推荐的方法。

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

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

  • 最后但并非最不重要的是,您还可以尝试通过降维来减少输入的大小,然后使用RandomTreeClassifier进行拟合/预测,就像在决策树的实用技巧中提到的那样。

YMMV

相关内容

  • 没有找到相关文章

最新更新