集成学习-学习记录

集成学习

在监督学习算法中,我们希望我们通过训练得到的模型是一个各方面表现稳定表现良好的模型,但是实际情况是训练得到的模型会是一个在某方面有所偏好的模型,通过集成多个学习器,通过多个学习器相结合,来获得一个比单一学习器更加优越的泛化性能。
一般集成学习会通过重采样来获得一定数量的样本,然后训练多个弱学习器(分类精度稍大于50%),然后采用特定的集成方法来选择分类结果。
集成学习分类:
目前根据个体学习器的生成方式,集成学习可以分为两大类:

  1. 个体学习器之间存在较强的依赖性,无法并行的生成只能串行生成的序列化方法:boosting类算法
  2. 个体学习器之间不存在强依赖关系,可以并行生成学习器:bagging和随机森林

随机森林

首先,了解一下Bagging算法和决策树算法

Bagging

Bagging的算法过程如下:
3. 由原始样本集中使用Bootstraping方法随机抽取n个训练样本,共进行k轮抽取,得到k组训练集。(k个训练集之间相互独立,元素可以重复)
4. 对于k个训练集,我们训练k个模型(这k个模型可以根据具体问题而定,比如决策树,knn等)
5. 对于分类问题:由投票法产生分类结果;
对于回归问题:由k个模型预测结果的均值作为最后预测结果(所有模型的重要性相同)

决策树

常用的决策树算法有ID3,C4.5,CART三种。三种算法的模型构造思想十分类似,只是采用了不同的指标。决策树模型的构建过程大致如下:
输入:训练集D,特征集A,阈值eps
输出:决策树T
6. 若D中所有样本属于同一类Ck,则T为单节点树,将类Ck作为该结点的类标记,返回T
7. 若A为空集,则没有特征作为划分依据,则T为单节点树,并将D中实例数的最大的类Ck作为该节点的类标记,返回T
8. 否则,计算A中各特征对D的信息增益(ID3)/信息增益比(C4.5),选择信息增益最大的特征Ag
9. 若Ag的信息增益(比)小于阈值eps,则置T为单节点树,并将D中实例数最大的类Ck作为该结点的类标记,返回T
10. 否则,按照特征Ag将D划分为若干非空子集Di,将Di中实例最大的类作为标记,构建子节点,由结点及其子节点构建树T,返回T
11. 对第i个子节点,以Di为训练集,以A-{Ag}作为特征集,递归地调用1~5,得到子树Ti,返回Ti

决策树的剪枝

决策树的剪枝主要是为了预防过拟合,主要思路是从叶结点向上回溯,尝试对某个节点进行剪枝,比较剪枝前后的决策树的损失函数值。最后通过动态规划就可以得到全局最优的剪枝方案。

随机森林

随机森林是一种重要的基于Bagging的集成学习方法,可以用来做分类,回归等问题
与Bagging过程类似,随机森林饿构建过程大致如下:

1.从原始训练集中使用Bootstraping方法随机有放回地采样选出m个样本,共进行n_tree次采样,生成n_tree个训练集
2.对于n_tree个训练集,分别训练n_tree个决策树模型
3.对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益比/基尼指数选择最好的特征进行分裂
4.每棵树都这样一直分裂下去,直到该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝
5.将生成的多克决策树组成随机森林。对于分类问题,按多棵树分类器投票决定最终分类结果;对于回归问题,由多棵树预测值的均值决定最终预测结果

GBDT

GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案。
GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学。
GBDT的算法过程:在这里插入图片描述

XGBOOST

xgboost类似于gbdt,但与gbdt相比,具有以下优点:
1.损失函数使用泰勒展开式二项逼近,而不是像gbdt里就是一阶导数
2.对树的结构进行了正则化约束,防止模型过度复杂,降低了过拟合的可能性
3.结点分裂的方式不同,gbdt是用的gini系数,xgboost是经过优化推导后的
xgboost是GB算法高效实现,xgboost中的基学习器可以是CART(gbtree)也可以是线性分类器(gbliner)。
(1)xgboost在目标函数中显示的加上了正则化项,基学习器是CART时,正则化项与树的叶子节点的数量T和叶子节点的值有关。
在这里插入图片描述
(2)GB中使用Loss Function对x的一阶导数计算出伪残差用于学习生成fm(x),xgboost不仅使用到了一阶导数,还是用了二阶导数。第t次的loss:
在这里插入图片描述
对上式做二阶泰勒展开:
在这里插入图片描述
(3)CART回归树中新招最佳分割点的衡量标准时最小化均方差,xgboost寻找分割点的标准是最大化Lsplit
在这里插入图片描述
xgboost算法的步骤和GB的基本相同,都是首先初试化给一个常数,gb是根据一阶导数ri,xgboost是根据一阶导数gi和二阶导数hi,迭代生成基学习器,相加更新学习器。

结合策略

平均集成

对数值型输出,最常见的结合策略就是使用平均法。
1.简单平均法
2.加权平均法(对于规模比较大的集成来说,权重参数比较多,较容易导致过拟合,所以加权平均法未必一定优于简单平均法)
一般而言,在个体学习器性能有较大的差异时,更适合使用加权平均法,而在个体学习器性能接近的时候,宜使用简单平均法。

投票集成

1.绝大多数投票法
若某标记得票数超过半数,则预测为该标记;否则拒绝预测
2.相对多数投票法
预测为得票最多的标记,若同时有多个标记获得最高票,则随机选择其中的一个
3.加权投票法

集成学习实战

随机森林

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier,ExtraTreesClassifier
from sklearn import datasets
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
wine = datasets.load_wine()
X = wine['data']
y = wine['target']

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2)
clf = RandomForestClassifier()

clf.fit(X_train,y_train)
y_ = clf.predict(X_test)

from sklearn.metrics import accuracy_score
accuracy_score(y_test,y_)
dt_clf = DecisionTreeClassifier()
dt_clf.fit(X_train,y_train)
dt_clf.score(X_test,y_test)
score = 0
for i in range(100):
    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2)
    dt_clf = DecisionTreeClassifier()
    dt_clf.fit(X_train,y_train)
    score+=dt_clf.score(X_test,y_test)/100
    
print('决策树多次运行准确率:',score)

score = 0 
for i in range(100):
    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2)
    clf = RandomForestClassifier(n_estimators=100)
    clf.fit(X_train,y_train)
    score+=clf.score(X_test,y_test)/100
print('随机森林多次运行准确率:',score)

在这里插入图片描述

xgboost

import xgboost as xgb
from sklearn.metrics import accuracy_score
import graphviz
from matplotlib import pyplot

dtrain=xgb.DMatrix(r'D:\\nlp\\agaricus.txt.train')
dtest=xgb.DMatrix(r'D:\\nlp\\agaricus.txt.test')
print(dtrain.num_col())#查看数据行数
print(dtrain.num_row())#查看数据列数

param={'max_depth':2,'eta':1,'silent':0,'object':'binary:logist'}
num_round=2

bst=xgb.train(param,dtrain,num_round)
train_preds=bst.predict(dtrain)
train_predictions=[round(value) for value in train_preds]
y_train=dtrain.get_label()
train_accuracy=accuracy_score(y_train,train_predictions)
print("Train Accuary:%.2f%%"%(train_accuracy*100.0))

preds=bst.predict(dtest)
predictions=[round(value) for value in preds]
y_test=dtest.get_label()
test_accuracy=accuracy_score(y_test,predictions)
print('Test Accuracy: %.2f%%'%(test_accuracy*100.0))

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值