随机森林模型持久化比较大优化处理

一、问题

就是10w条+特征数据max_depth=30,n_estimators=500

跑出来了800M大小模型,load都慢

二、优化

你这个森林深度有点大啊,如果你把深度调小点,效果应该差不多。

另外你保存的时候,设置一下 compress 参数应该会减小很多空间

from sklearn.externals import joblib
joblib.dump(my_rf_model, "rf.pkl", compress=9)
#my_rf_model是你训练好的模型

compress的值是0到9之间,越大表示压缩程度越高。

您好,调整了一下测试 确实小了很多,参数为(max_depth=30,n_estimators=500, min_samples_leaf= 5),10W条数据 compress=0时是300M+,compress=9时是50M+,这边数据量是有500W+如果按照这个比例的话其实压缩比是6倍左右,还是挺大的,请问下面的只能调整深度参数来解决了么?

你的模型还是挺大的,最大深度为30,就意味着一棵树最多有2^29个分叉,2^30个叶节点。你的数据只有10万,应该是不需要这么大的深度。同时min_sample_leaf可能也要调整。有时候为了模型压缩牺牲一点精度是ok的。

随机森林一般深度不要超过10,不然每棵树过拟合严重,而且就会有你遇到的问题,模型太大,不管是调用还是存储都是问题。

我觉得模型选择上挺好的,随机森林固有的两类随机性可以很好的处理特征较多的情况,但是深度有些大了,过拟合有很大的概率会出现,可读性也不会太好。

三、随机森林参数

clf = RandomForestClassifier(n_estimators=200, criterion='entropy', max_depth=4)
 rf_clf = clf.fit(x, y.ravel())

n_estimators:森林中决策树的数量。默认100
表示这是森林中树木的数量,即基基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越大,模型的效果往往越好。但是相应的,任何模型都有决策边界,n_estimators达到一定的程度之后,随机森林的精确性往往不在上升或开始波动,并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越长。对于这个参数,我们是渴望在训练难度和模型效果之间取得平衡。

criterion:分裂节点所用的标准,可选“gini”, “entropy”,默认“gini”。

max_depth:树的最大深度。如果为None,则将节点展开,直到所有叶子都是纯净的(只有一个类),或者直到所有叶子都包含少于min_samples_split个样本。默认是None。

min_samples_split:拆分内部节点所需的最少样本数:如果为int,则将min_samples_split视为最小值。如果为float,则min_samples_split是一个分数,而ceil(min_samples_split * n_samples)是每个拆分的最小样本数。默认是2。

min_samples_leaf:在叶节点处需要的最小样本数。仅在任何深度的分割点在左分支和右分支中的每个分支上至少留下min_samples_leaf个训练样本时,才考虑。这可能具有平滑模型的效果,尤其是在回归中。如果为int,则将min_samples_leaf视为最小值。如果为float,则min_samples_leaf是分数,而ceil(min_samples_leaf * n_samples)是每个节点的最小样本数。默认是1。

min_weight_fraction_leaf:在所有叶节点处(所有输入样本)的权重总和中的最小加权分数。如果未提供sample_weight,则样本的权重相等。

max_features:寻找最佳分割时要考虑的特征数量:如果为int,则在每个拆分中考虑max_features个特征。如果为float,则max_features是一个分数,并在每次拆分时考虑int(max_features * n_features)个特征。如果为“auto”,则max_features = sqrt(n_features)。如果为“ sqrt”,则max_features = sqrt(n_features)。如果为“ log2”,则max_features = log2(n_features)。如果为None,则max_features = n_features。注意:在找到至少一个有效的节点样本分区之前,分割的搜索不会停止,即使它需要有效检查多个max_features功能也是如此。

max_leaf_nodes:最大叶子节点数,整数,默认为None

min_impurity_decrease:如果分裂指标的减少量大于该值,则进行分裂。

min_impurity_split:决策树生长的最小纯净度。默认是0。自版本0.19起不推荐使用:不推荐使用min_impurity_split,而建议使用0.19中的min_impurity_decrease。min_impurity_split的默认值在0.23中已从1e-7更改为0,并将在0.25中删除。

bootstrap:是否进行bootstrap操作,bool。默认True。如果bootstrap==True,将每次有放回地随机选取样本,只有在extra-trees中,bootstrap=False

oob_score:是否使用袋外样本来估计泛化精度。默认False。

n_jobs:并行计算数。默认是None。

random_state:控制bootstrap的随机性以及选择样本的随机性。
verbose:在拟合和预测时控制详细程度。默认是0。

class_weight:每个类的权重,可以用字典的形式传入{class_label: weight}。如果选择了“balanced”,则输入的权重为n_samples / (n_classes * np.bincount(y))。

ccp_alpha:将选择成本复杂度最大且小于ccp_alpha的子树。默认情况下,不执行修剪。

max_samples:如果bootstrap为True,则从X抽取以训练每个基本分类器的样本数。如果为None(默认),则抽取X.shape [0]样本。如果为int,则抽取max_samples样本。如果为float,则抽取max_samples * X.shape [0]个样本。因此,max_samples应该在(0,1)中。是0.22版中的新功能。


相关文章:
随机森林的模型一般都很大么?

为者常成,行者常至