保存到磁盘时随机森林的禁止大小

数据挖掘 Python 随机森林
2021-09-21 04:25:54

当使用 cPickle 保存到磁盘时:https ://stackoverflow.com/questions/20662023/save-python-random-forest-model-to-file ,我的随机森林为 6.57 GB。

with open('rforest.cpickle', 'wb') as f:
    cPickle.dump(rforest, f)

我想使用森林本身通过托管在 Heroku 上的 python API 进行预测——当然,文件大小是不可接受的。

为什么文件大小这么大?集合中有 500 棵树——我只想保存已完成的树本身,因为它们将用作预测。构成 500 棵树中的每一棵树的实际节点和边是否需要近 7 GB 的磁盘空间?

我使用了 scikitlearn 的 randomforestregressor:

def buildForest(self, X_train, y_train):
    rf = RandomForestRegressor(n_estimators=500, verbose=1)
    rf.fit_transform(X_train, y_train)
    return rf

此外,如果有更好的方法让我的模型可以通过 API 访问,那也很高兴知道。

更新:我将它减少到 100 棵树而没有失去太多的预测能力,所以现在节省的大小是 1.3 GB——更易于管理,但仍然不是很好。

3个回答

每棵树的大小很大程度上取决于它的深度。因此,更改最大深度 ( max_depth)。尝试将其设置为有限数(与默认的“无”相反),然后尝试减少此数。另外(或作为替代)尝试增加min_samples_splitor min_samples_split

您还可以分析您的功能并仅保留重要的功能。最简单的方法是看看clf.feature_importances_你的森林。(一般来说,寻找重要特征本身就是一门艺术和科学。)排除不相关的特征并重建森林。

试试这个:

import pickle
with open('rforest.pickle', 'wb') as f:
    pickle.dump(rforest, f, -1)

注意:使用参数“-1”,模型文件的大小将大大减小。

根据文档:

pickle.dump(obj,文件[,协议])

协议版本 0 是原始的 ASCII 协议,向后兼容早期版本的 Python。协议版本 1 是旧的二进制格式,它也与早期版本的 Python 兼容。协议版本 2 是在 Python 2.3 中引入的。它提供了更有效的新型类的酸洗。

如果省略协议参数,则使用协议 0。如果协议指定为负值或 HIGHEST_PROTOCOL,将使用最高协议版本。

我遇到了类似的问题。即使树的大小很小,我也得到了数百兆字节的文件。

检查你是否设置了oob_score=True. 对于大型训练数据集,这可能会导致oob_decision_function_. 我保留了oob_score_,但删除了这个矩阵。或者,您可以将其设置为False.