集成算法(装袋,随机森林,boosting)

集成学习定义

将多个单个学习器集成在一起,使它们共同完成学习任务,已达到提高预测准确率的目的,也称“多分类器系统”
集成算法(装袋,随机森林,boosting)_第1张图片

例:做练习题的时候题目的准确率不高,通过多个学生的答案进行核对,提高题目的准确率

分两大类:

装袋 bagging,随机森林
提升 boosting,adaboost,GBDT,XGBoot

集成学习一般过程

  • 令D表示原始训练数据集,k表示基分类器 (基学习器)的个数,Z表示测试数据集。
  • for i=1 to k do 由D创建训练集Di 由Di创建基分类器Ci
  • end for
  • for 每一个测试样本do
    C*(x)=Vote(C1(x),C2(x),…,Ck(x)) end for

如何对学习结果进行结合

投票法 对于分类问题的预测。
平均法 对于数值类的回归预测。分为:平均法和加权平均法
学习法 为了解决投票法和平均法误差较大的问题。在弱学习器之后再加一层学习器

集成方法:

  • 一种是使用训练集的不同子集训练得到不同的基分类器。(bagging)
  • 另一种方法是使用同一个训练集的不同属性子集训练得到不同的基分类器。(随机森林)

Bagging:

对训练集有放回地抽取训练样例,从而为每一个基本学习器都构造出一个与训练集相当大小但各不相同的训练集,从而训练出不同的基本学习器;该算法是基于对训练集进行处理的集成方法中最简单、最直观的一种。
算法流程:
1.从大小为n的原始数据集D中独立随机地抽取n’个数据(n’<=n),形成一个自助数据集;

  • 重复上述过程,产生出K个独立的自助数据集;
  • 利用K个自助数据集训练出k个最优模型;
  • 分类问题:最终的分类结果由这k个最优模型各自的判别结果投票决定;回归问题:对K个模型的值求平均得到最终结果。
    集成算法(装袋,随机森林,boosting)_第2张图片
  • 另外由于每一个样本被选中的概率相同,因此装袋并不侧重于训练数据集中的任何特定实例。因此对于噪声数据,装袋不太受过分拟合的影响。
  • 关于bagging的一个有必要提及的问题:bagging的代价是不用单棵决策树来做预测,具体哪个变量起到重要作用变得未知,所以bagging改进了预测准确率但损失了解释性。

随机森林

随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。是bagging的一个扩展变体
即Bagging+决策树 = RF

  • 将若干个弱分类器的分类结果进行投票选择,从而组成一个强分类器,这就是随机森林bagging的思想。
  • 随机森林中有许多的分类树。我们要将一个输入样本进行分类,我们需要将输入样本输入到每棵树中进行分类。

影响RF分类性能的主要因素

  • 森林中单颗树的分类强度 (Strength):每颗树的分类强度越大,则随机森林的分类性能越好。
  • 森林中树之间的相关度 (Correlation):树之间的相关度越大,则随机森林的分类性能越差。

随机森林的构建方法

  1. 从原始样本集m个样本中使用bootstrap (有放回的随机抽样)采样法选出m个样本;
  2. 从所有n个属性中随机选择K个属性 (若k=n则基决策树的构建与传统的决策树相同,若K=1则是选择一个属性用于划分),一般令k的值为log2n;
  3. 选择最佳分割属性 (ID3, C4.5, CART)作为节点创建决策树;
  4. 每颗决策树都进行最大程度地生长,且不进行剪枝;
  5. 重复以上4步S次, 建立S颗决策树,即形成随机森林;
  6. 在分类问题中通过多数投票法决定输出属于哪一分类;在回归问题中输出所有决策树输出的平均值。

随机森林优点

  • 在当前所有算法中,具有极好的准确率。
  • 训练可以高度并行化,能够有效地运行在大数据集上,提高运行速率。
  • 能够处理具有高维特征的输入样本,而且不需要降维。
  • 能够评估各个特征在分类问题上的重要性 (特征选择中,Sklearn 为我们提供了很好的工具)。
  • 对部分特征的缺失不敏感。
  • 由于采用有放回随机抽样,训练出来的模型方差小,泛化能力强。

