我使用scikit learn构建了一个分类器,现在我想使用spark在大型数据集上运行predict_proba。我目前使用以下方法挑选分类器:
import pickle
pickle.dump(clf, open('classifier.pickle', 'wb'))
然后在我的火花代码中,我使用sc.broadcast播放这个pickle,用于我的spark代码,它必须在每个群集节点加载它。
这样可行,但泡菜很大(约0.5GB),看起来非常低效。
有更好的方法吗?
答案 0 :(得分:3)
这可行,但泡菜很大(约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