一、集成学习(Ensemble Learning)
\quad\quad 当我们在做重要决定时,大家可能都会考虑吸取多个人而不只是一个人的意见。机器学习处理问题时,又何尝不是如此?
集成学习的思想就是将若干个学习器(分类器&回归器)组合之后产生一个新学习器;
- 一般结构如下:
- 先产生一组“个体学习器”;
- 再用某种策略将它们结合起来;
- 最后通过“投票法”或者其他方法产生输出
- 集成学习的主要思想有:
- Bagging:代表是
随机森林(RF)
- Bosting:代表是
AdaBoost
、GBDT
- Stacking:由于深度学习的发展,此方法现在基本不用
- 为什么要用集成学习呢?
- 弱分类器间存在一定的差异性,这会导致分类的边界不同,也就是说可能存在错误。那么将多个弱分类器合并后,就可以得到更加合理的边界,减少整体的错误率,实现更好的效果;
- 对于数据集过大或者过小,可以分别 进行划分和有放回 的操作产生不同的数据子集,然后使用数据子集训练不同的分类器,最终再合并成为一个大的分类器;
- 如果数据的划分边界过于复杂,使用线性模型很难描述情况,那么可以训练多个模型,然后再进行模型的融合;
- 对于多个异构的特征集的时候,很难进行融合,那么可以考虑每个数据集构建一个分类模型,然后将多个模型融合。
二、Bagging
Bagging
方法又叫做自举汇聚法(Bootstrap Aggregating
):
\quad\quad 思想是:在 M M M 个样本的原始数据集上通过有放回的抽样的方式,重新选择出 M M M 个新数据集来分别训练 M M M 个分类器的集成技术。也就是说这些模型的训练数据中允许存在重复数据。
-
Bagging
方法训练出来的模型在预测新样本分类的时候,会使用多数投票或者求均值的方式来统计最终的分类结果。 -
Bagging
方法的弱学习器可以是基本的算法模型,比如:Linear
、Ridge
、Lasso
、Logistic
、Softmax
、ID3
、C4.5
、CART
、SVM
、KNN
等。
备注:
Bagging
方式是有放回的抽样,并且每个子集的样本数量必须和原始样本数量一致,但是子集中允许存在重复数据。
Bagging
训练过程以及预测过程:
三、随机森林
随机森林是在 Bagging
策略的基础上进行修改后的一种算法:
- 从样本集中用
Bootstrap
采样选出n
个样本; - 从所有属性中 随机选择
K
个属性,选择出最佳分割属性作为节点创建决策树; - 重复以上两步
m
次,即建立m
棵决策树; - 这
m
个决策树形成随机森林,通过 投票表决 结果决定数据属于那一类
决策树
在属性划分上是在当前节点的所有属性集合中选择一个属性作为最优划分属性;- 而在
RF
中,对决策树的每个节点,先从该结点的所有属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优划分属性。
注:这里的投票表决一般采用的经过优化后的加权投票表决
RF
算法在实际应用中具有比较好的特性,应用也比较广泛,主要应用在:分类
、回归
、特征转换
、异常点检测
等。常见的R
F变种算法如下:
- Extra Tree
Extra Tree
是RF
的一种变种,原理基本和RF
一样,主要区别如下:
RF
是从原始数据集中有放回的随机采样来作为子决策树的训练集,而Extra Tree
每个子决策树都采用原始数据集训练;RF
在选择划分特征点的时候与传统决策树一样,会基于信息增益
、信息增益率
、基尼系数
、均方差
等原则来选择最优特征值;而Extra Tree
会随机的选择一个特征值来划分决策树。
Extra Tree
因为是随机选择特征值的划分点,这样会导致决策树的规模一般大于RF
所生成的决策树。也就是说Extra Tree
模型的方差相对于RF
进一步减少。在某些情况下,Extra Tree
的泛化能力比RF
的强。
- Totally Random Trees Embedding(TRTE)
TRTE
是一种非监督的数据转化方式。将低维的数据集映射到高维,从而让映射到高维的数据更好的应用于分类回归模型:
TRTE
算法的转换过程类似RF
算法的方法,建立T
个决策树来拟合数据。- 当决策树构建完成后,数据集里的每个数据在
T
个决策树中叶子节点的位置就定下来了,将位置信息转换为向量就完成了特征转换操作
例如:
- Isolation Forest
IForest
是一种异常点检测算法,使用类似 RF
的方式来检测异常点;IForest
算法和 RF
算法的区别在于:
- 在随机采样的过程中,一般只需要少量数据即可;
- 在进行决策树构建过程中,
IForest
算法会 随机选择 一个划分特征,并对划分特征随机选择一个划分阈值; IForest
算法构建的决策树一般深度max_depth
是比较小的。
区别原因:目的是异常点检测,所以只要能够区分异常的即可,不需要大量数据;另外在异常点检测的过程中,一般不需要太大规模的决策树。
对于异常点的判断如下:
将测试样本
x
x
x 拟合到T
棵决策树上。计算在每棵树上该样本的叶子节点的深度
h
t
(
x
)
h_t(x)
ht(x)。从而计算出平均深度
h
(
x
)
h(x)
h(x);然后就可以使用下列公式计算样本点
x
x
x的异常概率值,
p
(
x
,
m
)
p(x,m)
p(x,m) 的取值范围为
[
0
,
1
]
[0, 1]
[0,1],越接近于1,则是异常点的概率越大。
p
(
x
,
m
)
=
2
−
h
(
x
)
c
(
m
)
p(x,m)=2^{-\frac{h(x)}{c(m)}}
p(x,m)=2−c(m)h(x)
其中,
c
(
m
)
=
2
l
n
(
m
−
1
)
+
ξ
−
2
×
m
−
1
m
c(m) = 2ln(m-1)+\xi - 2 \times \frac{m-1}{m}
c(m)=2ln(m−1)+ξ−2×mm−1;
m
m
m 为样本个数,
ξ
\xi
ξ 为欧拉参数
当平均深度比较大的时候, h ( x ) c ( m ) \frac{h(x)}{c(m)} c(m)h(x) 变大, 2 x 2^x 2x 在负方向接近 0,所以深度越大, p ( x , m ) p(x,m) p(x,m) 越接近 1,也即异常点概率越大;相反越小。
因为深度越大,说明该样本要通过更多的特征来划分,那么存在异常的可能性就越大。
四、案例
案例源代码可见:Github
sklearn
库下分类随机森林类RandomForestClassifier
API:
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)
常用参数说明:
n_estimators
(default = 10):森林里的树木数量criterion
(default =“gini”):分类属性的方法,支持的标准是基尼杂质的“gini”和信息增益的“熵”max_depth
:树的最大深度min_samples_split
(default = 2):拆分内部节点所需的最小样本数min_samples_leaf
(default = 1):叶子节点所需的最小样本数max_features
:寻找最佳分割时要考虑的特征数量也即前面提到的 K K Krandom_state
:如果是int
,则random_state
是随机数生成器使用的种子 ;如果是RandomState
实例,则random_state
是随机数生成器;如果没有,随机数生成器所使用的RandomState
实例np.random
sklearn
库中的ensemble.BaggingRegressor
API:
sklearn.ensemble.BaggingRegressor(base_estimator = None,n_estimators = 10,
max_samples = 1.0,max_features = 1.0,bootstrap = True,bootstrap_features = False,
oob_score = False,warm_start = False,n_jobs = None,random_state = None,verbose = 0 )
常用参数说明:
base_estimator
:弱学习器;如果为None,则弱学习器是决策树n_estimators
:弱学习器的数目max_samples
(默认值= 1.0):从X中抽取的样本数量,用于训练每个弱学习器,一般写成float
表示占所有样本的比例max_features
(默认值= 1.0):每个弱学习器的特征数目,一般写成float
表示占所有特征的比例random_state
:和上面的一样
1、宫颈癌预测
本案例使用宫颈癌数据:数据地址
使用 sklearn
库的分类随机森林 RandomForestClassifier
模型训练评估:
- 读取数据
- 划分数据(获取X,Y)
- 数据处理(异常值处理)
- 数据分割(训练集和测试集)
- 数据归一化
- 模型构建、训练
- 模型评估
- 模型预测
- 计算ROC/AUC,并画图
代码可见:01_宫颈癌预测.py
2、随机森林不同决策树数目和深度
本案例同样使用宫颈癌数据,基于随机森林中不同数目的决策树和不同深度的决策树进行构建模型,进行比较。
代码可见:02_宫颈癌预测_不同个数及深度决策树深度.py
3、随机森林可视化
本案例使用宫颈癌数据,进行了可视化随机森林的每个决策树,使用了100个决策树,每个决策树深度为1:
forest = RandomForestClassifier(n_estimators=100, criterion='gini', max_depth=1, random_state=0)
代码可见:03_随机森林可视化.py
4、Bagging思想应用于回归模型
本案例基于波士顿房屋租赁数据,比较线性回归(LinearRegression)
和使用Bagging
集成线性回归:
BaggingRegressor(LinearRegression(), n_estimators=50, max_samples=0.7,
max_features=0.8, random_state=0)
结果:
线性回归:
训练集上R^2:0.77301
测试集上R^2:0.58922
Bagging集成线性回归:
训练集上R^2:0.76471
测试集上R^2:0.56409
本来线性回归模型的效果就还可以,所以经过集成,效果并没有得到提升;
代码可见:04_Bagging思想应用于回归模型.py
五、总结
RF的主要优点:
- 训练可以并行化,对于大规模样本的训练具有速度的优势;
- 由于进行随机选择决策树划分特征列表,这样在样本维度比较高的时候,仍然具有比较高的训练性能;
- 可以给出各个特征的重要性列表;
- 由于存在随机抽样,训练出来的模型方差小,泛化能力强;
RF
实现简单;- 对于部分特征的缺失不敏感。
RF的主要缺点:
- 在某些噪音比较大的特征上,
RF
模型容易陷入过拟合; - 取值比较多的划分特征对
RF
的决策会产生更大的影响,从而有可能影响模型的效果。
参数 | RandomForestClassifier | RandomForestRegressor |
criterion | 指定划分标准,默认为gini,不支持其它参数 | 指定划分标准,可选”mse”和”mae”; 默认mse |
loss | 不支持 | 指定误差的计算方式,可选参数”linear”, “square”, “exponential”, 默认为”linear”;一般不用改动 |
n_estimators | 最大迭代次数,也就是最多允许的决策树的数目,值过小可能会导致欠拟合,值过大可能会导致过拟合,一般50~100比较适合,默认10 | |
max_features | 给定在进行最佳特征划分的时候,选择多少个特征进行考虑;默认为auto;max_features=sqrt(n_features) | |
max_depth | 给定树的深度,默认为None,表示一致扩展到叶子节点足够纯或者样本数小于min_samples_split | |
min_samples_split | 给定树构建过程中,叶子节点中最少样本数量,默认为2 | |
min_samples_leaf | 给定一棵树最少叶子数量,默认为1 | |
bootstrap | 是否进行有放回的重采样,默认为True |