目录
Totally Random Trees Embedding
9. sklearn.ensemble.RandomForestClassifier参数及方法说明
1. 集成学习概念
集成学习ensemble learning是通过构建并结合多个学习器来完成学习任务。其一般结构为:
1、先产生一组“个体学习器”(individual learner) 。个体学习器通常由一种或者多种现有的学习算法从训练数据中产生。
1)如果个体学习器都是从某一种学习算法从训练数据中产生,则称这样的集成学习是同质的homogenerous。此时的个体学习器也称作基学习器base learner,相应的学习算法称作基学习算法。
2)如果个体学习器是从某几种学习算法从训练数据中产生,则称这样的集成学习是异质的heterogenous 。
2、再使用某种策略将它们结合起来。集成学习通过将多个学习器进行组合,通常可以获得比单一学习器显著优越的泛化性能。
通常选取个体学习器的准则是:
- 个体学习器要有一定的准确性,预测能力不能太差。
- 个体学习器之间要有多样性,即学习器之间要有差异。
相对而言,同质个体学习器的应用更广泛,一般我们常说的集成学习的方法都是指的同质个体学习器。而同质个体学习器使用最多的模型是CART决策树和神经网络。同质个体学习器按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,一系列个体学习器基本都需要串行生成,代表算法是Boosting系列算法,第二个是个体学习器之间不存在强依赖关系,一系列个体学习器可以并行生成,代表算法是Bagging和随机森林(Random Forest)系列算法。
2. Boosting
对于分类问题而言,求一个比较粗糙的分类规则(弱分类器)要比求精确的分类规则(强分类器)要容易得多。而boosting就是可以将弱学习器提升为强学习器的算法。boosting通过改变训练样本的权重学习多个分类器,并将这些分类器们进行线性组合来提高分类的能力。
流程
- 先从初始训练集训练出一个弱学习器。
- 再根据基学习器的学习误差率表现来更新训练样本的权重,使得之前弱学习器学习误差率高的训练样本点的权重变高,使得这些误差率高的训练样点在下一个弱学习器中得到更多的关注。
- 然后基于调整权重后的训练集来训练下一个弱学习器。
- 如此重复,直到基学习器数量达到事先指定的数目T。
- 最终将这T个基学习器进行加权组合,得到最终的强学习器。
Boosting系列算法里最著名算法主要有AdaBoost算法和提升树(boosting tree)系列算法。提升树系列算法里面应用最广泛的是梯度提升树(Gradient Boosting Tree)。
3. Bagging
流程
- 经过T轮自助采样,可以得到T个包含m个训练样本的采样集。
- 然后基于每个采样集训练出一个弱学习器。
- 最后将这T个基学习器通过集合策略,得到最终的强学习器。
Bagging的弱学习器之间没有依赖关系,可以并行生成。
Bagging基于自助采样法bootstrap sampling。自助采样法的步骤是:对于m个样本的原始训练集,我们每次先随机采集一个样本放入采样集,接着把该样本放回;也就是说下次采样时该样本仍有可能被采集到,这样采集m次,最终可以得到m个样本的采样集。由于是随机采样,这样每次的采样集是和原始训练集不同的,和其他采样集也是不同的,这样得到多个不同的弱学习器。
在使用 Bagging学习器进行预测时:
- 分类任务采取简单投票法,取每个弱学习器的预测类别的众数。
- 回归任务使用简单平均法,取每个弱学习器的预测值的平均。
从偏差-方差的角度对比Boosting和Bagging:
- Boosting 主要关注降低偏差(避免欠拟合),它能将一些弱学习器提升为强学习器。因此它在SVM 、knn 等不容易受到样本扰动的学习器上效果更为明显。
- Bagging主要关注降低方差(避免过拟合),它能平滑强学习器的方差。因此它在非剪枝决策树、神经网络等容易受到样本扰动的学习器上效果更为明显。
4. 结合策略(平均法,投票法,学习法)
学习器组合可以带来的好处:
- 由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到同等性能。此时如果使用单学习器可能因为造成误选而导致泛化性能不佳,通过学习器组合之后会减小这一风险。
- 学习算法往往会陷入局部极小。有的局部极小点所对应的泛化性能可能很差,而通过学习器组合之后可降低陷入糟糕局部极小的风险。
- 某些学习任务的真实假设可能不在当前学习算法所考虑的假设空间中,此时使用单学习器肯定无效。 通过学习器组合之后,由于相应的假设空间有所扩大,有可能学得更好的近似。
平均法
平均法通常用于回归任务中。
- 简单平均法:
- 加权平均法:
其中,学习器的权重是从训练数据中学的。
现实任务中训练样本通常不充分或者存在噪声,这就使得学得的权重不完全可靠。尤其是对于规模比较大的集成学习,要学习的权重比较多,很容易出现过拟合。因此实验和应用均显示出,加权平均法不一定优于简单平均法。
通常如果个体学习器性能相差较大时,适合使用加权平均法;个体学习器性能相差较近时,适合使用简单平均法。
投票法
投票法通常用于分类任务中。
- 相对多数投票法(最简单)。选取得票最多的标记作为预测值:
- 绝大多数投票法(稍复杂)。若某个标记得票数过半,则预测为该标记;否则拒绝预测。此时很有可能所有标记都未过半,则预测失败。因此这种方法比较少用。
- 加权投票法(最复杂)。类似于加权平均法,每个弱学习器的分类票数要乘以一个权重,最终将各个类别的加权票数求和,最大的值对应的类别为最终类别。学习器的权重是从训练数据中学的:
若基学习器不同,其类概率值不能直接进行比较,通常需要将其转化为类标记输出,然后进行投票。
学习法
平均法和投票法都是对弱学习器的结果做平均或者投票,相对比较简单,但是学习误差可能较大。
于是就有了学习法:将个体学习器的分类结果与另一个学习器组合。此时称弱学习器为初级学习器,用于结合的学习器称为次级学习器或者元学习器meta_learner。
学习法的代表方法是stacking:首先从初始数据集训练出初级学习器;然后将初级学习器的预测结果作为一个新的数据集用于训练次级学习器。在这个新数据集中,初级学习器的输出被当作样本输入特征;初始样本的标记仍被视作标记。
若直接使用初级学习器的输出来产生次级训练集,则容易发生过拟合。一般是通过使用交叉验证,使用训练初级学习器时未使用的样本来产生次级学习器的训练样本。
次级学习器的输入属性表示和次级学习算法对stacking集成算法的泛化性能有很大影响。通常推荐:
- 次级学习器的输入特征是以初级学习器的输出类概率为特征。
- 次级学习算法采用多响应线性回归Multi-response Linear Regression:MLR 。
5. 随机森林思想
随机森林是bagging的一个特化进阶版,所谓的特化是因为随机森林的弱学习器都是决策树。所谓的进阶是随机森林在bagging的样本随机采样基础上,又加上了特征的随机选择,其基本思想没有脱离bagging的范畴。
随机森林对Bagging做了小改动:
- Bagging中基学习器的“多样性”来自于样本扰动。样本扰动来自于对初始训练集的随机采样。
- 随机森林中的基学习器的多样性不仅来自样本扰动,还来自属性扰动。这就是使得最终集成的泛化性能可以通过个体学习器之间差异度的增加而进一步提升。
随机森林在以决策树为基学习器构建Bagging集成模型的基础上,进一步在决策树的训练过程中引入了随机属性选择。
- 传统决策树在选择划分属性时,是在当前结点的属性集合(假定有n个属性)中选择一个最优属性。
- 随机森林中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k(建议)个属性的子集,然后再从这个子集中选择一个最优属性用于划分。
6. 随机森林的推广
基于随机森林,有很多变种算法,应用也很广泛,不光可以用于分类回归,还可以用于特征转换,异常点检测等。这里主要介绍2种:extra trees和Totally Random Trees Embedding。
extra trees
extra trees是RF的一个变种, 原理几乎和RF一模一样,主要有2点区别:
- 对于每个决策树的训练集,RF采用的是随机采样bootstrap来选择采样集作为每个决策树的训练集,而extra trees一般不采用随机采样,即每个决策树采用原始训练集。
- 在选定了划分特征后,RF的决策树会基于信息增益,基尼系数,均方差之类的原则,选择一个最优的特征值划分点,这和传统的决策树相同。但是extra trees比较的激进,他会随机选择一个特征值来划分决策树。
从第2点可以看出,由于随机选择了特征值的划分点位,而不是最优点位,这样会导致生成的决策树的规模一般会大于RF所生成的决策树。也就是说,模型的方差相对于RF进一步减少,但是偏差相对于RF进一步增大。在某些时候,extra trees的泛化能力比RF更好。
Totally Random Trees Embedding
Totally Random Trees Embedding(以下简称 TRTE)是一种非监督学习的数据转化方法。它将低维的数据集映射到高维,从而让映射到高维的数据更好的运用于分类回归模型。SVM运用了核方法将低维的数据集映射到高维,而TRTE提供了另外一种方法。
TRTE在数据转化的过程也使用了类似于RF的方法,建立T个决策树来拟合数据。当决策树建立完毕以后,数据集里的每个数据在T个决策树中叶子节点的位置也定下来了。比如我们有3颗决策树,每个决策树有5个叶子节点,某个数据特征xx划分到第一个决策树的第2个叶子节点,第二个决策树的第3个叶子节点,第三个决策树的第5个叶子节点。则x映射后的特征编码为(0,1,0,0,0, 0,0,1,0,0, 0,0,0,0,1), 有15维的高维特征。这里特征维度之间加上空格是为了强调三颗决策树各自的子编码。
映射到高维特征后,可以继续使用监督学习的各种分类回归算法了。
7. 优缺点
优点
- 训练可以高度并行化,对于大数据时代的大样本训练速度有优势。
- 能够处理很高维度(feature很多)的数据,并且不用做特征选择。
- 随机森林简单、容易实现、计算开销小。
- 训练效率较高。因为随机森林使用的决策树只需要考虑所有属性的一个子集。
- 由于采用了随机采样,训练出的模型的方差小,泛化能力强。
- 对部分特征缺失不敏感。
- 随机森林在很多现实任务中展现出强大的性能,被称作 “代表集成学习技术水平的方法”。
- 随着树的数量的增加,随机森林可以有效缓解过拟合。因为随着树的数量增加,模型的方差会显著降低。
缺点
- 在某些噪音比较大的样本集上,RF模型容易陷入过拟合。
- 取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。
8. 主要调参的参数
RF调参的参数和GBDT基本相同。
- RF划分时考虑的最大特征数max_features: 可以使用很多种类型的值,默认是”None”,意味着划分时考虑所有的特征数;如果是”log2”意味着划分时最多考虑log2N个特征;如果是”sqrt”或者”auto”意味着划分时最多考虑N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的”None”就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。
- 决策树最大深度max_depth: 默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
- 内部节点再划分所需最小样本数min_samples_split: 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
- 叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
- 叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
- 最大叶子节点数max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是”None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
- 节点划分最小不纯度min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。
9. sklearn.ensemble.RandomForestClassifier参数及方法说明
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html
基于scikit-learn v0.20.1
class sklearn.ensemble.
RandomForestClassifier
(n_estimators=’warn’, criterion=’gini’, max_depth=None, min_samples_split=2, min_samples_leaf=1, 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=None, random_state=None, verbose=0, warm_start=False, class_weight=None)[source]
Parameters | n_estimators | integer,可选,默认:10。决策树数量,或者说弱学习器的最大个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,计算量会太大,并且n_estimators到一定的数量后,再增大n_estimators获得的模型提升会很小,所以一般选择一个适中的数值。默认值将由v0.20的10改为v0.22的100。 |
criterion | string,可选,默认:“gini” 。CART树做划分时对特征的评价标准。 分类模型和回归模型的损失函数是不一样的。分类RF对应的CART分类树默认是基尼系数gini,另一个可选择的标准是信息增益的 “entropy”。回归RF对应的CART回归树默认是均方差mse,另一个可以选择的标准是绝对值差mae。 | |
max_depth | int或None,可选,默认:None。树的最大深度。 如果为None,则扩展节点直到所有叶子都是纯的或直到所有叶子包含少于min_samples_split样本。 | |
min_samples_split | int, float,可选,默认:2。分割内部节点所需的最小样本数。 如果是int,则将min_samples_split视为最小数字。 | |
min_samples_leaf | int, float,可选,默认:1。叶子节点所需的最小样本数。 只有在每个左右分支中留下至少min_samples_leaf训练样本时,才会考虑任何深度的分裂点。 这可能具有平滑模型的效果,尤其是在回归中。 如果是int,则将min_samples_leaf视为最小数字。 | |
min_weight_fraction_leaf | float,可选,默认:0。需要在叶节点处的权重总和(所有输入样本)的最小加权分数。当未提供sample_weight时,样本具有相同的权重。 | |
max_features | int, float, string或None,可选,默认:”auto”。寻找最佳划分时要考虑的特征数量。 如果是int,则在每次划分时考虑max_features特征。 | |
max_leaf_nodes | int或None,可选,默认:”None”。以最佳方式使用max_leaf_nodes生成树。Best nodes are defined as relative reduction in impurity. If None then unlimited number of leaf nodes. | |
min_impurity_decrease | float,可选,默认:0。如果该划分导致impurity的减少大于或等于该值,则将分裂节点。 | |
min_impurity_split | float,默认:1e-7。阈值。Threshold for early stopping in tree growth.如果节点的impurity高于此阈值,则划分节点,否则它是叶子节点。 从v0.19开始不推荐使用:min_impurity_split已被弃用。min_impurity_split的默认值将在v0.23中从1e-7变为0,并且将在v0.25中删除。 请改用min_impurity_decrease。 | |
bootstrap | boolean,可选,默认:True。是否在构建树时使用bootstrap样本。 | |
oob_score | bool ,默认:False。是否采用袋外样本来评估模型的好坏。 个人推荐设置为True,因为袋外分数反应了一个模型拟合后的泛化能力。 | |
n_jobs | int或None,可选,默认:”None”。用于并行提高效率,任务并行时指定的CPU数量。-1表示使用所有CPU;1表示不并行;n表示n个CPU并行。 | |
random_state | int, RandomState instance或None,可选,默认:”None”。让结果可以复现,再次运行代码时可以得到之前一样的结果。
| |
verbose | int,可选,默认:0。用于开启/关闭迭代中间输出日志功能。 | |
warm_start | bool,可选,默认:False。是否使用上次的模型结果作为初始化,False表示不使用。 | |
class_weight | dict, list of dicts, “balanced”, “balanced_subsample”或None,可选,默认:None。用于标示分类模型中各种类型的权重,可以不输入,即不考虑权重。
| |
Attributes | estimators_ | DecisionTreeClassifier列表,拟合的子分类器集合。 |
classes_ | 类标签(单输出问题),或类标签数组列表(多输出问题)。 | |
n_classes_ | int或list。类的数量(单输出问题),或包含每个输出的类数的列表(多输出问题)。 | |
n_features_ | int。训练时使用的特征数量。 | |
n_outputs_ | int。训练时输出的数量。 | |
feature_importances_ | 返回特征的重要性(值越大,特征越重要)。 | |
oob_score_ | float。使用袋外估计获得的训练数据集的分数。 | |
oob_decision_function_ | shape为[n_samples, n_classes]。通过对训练集进行袋外估计来计算决策函数。 如果n_estimators很小,则可能在bootstrap时未遗漏数据点。 在这种情况下,oob_decision_function_可能包含NaN。 | |
Methods | apply (X) | 将树应用到X,返回叶子节点索引。 |
decision_path (X) | 返回森林的决策路径。 | |
fit (X, y[, sample_weight]) | 训练模型。 | |
get_params ([deep]) | 获取分类器的参数。 | |
predict (X) | 用模型进行预测,返回预测值。 | |
predict_log_proba (X) | 返回一个数组,数组的元素一次是X预测为各个类别的概率的对数值。 | |
predict_proba (X) | 返回一个数组,数组的元素一次是X预测为各个类别的概率值。 | |
score (X, y[, sample_weight]) | 返回测试数据集的平均准确度。 | |
set_params (**params) | 设置分类器的参数。 |
参考
RF、GBDT、XGBoost面试级整理 https://blog.csdn.net/qq_28031525/article/details/70207918