1、随机森林(Random Forest,简称RF)
顾名思义就是以树为基本单位的集成学习模型。每棵树都会得到一个分类结果,进行投票,森林最终选择投票最多的类别作为最终结果。随机体现在,用于训练单个决策树的样本与特征是通过随机选择产生。其中样本的抽取多选择有放回的随机抽取。随机抽取的优点在于极大地避免了因为决策树之间过高的的相似性从而导致的过拟合问题。
2、决策树的生长模式:
如果训练集中的样本数为N ,则从原始数据中随机抽取n个样本,多进行有放回的抽取。该样
本集将成为树木生长的训练集。
如果有M个输入变量,则指定数字m << M,以便在每个节点上从M个中随机选择m个变量,并
使用对这m个变量的最佳分割来分割节点。在森林生长期间,m的值保持恒定。
每棵树都尽可能地生长。没有修剪。
在有关随机森林的原始论文中,表明森林错误率取决于两件事:
森林中任何两棵树之间的相关性。增加相关性会增加森林错误率。
森林中每棵树的强度。错误率低的树是强分类器。增加单个树木的强度会降低森林错误率
减小用于训练的特征个数m会降低相关性和强度,增加它会同时增加。介于两者之间的某个位置是m的“最佳”范围-通常相当宽。使用OOB错误率(请参见下文),可以快速找到该范围内的m值。这是随机森林对其比较敏感的唯一可调参数。
3、随机森林的特征
训练可以高度并行化,对于大数据时代的大样本训练速度有优势。
它可以处理数千个输入变量,而无需删除变量。【每棵树仅随机选择指定数量的变量】
在训练后,可以给出各个特征对于输出的重要性——故该算法也可用于特征筛选
随着森林建设的进展,它会生成内部的概化误差的无偏估计。
它是一种估算丢失数据的有效方法,并在丢失大部分数据时保持准确性。对部分特征缺失不敏感。
它具有用于平衡类总体不平衡数据集中的错误的方法。
可以保存生成的林,以备将来在其他数据上使用。
计算出的原型给出有关变量和分类之间关系的信息。
它计算可用于聚类,定位异常值或(通过缩放)给出有趣数据视图的成对案例之间的邻近度。
上面的功能可以扩展到未标记的数据,从而导致无监督的聚类,数据视图和异常值检测。
它提供了一种检测变量相互作用的实验方法。
由于采用了随机采样,训练出的模型的方差小,泛化能力强。
相对于Boosting系列的Adaboost和GBDT, RF实现比较简单。
更多信息
4、随机森林的缺点:
随机森林在解决回归问题时,并没有像它在分类中表现的那么好,这是因为它并不能给出一个
连续的输出。当进行回归时,随机森林不能够做出超越训练集数据范围的预测,这可能导致在某些特定噪声的数据进行建模时出现过度拟合。(PS:随机森林已经被证明在某些噪音较大的分类或者回归问题上会过拟合)。
对于许多统计建模者来说,随机森林给人的感觉就像一个黑盒子,你无法控制模型内部的运
行。只能在不同的参数和随机种子之间进行尝试。
可能有很多相似的决策树,掩盖了真实的结果。决策树之间相似度过高会导致过拟合,随机抽
样便是为了降低相似度
对于小数据或者低维数据(特征较少的数据),可能不能产生很好的分类。(处理高维数据,
处理特征遗失数据,处理不平衡数据是随机森林的长处)。
执行数据虽然比boosting等快(随机森林属于bagging,并行),但比单只决策树慢多了。
在某些噪音比较大的样本集上,RF模型容易陷入过拟合。
Bootstrap: 名字来自成语“pull up by your own bootstraps”,意思是依靠你自己的资源,称为自助法,它是一种有放回的抽样方法,它是非参数统计中一种重要的估计统计量方差进而进行区间估计的统计方法。
5、Bagging(套袋法)
对于分类问题:由投票表决产生分类结果;
对于回归问题:由k个模型预测结果的均值作为最后预测结果。
6、无需验证集,就可得到模型评估结果:
通过bootstrap得到新的样本集D’,再由D’训练不同的决策树。我们知道D’中包含了原样本集D中的一些样本,但也有些样本没有涵盖进去,这部分称之为out-of-bag(OOB) example。
某个样本是OOB的概率是(其中,e是自然对数,N是原样本集的数量):
OOB数目大约是 N/e,即大约有三分之一的样本没有在bootstrap中被抽到。这三分之一被用于对决策树模型的评估,再通过对这些评估值求平均,最终得到随机森林的评估结果E,称其为bagging或者Random Forest的self-validation。即随机森林可以在没有重复训练的情况下便得到模型评估结果
7、为什么随机森林优先选择CART决策树,而非ID3或C4.5?
ID3与C4.5的不足:
1、ID3仅能处理离散特征;不能处理缺失值;选择分裂时会倾向于选择类别较多的变量(最极端的现象就是,分裂后的每个节点都只有一个输出项),从而容易过拟合
2、C4.5虽然是针对ID3已有的缺陷提出的,可以处理连续特征。
3、但是不管是ID3还是C4.5均是多叉树,即一个父节点可以有多个节点,相对于生成的只有二叉树的CART运算效率更低;
4、不管是ID3还是C4.5均无法用于回归,
5、不管是ID3还是C4.5均使用的是熵模型,含有耗时的对数运算
6、如果是连续值还有大量的排序运算,运算效率较低
CART的优点:
1、CART可以用于回归
2、cart树里面引入了一个gini系数的概念,gini的计算相比熵要简单的多,所以可以减少一定的运算量。
3、cart树第三个特点在于节点的分裂上,每次节点分裂都是二叉的,所以cart树就是多个二叉树组成的,这种特点使得cart算法与C4.5算法在处理离散变量上有很大的不同,离散变量在CART中只有一次可能出现在分裂节点上,分裂的枝数与离散变量的类别数量有关。也因为每次都是二分裂,所以cart也没有ID3中倾向于选择类别较多的变量的缺陷。
4、cart树对连续变量的处理与C4.5类似。
8、通过随机森林是如何评估特征的重要性:核心思想,random test
random test的做法是对于某个特征,如果用另外一个随机值替代它之后的表现比之前更差,则表明该特征比较重要,所占的权重应该较大,不能用一个随机值替代。相反,如果随机值替代后的表现没有太大差别,则表明该特征不那么重要,可有可无。所以,通过比较某特征被随机值替代前后的表现,就能推断出该特征的权重和重要性。
那么random test中的随机值如何选择呢?通常有两种方法:
一是使用uniform或者gaussian抽取随机值替换原特征;
二是通过permutation的方式将原来的所有N个样本的第i个特征值重新打乱分布(相当于重新洗牌)。
比较而言,第二种方法更加科学,保证了特征替代值与原特征的分布是近似的(只是重新洗牌而已),即permutation test(随机排序测试)。即在计算第i个特征的重要性的时候,将N个样本的第i个特征重新洗牌,然后比较前后两个模型表现的差异性。如果差异很大,则表明第i个特征是重要的。
接下来要考虑的问题是如何衡量上图中的performance,即替换前后的表现
我们可以选择如上所述利用两个不同的样本(样本的差别仅在于特征i是否被打乱重新分布)搭建两个模型,但是过程繁琐,故为了简化运算,就是把permutation的操作从原来的training上移到了OOB validation上去,也就是说,在训练的时候仍然使用D,但是在OOB验证的时候,将所有的OOB样本的第i个特征重新洗牌,验证G的表现。这种做法大大简化了计算复杂度,在RF的feature selection中应用广泛。
9、随机森林在sklearn中的参数
随机森林:
class sklearn.ensemble.RandomForestClassifier(
n_estimators=10, #森林里(决策)树的数目,过小,欠拟合,过大耗时,并且n_estimators到一定的数量后,再增大n_estimators获得的模型提升会很小,所以一般选择一个适中的数值。默认是100
criterion=‘gini’, #衡量分裂质量的性能(函数)。 受支持的标准是基尼不纯度的"gini",和信息增益的"entropy"(熵),优先考虑"gini",即CART决策树
max_depth=None, #决策树的最大深度。如果值为None,那么会扩展节点,直到所有的叶子是纯净的,或者直到所有叶子包含少于min_sample_split的样本
min_samples_split=2, #分割内部节点所需要的最小样本数量,如果为int,那么考虑min_samples_split作为最小的数字,如果为float,那么min_samples_split是一个百分比,并且把ceil(min_samples_splitn_samples)是每一个分割最小的样本数量
min_samples_leaf=1, #需要在叶子结点上的最小样本数量,如果为int,那么考虑min_samples_leaf作为最小的数字,如果为float,那么min_samples_leaf为一个百分比,并且ceil(min_samples_leafn_samples)是每一个节点的最小样本数量
min_weight_fraction_leaf=0.0, #一个叶子节点所需要的权重总和(所有的输入样本)的最小加权分数。当sample_weight没有提供时,样本具有相同的权重
max_features=’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_leaf_nodes=None, #以最优的方法使用max_leaf_nodes来生长树。最好的节点被定义为不纯度上的相对减少。如果为None,那么不限制叶子节点的数量
min_impurity_decrease=0.0, #如果节点的分裂导致的不纯度的下降程度大于或者等于这个节点的值,那么这个节点将会被分裂
min_impurity_split=None, #树早期生长的阈值。如果一个节点的不纯度超过阈值那么这个节点将会分裂,否则它还是一片叶子
bootstrap=True, #建立决策树时,是否使用有放回抽样。
oob_score=False, #是否使用袋外样本来估计泛化精度。建议True
n_jobs=1, #用于拟合和预测的并行运行的工作(作业)数量。如果值为-1,那么工作数量被设置为核的数量
random_state=None, #random_state是随机数生成器使用的种子; 如果是RandomState实例,random_state就是随机数生成器; 如果为None,则随机数生成器是np.random使用的RandomState实例,用于复现模型
verbose=0, #控制决策树建立过程的冗余度
warm_start=False, #当被设置为True时,重新使用之前呼叫的解决方案,用来给全体拟合和添加更多的估计器,反之,仅仅只是为了拟合一个全新的森林
class_weight=None) #
10、RF推广
由于RF在实际应用中的良好特性,基于RF,有很多变种算法,应用也很广泛,不光可以用于分类回归,还可以用于特征转换,异常点检测等。下面对于这些RF家族的算法中有代表性的做一个总结。
10.1 extra trees
extra trees是RF的一个变种, 原理几乎和RF一模一样,仅有区别有:
1) 对于每个决策树的训练集,RF采用的是随机采样bootstrap来选择采样集作为每个决策树的训练集,而extra trees一般不采用随机采样,即每个决策树采用原始训练集。
2) 在选定了划分特征后,RF的决策树会基于基尼系数,均方差之类的原则,选择一个最优的特征值划分点,这和传统的决策树相同。但是extra trees比较的激进,他会随机的选择一个特征值来划分决策树。
从第二点可以看出,由于随机选择了特征值的划分点位,而不是最优点位,这样会导致生成的决策树的规模一般会大于RF所生成的决策树。也就是说,模型的方差相对于RF进一步减少,但是偏倚相对于RF进一步增大。在某些时候,extra trees的泛化能力比RF更好。
10.2 Totally Random Trees Embedding
Totally Random Trees Embedding(以下简称 TRTE)是一种非监督学习的数据转化方法。它将低维的数据集映射到高维,从而让映射到高维的数据更好的运用于分类回归模型。我们知道,在支持向量机中运用了核方法来将低维的数据集映射到高维,此处TRTE提供了另外一种方法。
TRTE在数据转化的过程也使用了类似于RF的方法,建立T个决策树来拟合数据。当决策树建立完毕以后,数据集里的每个数据在T个决策树中叶子节点的位置也定下来了。比如我们有3颗决策树,每个决策树有5个叶子节点,某个数据特征x划分到第一个决策树的第2个叶子节点,第二个决策树的第3个叶子节点,第三个决策树的第5个叶子节点。则x映射后的特征编码为(0,1,0,0,0, 0,0,1,0,0, 0,0,0,0,1), 有15维的高维特征。这里特征维度之间加上空格是为了强调三颗决策树各自的子编码。
映射到高维特征后,可以继续使用监督学习的各种分类回归算法了。
10.3 Isolation Forest
Isolation Forest(以下简称IForest)是一种异常点检测的方法。它也使用了类似于RF的方法来检测异常点。
对于在T个决策树的样本集,IForest也会对训练集进行随机采样,但是采样个数不需要和RF一样,对于RF,需要采样到采样集样本个数等于训练集个数。但是IForest不需要采样这么多,一般来说,采样个数要远远小于训练集个数?为什么呢?因为我们的目的是异常点检测,只需要部分的样本我们一般就可以将异常点区别出来了。
对于每一个决策树的建立, IForest采用随机选择一个划分特征,对划分特征随机选择一个划分阈值。这点也和RF不同。
另外,IForest一般会选择一个比较小的最大决策树深度max_depth,原因同样本采集,用少量的异常点检测一般不需要这么大规模的决策树。
对于异常点的判断,则是将测试样本点x拟合到T颗决策树。计算在每颗决策树上该样本的叶子节点的深度ht(x)。,从而可以计算出平均高度h(x)。此时我们用下面的公式计算样本点x的异常概率:
s(x,m)=2−h(x)c(m)
其中,m为样本个数。c(m)的表达式为:
c(m)=2ln(m−1)+ξ−2m−1m,ξ为欧拉常数
s(x,m)的取值范围是[0,1],取值越接近于1,则是异常点的概率也越大。
11、集合算法:
11.1、自助聚合算法Bagging:有放回的进行n次采用,获得n个样本,进行训练,重复B次,即获得B个模型。解决过拟合问题
在sklearn中,由BaggingClassifier和BaggingRegressor分别实现分类和回归的Bagging算法
11.2、正向激励算法boosing:初始化时,针对m个训练样本的数据集,给每一个样本都分配一个初始权重,然后使用这个带权重的数据集来训练模型。训练出该模型后,针对模型预测错误的样本,增加其权重值,然后那这个新的带权重值的数据集来训练一个新的模型,重复上述过程B次,训练出B个模型。
boosting算法有多种实现方案,其中以AdaBoost算法最为著名,在sklearn中由AdaBoostClassifier和AdaBoostClassifier分别实现分类和回归算法
11.3、随机森林,是在自助聚合算法的基础上更进一步,对特征应用自助聚合算法。即,每次训练时,不拿所有的特征来训练,而是随机选择一个特征的子集来进行训练。随机森林算法有两个关键参数,一个是构建的决策树的个数,一个是构建单棵决策树特征的个数f
在sklearn中,由RandomForestClassifier和RandomForestRegressor分别实现分类和回归算法