随机森林算法总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xianqianshi3004/article/details/86663157

集成学习的概念

集成学习简单来说就是通过构建并结合多个学习器来完成学习任务。

集成学习的一般结构是先产生一组“个体学习器”,在通过一定的策略把它们结合起来结构如下图所示:
集成学习
集成学习能够通过将多个学习器结合起来,常可获得比单一学习器显著优越的泛化能力,对‘弱分类器‘(常指分化能力略优于随机猜测的学习器)尤为明显,因此集成学习的很多理论研究都是针对弱学习器进行的,而基学习器有时直接成为是弱分类器。

在一般经验下中如果把好坏不等的东西掺杂在一起,那么通常结果会是比再坏的差,比最好的坏,那么集成学习如何获得比单一学习器更好的性能呢?
通过两点,一要保证个体学习器有一定的准确性,二要保证个体学习器的多样性,避免相同产生的简单叠加而不起作用,通过下图我们可以清楚的理解这两点:
在这里插入图片描述

个体学习器的概念

个体学习器通常是由现有的算法从训练数据中产生,例如C4.5决策树算法,BP神经网络算法等。通常有两种形势:同质和异质,同质即是通过同一种算法残生的多个不同的学习器如(通过决策树算法产生多个学习器,那么这些学习器就是同质的);异质即是通多多种算法生成多个不同的学习器(通过决策树和BP神经网络,SVM产生的多个分类器集成起来,这些分类器即是异质学习器)

boosting和bagging

Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法。即将弱分类器组装成强分类器的方法。

首先介绍Bootstraping,即自助法:它是一种有放回的抽样方法(可能抽到重复的样本):
1、Bagging (bootstrap aggregating)

Bagging即套袋法,其算法过程如下:

A)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)

B)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)

C)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)

2、Boosting

其主要思想是将弱分类器组装成一个强分类器。

关于Boosting的两个核心问题:

1)在每一轮如何改变训练数据的权值或概率分布?

通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。

2)通过什么方式来组合弱分类器?

通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。

而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。

3、Bagging,Boosting二者之间的区别

Bagging和Boosting的区别:

1)样本选择上:

Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。

Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。

2)样例权重:

Bagging:使用均匀取样,每个样例的权重相等

Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。

3)预测函数:

Bagging:所有预测函数的权重相等。

Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。

4)并行计算:

Bagging:各个预测函数可以并行生成

Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。

4)方差和偏差:

Bagging:关注降低方差

Boosting:关注与降低偏差

结合策略

学习器结合可能会带来三个方面的好处

1)从统计的方面来看,由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到相同的性能,此时使用单个学习器可能因为误选而导致泛化性能不佳,结合多个学习器可减少这一风险

2)从计算的方面来看,学习算法往往会陷入局部极小,有的局部极小点所对应的的泛化能力可能很糟糕,而通过多次运行字后的结合可降低陷入糟糕局部极小点的风险

3)从表现方面来看,某些学习任务的真实假设可能不在当前学习算法考虑的假设空间中,此时若使用单个学习器肯定无效,而通过多个学习器结合由于想用应的假设空间编发可能学到更好的近似。

常见的结合策略有以下几种:

1)平均法

1.1)简单平均法

在这里插入图片描述
1.2)加权平均法
在这里插入图片描述
显然简单平均法是加权平均法的一个特列

加权平均法的权重一般是从训练数据中学习而得,现实任务中的训练样本通常不充分或存在噪声,这将使得学出的权重不完全可靠,尤其是对规模较大的集成来说,要学习的权重比较多,比较容易产生过拟合,因此实验和应用现实加权平均比一定优于简单平均。一般而言,在个体学习器的性能相差较大的时,宜使用加权平均法,而在个体学习器性能相近是宜采用简单平均法。

2)投票法
在分类任务中,最常见的结合策略是使用投票法

2.1)绝大多数投票法
在这里插入图片描述
2.2)相对多数投票法
在这里插入图片描述
2.3)加权投票法
在这里插入图片描述
3)学习法

当训练数据较多时,一种常见的强大的结合策略是使用学习法,即通过另一种学习器来结合。Stacking是学习器的典型代表。
Stacking先从初始数据中产生初级学习器,然后生成一个新的数据集用于训练次级学习器,在这个新的数据集中,初级学习器的输出被当做样例输入特征,而初始样本的标记仍被当做样例标记,算法如下:
在这里插入图片描述
一般不直接采用初级学习器的训练集来产生次训练机,这样容易过拟合,一般使用交叉验证和留一法的方式。

随机深林

随机森林在决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择,简单来说,传统的决策树在选择划分属性时实在当前节点的属性集合中选择一个最优属性,而在随机森林中,对基决策树的每一个节点,先从该节点的属性集合中随机选择一个包含K个属性的子集,然后再从这个子集中选择最优属性划分。

随着学习器数目的增加,随机森林通常会收敛到一个更低的泛化误差,值得一提的是随机森林的训练效率一般由于Bagging,因为在个体决策树的构建过程中,Bagging使用的确定的决策树,在选择划属性时要对结点所有属性进行考察,而随机森林使用的随机型决策树,只需考察一个属性集。

随机森林的优缺点

优点:
1)在当前所有算法中,具有极好的准确率

2)能够有效地运行在大数据集上

3)能够处理具有高维特征的输入样本,而且不需要降维

4)能够评估各个特征在分类问题上的重要性

5)在生成过程中,能够获取到内部生成误差的一种无偏估计

6)对于缺省值问题也能够获得很好得结果

缺点:
1)当随机森林的决策树个数较多时,训练时会消耗大量的时间和空间

2)在某些噪声较大的分类和回归问题上会过拟合

3)对于有不同级别的属性的数据,级别划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产生的属性权值是不可信的

随机森林的推广

1)Extra Tree

1.1)RF会随机采样来作为子决策树的训练集,而Extra Tree每个子决策树采用原始数据集训练。

1.2)RF在选择划分特征点的时候会和传统决策树一样,会基于信息增益、信息增益率、基尼系数、均方差等原则来选择最优的特征值。Extra Tree则是随机选择一个特征值来划分决策树。

1.3)由于Extra Tree是随机选择特征点进行划分,所以最后得到的决策树规模会大于RF生成的决策树,Extra Tree决策树的方差会减少,泛化能力比RF更强。

2)Totally Random Tree Embedding(TRTE)

2.1)TRTE 是一种非监督的数据转化方式。将低维的数据集映射到高维,从而让高维的数据更好得用于分类回归模型。

2.2)TRTE的算法的转化过程类似于RF算法,建立T个决策树来拟合数据。当决策树构建完成之后,数据集里的每个数据在T个决策树中叶子节点的位置就固定下来了,将位置信息转换为向量即完成了算法的转换。

随机森林的sklearn算法参数

在这里插入图片描述
(PS:本图借鉴博客

随机森林的应用

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75
df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)
train, test = df[df['is_train']==True], df[df['is_train']==False]
features = df.columns[:4]
clf = RandomForestClassifier(n_jobs=2)
y, _ = pd.factorize(train['species'])
clf.fit(train[features], y)
preds = iris.target_names[clf.predict(test[features])]
print(pd.crosstab(test['species'], preds, rownames=['actual'], colnames=['preds']))

猜你喜欢

转载自blog.csdn.net/xianqianshi3004/article/details/86663157