随机森林的缺点

  • 取值比较多的特征对RF的决策会产生更大的影响,有可能影响模型的效果。
  • Bagging改进了预测的准确率,但损失了解释性。
  • 在某些噪音比较大的特征上,RF模型还是容易陷入过拟合。

随机森林使用

#随机森林
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import matplotlib.pylab as plt

train_path = 'car.csv'

# 读取数据文件,如果数据文件放在带有中文字符的路径,read_csv方法需要指定参树#engine='python'
data_frame_train = pd.read_csv(train_path, encoding='gbk')
# 划分训练集和测试集的X,y
X_train, y_train = data_frame_train.values[:, :-1], data_frame_train.values[:, -1]

# 不调整参数的效果(oob_score=True:采用袋外样本来评估模型的好坏,反映了模型的泛化能力)
# 实例化模型
rfclf = RandomForestClassifier(oob_score=True, random_state=10)
# 模型训练
rfclf.fit(X_train, y_train)
# 模型对测试集进行预测
y_pre = rfclf.predict(X_train)   # 预测值
y_prb_1 = rfclf.predict_proba(X_train)[:, 1]  # 预测为1的概率
# 输出oob_score以及auc
print(rfclf.oob_score_) 


Boosting

Boosting的主要作用跟bagging类似也是一种把若干个基分类器整合为一个分类器的方法。 Boosting
是一个顺序过程,每个后续模型都会尝试纠正先前模型的错误。后续的模型依赖于之前的模型。

boosting工作方式:
第一步:从原始的数据集中创建一个子集。
第二步:最初,所有的数据点都具有相同的权重。
第三步:在此子集上创建基础模型。
第四步:该模型用于对整个数据集进行预测。
第五步:使用实际值和预测值计算误差。
第六步:预测错误的点获得更高的权重(这里有三个错误分类的右侧加号点将被赋予更高的权重)。
第七步:创建另一个模型并对数据集进行预测(此模型尝试更正先前模型中的错误
第八步:类似地,创建多个模型,每个模型校正先前模型的错误。
第九步:最终模型 (强学习器)是所有模型 (弱学习器) 的加权平均值。
因此Boosting结合了很多弱学习器来形成一个强学习器,单个模型表现不佳,但它们在数据集的某些部分表现很好。因此,每个模型实际上提升了集成的整体性能。

集成算法(装袋,随机森林,boosting)_第3张图片
集成算法(装袋,随机森林,boosting)_第4张图片
集成算法(装袋,随机森林,boosting)_第5张图片
提升是一个迭代的过程,用于自适应地改变训练样本的分布,使得基分类器聚焦在那些很难分的样本上

Adaboost

  • AdaBoost (Adaptive Boosting,自适应提升): 算法原理是将多个弱学习器进行合理的结合,使其成为一个强学习器。
  • Adaboost采用迭代的思想,继承了Boosting算法,每次迭代只训练一个弱学习器,训练好的弱学习器将参与下一次迭代。
  • 也就是说,在第N次迭代中,一共有N个弱学习器,其中N-1个是以前训练好的,其各种参数都不会改变,本次训练第N个学习器
  • 其中弱学习器的关系是第N个弱学习器更可能分对前N-1个弱学习器没分对的数据,最终分类输出要看这N个分类器的综合效果。

例子:
在这里插入图片描述
1.初始化10个样本的权值为W1=1/10
2.根据w1,在数据集D上抽样产生训练集D1
在这里插入图片描述
3.在D1上训练产生一个基分类器h1, 该分类器的最佳分裂点为k=0.75, x≤k, y=-1, x>k, y=1。使用该基分类器对原数据集D进行分类。
4.分类结果为10个样本你有三个样本分类错误,7个样本分类正确,他们分别是分类正确的样本: {0.4,0.5,0.6,0.7,0.8,0.9,1}, 分类错误的样本: {0.1,0.2,0.3}。
5.根据对原数据集D的分类结果,度量它的误差:
6.计算权重
7.更新权重进入第二轮提升过程,生成权重w2
8.根据权重w2的分布,通过对D进行抽样产生训练集D2
在这里插入图片描述
9.产生分类器h2
10.往复,得出结果
在这里插入图片描述

你可能感兴趣的:(集成算法(装袋,随机森林,boosting))