我正在使用sklearn的randomforestclassifier预测一组类。我有26000多个类,因此分类器的大小超过30 GB。我在具有64 GB RAM和20 GB存储空间的Linux上运行它。
我正在尝试通过使用joblib来腌制我的模型,但是由于我没有足够的辅助存储(我想),它无法正常工作。有什么办法可以做到这一点?也许是某种压缩技术还是其他?
答案 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)