предисловие
随机森林 = bagging集成学习框架(思想) + 决策树
所以,对随机森林调参数,可以从2个方面进行。
框架层面的调参 + 决策树层面的调参
Класс RandomForestClassifier пакета расширения sklearn
class sklearn.ensemble.RandomForestClassifier(
n_estimators=10, # 随机森林中决策树的数量,默认是10
criterion='gini', # 把gini指数作为节点划分的准则,信息熵或者gini系数。
max_depth=None, # 每棵树的最大深度(对完全分烈有影响)
min_samples_split=2, # 一个节点中至少有2条样本数据才能划分
min_samples_leaf=2, # 叶子节点中最少的训练样本数据(如果划分为叶子节点之后,叶子节点中只有一条样本数据了,则就不能划分)
min_weight_fraction_leaf=0.0,
max_features=’auto’,
max_leaf_nodes=None,
min_impurity_decrease=0.0,
min_impurity_split=None,
bootstrap=True, # 是否采用有放回的方式进行数据采样
oob_score=False, # 交叉验证
n_jobs=1, # 并行计算,对模型性能没有影响,但是会影响模型训练的速度
random_state=None, # 可以复现
verbose=0,
warm_start=False,
class_weight=None # 解决训练数据中正负样本不均衡的问题
)
1/введение параметра:
<1>n_estimators
官方解释如下:
integer, optional (default=10) The number of trees in the forest.
整数,可选择(默认值为10),随机森林里决策树的数量。
简单来说:就是你打算用多少棵树来投票。
该参数大,会提升模型的性能,更佳稳定,方差减小了。因为决策树多了,相当于参与决策的‘专家’多了,这样出错的概率就会变小
但是如果决策树太多,也会增加计算量,模型的复杂度对增加。
有利有弊,但是相比来说,还是大一点好。
n_estimators是森林里树的数量,通常数量越大,效果越好,但是计算时间也会随之增加。
此外要注意,当树的数量超过一个临界值之后,算法的效果并不会很显著地变好
<2>criterion
string, optional (default=”gini”) 字符串,可选择
衡量特征分裂质量的性能。
受支持的标准是基尼不纯度的"gini",和信息增益的"entropy"(熵)。
注意:这个参数是特定树的。
<3>max_features
随机森林的特征随机选择指的是:每个节点在分裂的时候在所有特征中进行选择,而不是对于整棵决策树进行特征的随机选择。
int, float, string or None, optional (default=”auto”)
整数,浮点数,字符串或者无值,可选的(默认值为"auto")
寻找最佳分割时需要考虑的特征数目:
如果是int,就要考虑每一次分割处的max_feature特征
如果是float,那么max_features就是一个百分比,那么(max_feature*n_features)特征整数值是在每个分割处考虑的。
如果是auto,那么max_features=sqrt(n_features),即n_features的平方根值。
如果是log2,那么max_features=log2(n_features)
如果是None,那么max_features=n_features
注意:寻找分割点不会停止,直到找到最少一个有效的节点划分区,即使它需要有效检查超过max_features的特征。
max_features是分割节点时考虑的特征的随机子集的大小。 这个值越低,方差减小得越多,但是偏差的增大也越多
回归:max_features = n_features
分类:max_features = sqrt(n_features)
<4>max_depth
integer or None, optional (default=None) 整数或者无值,可选的(默认为None)
树的最大深度。如果值为None,那么会扩展节点,直到所有的叶子是纯净的,或者直到所有叶子包含少于min_sample_split的样本。
min_sample_leaf:
每个叶子节点中容纳的最小的样本数量。
如果您以前编写过一个决策树,你能体会到最小叶子节点样本数的重要性。
叶子节点是决策树的末端节点。
较小的叶子使模型更容易捕捉训练数据中的噪声。
一般来说,我更偏向于将最小叶子节点数目设置为大于50。
在你自己的情况中,你应该尽量尝试多种叶子大小种类,以找到最优的那个。
<6>min_sample_split
分割节点所需的最小样本数(该参数不是很重要)
如果我们设置了min_sample_split = 6,
这个时候,某个节点中有4个样本,则不会再对该节点进行划分。
min_sample_leaf基本上是叶节点所需的最小样本数
假设min_sample_leaf = 3,并且一个含有5个样本的节点可以分别分裂成2个和3个大小的叶子节点,那么这个分裂就不会发生,因为最小的叶子大小为3。
Два параметра min_sample_leaf и min_sample_split имеют определенную связь
<8>class_weight
如果训练数据中,正负样本严重不均衡,则可以通过该参数调整正负样本的权重
权重大的样本,在进行随机子采样的时候,被选中的概率就大。
<9>n_jobs
这个参数告诉服务器用多少处理器来训练模型。
因为随机森林中的决策树之间是独立的,各自训练自己的。
所以可以并行训练,可以多开几个进程。
“-1”意味着没有限制,
而“1”值意味着它只能使用一个处理器。
下面是一个用Python做的简单实验用来检查这个指标:
“%timeit”是一个非常好的功能,他能够运行函数多次并给出了最快循环的运行时间。
这出来非常方便,同时将一个特殊的函数从原型扩展到最终数据集中。
%timeit
model = RandomForestRegressor(n_estimator = 100, oob_score = TRUE,n_jobs = 1,random_state =1)
model.fit(X,y)
Output ———- 1 loop best of 3 : 1.7 sec per loop
%timeit
model = RandomForestRegressor(n_estimator = 100,oob_score = TRUE,n_jobs = -1,random_state =1)
model.fit(X,y)
Output ———- 1 loop best of 3 : 1.1 sec per loop
<10>random_state
此参数让结果容易复现。
一个确定的随机值将会产生相同的结果,在参数和训练数据不变的情况下。
我曾亲自尝试过将不同的随机状态的最优参数模型集成,有时候这种方法比单独的随机状态更好。
确定该参数,则每棵决策树随机选择的样本数据和随机选择的特征数据都是固定的,
这样我们每次训练的时候去调整其他的参数就可以了。
oob_score:
out of bag score
这是一个随机森林交叉验证方法。
这种方法只是简单的标记在每棵子树中用的样本数据。
然后对每一个样本数据找出一个最大投票得分,是由那些没有使用该观察样本进行训练的决策树投票得到。
例子:
model = RandomForestRegressor(n_estimator=100,
oob_score=TRUE,
n_jobs=-1,
random_state=50,
max_features="auto",
min_samples_leaf=50)
model.fit(x,y)