目录:
第一部分:集成学习:
1,集成学习
2,结合策略
第二部分:Bagging与随机森林:
1,决策树:信息熵与信息增益
2,Bagging
3,随机森林
第三部分:随机森林的代码实现
第一部分:集成学习
1,集成学习
对于训练集数据,通过训练若干个个体学习器,通过一定的结合策略,就可以最终形成一个强学习器,以达到博采众长的目的。
集成学习通过将多个学习器进行结合,通常会获得比单一学习器显著优越的泛化能力。这对弱学习器尤为显著,因此集成学习的很多理论都是针对偌学习器进行的,由此基学习器有时也被直接成为弱学习器,这里的若学习器只是相对的概念,为了集成模型的效果,通常会选择较强的学习期作为基学习器。
集成学习的错误率:
上述式子的推导是基于一个关键假设:基学习器的误差相互独立。然而现实情况是,个体学习器都是为解决同一个问题训练出来的,它们之间显然不可能相互独立。而事实上,个体学习器的“准确性”和“多样性”本身就存在冲突。一般的,准确性很高之后,要增加多样性就需牺牲准确性。而如何产生并结合“好而不同”的个体学习器,恰是集成学习研究的核心。
而根据个体学习器生成方式的不同,目前集成学习方法大致可分为两大类,即个体学习器间存在强依赖关系、必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系、可同时生成的并行化方法;前者的代表是Boosting,后者的代表是和Bagging和“随机森林”(Random Forest)。
2,结合策略:
优点:
提高泛化性能
降低进入局部最小点的风险
扩大假设空间
1),平均法:简单平均、加权平均
适用范围:
规模大的集成,学习的权重较多,加权平均法易导致过拟合 ;
个体学习器性能相差较大时宜使用加权平均法,相近用简单平均法。
2),投票法:
绝对多数投票法:某标记超过半数;
相对多数投票法:预测为得票最多的标记,若同时有多个标记的票最高,则从中随机选取一个。
加权投票法:提供了预测结果,与加权平均法类似。
3),学习法
Stacking描述:先从初始数据集中训练出初级学习器,然后“生成”一个新数据集用于训练次级学习器。在新数据集中,初级学习器的输出被当做样例输入特征,初始样本的标记仍被当做样例
第二部分:Bagging与随机森林
1,决策树:信息熵与信息增益
信息熵常被用来作为一个系统的信息含量的量化指标,从而可以进一步用来作为系统方程优化的目标或者参数选择的判据。在决策树的生成过程中,就使用了熵来作为样本最优属性划分的判据。
信息熵的定义公式:
并且规定 0log(0) =0 。
信息熵的三个性质:
信息论之父克劳德·香农给出的信息熵的三个性质。
单调性,发生概率越高的事件,其携带的信息量越低;
非负性,信息熵可以看作为一种广度量,非负性是一种合理的必然;
累加性,即多随机事件同时发生存在的总不确定性的量度是
可以表示为各事件不确定性的量度的和,这也是广度量的一种体现。
香农从数学上严格证明了满足上述三个条件的
随机变量不确定性度量函数具有唯一形式:
其中,C为常数,将其归一化为C = 1,就得到了信息熵公式。
一个例子:
剪枝:决策树容易过拟合,需要剪枝来缩小树的结构和规模(包括预剪枝和后剪枝)。
2,Bagging
Bagging是并行式集成学习方法最著名代表,它基于自主采样法。
给定包含m个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过m此随机采样操作,我们得到含m个样本的采样集,初始训练集中有的样本在采样集里多次出现,有的则从未出现。因此,初始训练集中约有63.2%的样本出现在采样集中。
按上述方法,采样出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再集成,这就是Bagging的基本流程。在对预测输出进行结合时,Bagging通常对分类任务采用简单投票法,对回归任务使用简单平均法。若分类预测时出现两个类收到同样票数的情形,则最简单的做法是随机选择一个,也可进一步考察学习器投票的置信度来确定最终胜者。
自助采样法(Bootstrap sampling),即对于m个样本的原始训练集,我们每次先随机采集一个样本放入采样集,接着把该样本放回,也就是说下次采样时该样本仍有可能被采集到,这样采集m次,最终可以得到m个样本的采样集,由于是随机采样,这样每次的采样集是和原始训练集不同的,和其他采样集也是不同的,这样得到多个不同的弱学习器。
从上图可以看出,bagging的个体弱学习器的训练集是通过随机采样得到的。通过T次的随机采样,我们就可以得到T个采样集,对于这T个采样集,我们可以分别独立的训练出T个弱学习器,再对这T个弱学习器通过集合策略来得到最终的强学习器。
包外估计:
由于每个基学习器只使用了初始训练集中大约63.2%的样本,剩下的约36.8%的样本则可用作验证集来对泛化性能进行“包外估计”。为此,需记录每个基学习器所使用的训练样本,不妨令Dt表示ht实际使用的训练样本集,令Hoob(x)表示对样本x的包外预测,即仅考虑那些未使用x训练的基学习器在x上的预测,有:
则Bagging泛化误差的包外估计为:
从偏差-方差分解的角度看,Bagging主要关注降低方差(防止过拟合),因此它在不剪枝决策树、神经网络等容易受样本扰动的学习器上效用更为明显。
3,随机森林
随机森林是bagging的一个特化进阶版,所谓的特化是因为随机森林的弱学习器都是决策树。所谓的进阶是随机森林在bagging的样本随机采样基础上,又加上了特征的随机选择,其基本思想没有脱离bagging的范畴。
具体来说,传统决策树在选择划分属性时是在当前结点的属性集合(假定有d个属性)中选择一个最有属性;而在RF中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里的参数k控制了随机性的引入程度:若令k=d,则基决策树的构建与传统决策树相同;若令k=1,则是随机选择一个属性用于划分;一般情况下,推荐值k= log2d。
随机森林虽然只对bagging只做了一个小改动(特征的随机选择),但它简单、容易实现、计算开销小,在很多学习任务中展现出强大的性能,被誉为“代表集成学习技术水平的方法”。
Bagging中基学习器的多样性来自于样本扰动;而随机森林中基学习器的多样性来自样本扰动和属性扰动,这使得最终的泛化能力可通过个体学习器之间的差异度的增加而进一步提升。
随机森林中个体学习器的性能往往有所降低。然而,随着个体学习器数目的增加,随机森林通常会收敛到更低的泛化误差。
第三部分:随机森林的代码实现
这里仍然使用高效简洁的python语言,使用Random forest对:
代码语言:javascript复制import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import Imputer
data = pd.read_csv('datas/risk_factors_cervical_cancer.csv') # 加载数据
new_data = data.replace("?", np.NaN) # 缺省值处理
imputer = Imputer(missing_values='NaN', strategy='median')
x_y = imputer.fit_transform(new_data)
X_Y = pd.DataFrame(x_y)
feature_names = data.columns
X_Y.columns = feature_names # 将序列index转化成现实标签。
X = X_Y[feature_names[0:-4]] # 划分特征:x, y
Y = X_Y[feature_names[-4:]]
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=10) # 划分训练集,测试集。
standard_scaler = MinMaxScaler(X_train, Y_train
ss = MinMaxScaler()
X_train = ss.fit_transform(X_train, Y_train) #标准化数据
X_test = ss.transform(X_test)
X_train.shape
pca = PCA(n_components=2) # 降维
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)
forest = RandomForestClassifier(n_estimators=100, criterion='gini', max_depth=1, random_state=0)
forest.fit(X_train, Y_train) # 训练模型
y_predict = forest.predict(X_test) # 预测
Reference:
《西瓜书》
https://blog.csdn.net/qq_32690999/article/details/78759463
https://www.cnblogs.com/pinard/p/6131423.html
为什么说bagging是减少variance,而boosting是减少bias:https://www.zhihu.com/question/26760839/answer/40337791