如何序列化大型randomforest分类器

时间:2018-09-21 09:52:43

标签: python scikit-learn pickle random-forest joblib

我正在使用sklearn的randomforestclassifier预测一组类。我有26000多个类,因此分类器的大小超过30 GB。我在具有64 GB RAM和20 GB存储空间的Linux上运行它。

我正在尝试通过使用joblib来腌制我的模型,但是由于我没有足够的辅助存储(我想),它无法正常工作。有什么办法可以做到这一点?也许是某种压缩技术还是其他?

2 个答案:

答案 0 :(得分:0)

您可以尝试将泡菜gzip压缩

compressed_pickle = StringIO.StringIO()
with gzip.GzipFile(fileobj=compressed_pickle, mode='w') as f:
    f.write(pickle.dumps(classifier))

然后您可以将compressed_pickle写入文件。

要读回去:

with open('rf_classifier.pickle', 'rb') as f:
    compressed_pickle  = f.read()
rf_classifier = pickle.loads(zlib.decompress(compressed_pickle, 16 + zlib.MAX_WBITS))

编辑

看来3.4之前的Python版本对序列化对象的大小有4GB的硬限制。 pickle协议的最新版本(4.0版)没有此限制,只需指定协议版本即可:

pickle.dumps(obj, protocol=4)

对于旧版本的Python,请参考以下答案: _pickle in python3 doesn't work for large data saving

答案 1 :(得分:0)

一种可能的解决方法是将各个树转储到一个文件夹中:

path = '/folder/tree_{}'
import _pickle as cPickle
i = 0
for tree in model.estimators_:
    with open(path.format(i), 'wb') as f:
        cPickle.dump(tree, f)
    i+=1
   

在 sklearn 的随机森林实现中,属性“estimators_”是一个包含单个树的列表。您可以考虑将所有树单独序列化到一个文件夹中。

要生成预测,您可以平均树的预测

# load the trees
path = '/folder/tree_{}'
import _pickle as cPickle
trees = []
i = 0
for i in range(num_trees):
    with open(path.format(i), 'rb') as f:
        trees.append(cPickle.load(f))
    i+=1
# generate predictions
predictions = []
for tree in trees:
    predictions.append(tree.predict(X))
predictions = np.asarray(predictions).T

# average predictions as in a RF
y_pred = predictions.mean(axis=0)