1、主要内容
介绍随机森林的算法原理以及推导过程
2、bagging思想
bagging思想通过对样本的重复又放回的抽样得到M个不同的训练数据集,然后对每一份训练数据都训练出一个算法,最后使用blending思想进行组合可以采用uniform blending平均每个结果也可以采用加权blending的方式,或者其他的集成方式。现行加权blending时还需要对加权的系数进行确定,可以使用将训练数据输入到分类器后得到的结果与真实的值组成新的训练数据对加权系数进行确定,但是一般来说简单平均就可以了, 加权平均的效果不一定好于简单平均。
bagging的作用有可以通过训练多个学习器,通过多个学习器的结果平均来降低总体的方差,使得每次训练或者测试的结果都在预想的范围之内。
随机森林就是使用bagging的方法构造数据集,基学习算法采用决策树算法,决策树算法对异常数据比较敏感,因此其方差可能比较大。
3、随机森林算法
随机森林使用bagging和cart树进行集成,对于分类采用分类树,对于回归采用回归树。
好处:
可以很容易的做成并行化的程序
集成了cart树的好处,对数据缺失不敏感等好处
同时杜绝了完全生成树的缺点比如说过拟合等问题
随机森林在数据抽样后还要在数据空间上进行随机抽样,这是在bagging之后的继续做,这样使得数据更加不相同,从而使得生成的学习器各个都不同。
除了做简单的投影外,还可以使用复杂投影,就是讲投影向量由原始特征的加组合:
3、带外数据估计(out-of-bag data)
在bagging时由于是重复抽样的因此有些数据是不被抽中的,就像上图中*的样本。那么大概有多少数据一直被抽不到?
如果抽样后数据集为N,那么每次某样本被抽不到的概率为(1-1/N),那么经历了N次抽样那么气味oob的概率为:
在N趋向无穷时:
大概为1/3的概率抽不到。那么每次抽样后oob数据的规模为
oob = N/e;
对于OOB数据就类似于交叉验证的作用:
但是对于某个学习器来说,我们并不关心其性能,还是关心整个随机森林的效果:
关于G-n(x)的定义是根据(xn,yn)是袋外数据的样本训练出来的学习器的组合,这个一定要注意,这就是说很对每个训练样本的话,需要判断它是否是哪些学习器的袋外数据然后再进行测试最后对所有的数据进行求平均,这样感觉很复杂啊,
OOB的作用:
4、特征选择
将高输入维度的样本减少,移除冗余的特征(相互联系的特征,特征与结果无关)
特征选择的好处:
坏处:
1、特征的组合很多如何选择特征很复杂
2、特征选不好的话也会overfit
3、如果overfit的对特征的解释就是错误的
关于特征选择的方法:
在决策树以及adaBoost中对于特征的切分的选择就是一个内在特征的选择的过程。
从单个特征的重要性出发:
此时不考虑特征之间的组合,只是考虑对单个特征进行计算重要性,然后依靠计算结果排序进行选择。
对于线性模型:通过学习后的权重向量的绝对值计算
如果是非线性模型,因为特征之间有组合,那么就不能通过权重系数来衡量。此时通常采用随机测试的方法,就是对某个特征加上随机噪声然后比较学习的效果。
关于加噪声有两种方法:
1、使用某种分布进行噪声,但是这样有可能改变原有特征i的取值分布。
2、排列测试:
将第i维特征的所有可能的值进行重新随机排列,这样原来样本a的特征 i 的值就可能与样本b的特征 i 的值发生交换,使用这样的数据丢进算法中看看最后的结果的变化。
随机森林的特征选择:
根据下面的额公式可以知道,如果直接使用需要使用原始数据训练一次然后再使用随机排列后的数据进行重新训练以及交叉验证,这样就重复训练使得特征选择比较复杂,那么对于对随机森林来说交叉验证由于OOB数据的存在可以避免,此外在衡量性能时不再重新训练而是很对OOB数据进行重新排列然后进行衡量模型的性能,这样就避免了重新训练。同时在随机排列OOB数据时,每个特征的值只选用在OOB内的值,不再使用全部的值,这点需要注意。
5、补充:关于OOB数据集的问题:
袋外数据(oob)误差的计算方法如下:
对于已经生成的随机森林,用袋外数据测试其性能,假设袋外数据总数为O,用这O个袋外数据作为输入,带进之前已经生成的随机森林分类器,分类器会给出O个数据相应的分类,因为这O条数 据的类型是已知的,则用正确的分类与随机森林分类器的结果进行比较,统计随机森林分类器分类错误的数目,设为X,则袋外数据误差大小=X/O;这已经经过证明是无偏估计的,所以在随机森 林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差的无偏估计。
那这样的话这个OOB就是一个数据集了,但是针对不同的训练样本其袋外数据并不相同,如何获得袋外数据集?这种方式是没有办法获得一个可用的带外数据集,如果树的数量很多几乎每个样本都会被用上,那么如果使用OOB的话只能是按照上面验证随机森林的模型的公式:
然后根据每个样本去构造Gn(xn),这样不用说也是很复杂的,需要记录的信息有很多。