我已经使用 scikit learn 构建了一个分类器,现在我想使用 Spark 在大型数据集上运行 Predict_proba。我目前使用以下方法对分类器进行腌制:
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 是样本的数量。(source) https://github.com/scikit-learn/scikit-learn/issues/6276#issuecomment-179681036
有一个更好的方法吗?
您可以尝试使用多种选项来减小 RandomForestClassifier 模型或序列化文件的大小:
将模型的尺寸减小优化超参数 http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn-ensemble-randomforestclassifier, 尤其max_depth, max_leaf_nodes, min_samples_split
因为这些参数会影响集成中使用的树的大小
-
压缩泡菜,例如如下。注意有几种选择 https://stackoverflow.com/a/18475192/890242其中一种可能更适合您,因此您需要尝试:
with gzip.open('classifier.pickle', 'wb') as f:
pickle.dump(clf, f)
-
使用 joblib 代替 pickle,它压缩得更好,也是推荐方法 http://scikit-learn.org/stable/modules/model_persistence.html#persistence-example.
from sklearn.externals import joblib
joblib.dump(clf, 'filename.pkl')
这里需要注意的是,joblib 将在一个目录中创建多个文件,因此您必须将这些文件压缩以进行传输。
最后但并非最不重要的一点是,在使用 RandomTreeClassifier 进行拟合/预测之前,您还可以尝试通过降维来减小输入的大小,如实用技巧 http://scikit-learn.org/stable/modules/tree.html#tips-on-practical-use在决策树上。
YMMV
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)