我已经使用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