关于集成学习的简单描述

集成算法通过在数据上构建多个弱评估器,汇总所有弱评估器的建模结果,以获取比单个模型更好的回归或分类表现。弱评估器被定义为是表现至少比随机猜测更好的模型,即预测准确率不低于50%的任意模型。

集成算法包括两个部分:

bagging:一次性建立多个平行独立的弱评估器的装袋法。典型代表:随机森林

boosting:逐一构建弱评估器,经过多次迭代逐渐累积多个弱评估器的方法(提升法)。典型代表:xgboost、GBDT、adaboost

以梯度提升回归树为例子,了解下Boosting算法的流程为,梯度提升回归树是专注于回归的树模型的提升集成模型,最开始先建立一棵树,然后逐渐迭代,每次迭代过程中都增加一棵树,逐渐形成众多树模型集成的强评估器。

XGBoost就是由梯度提升树发展而来的。梯度提升树中可以有回归树也可以有分类树,两者都以CART树算法作为主流,XGBoost背后也是CART树(因而可以作回归),这意味着XGBoost中所有的树都是二叉的(这点非常重要,对研究树的结构和树的复杂度都有很重要的意义)

XGBoost可以处理回归,这是XGBoost的一个特色。

分类树和回归树

对于决策树而言,每个被放入模型的任意样本最终一个都会落到一个叶子节点上(预测环节)。而对于回归树,每个叶子节点上的值是这个叶子节点上所有样本的均值。

回归树的预测值 = 每个叶子节点的均值

分类树的预测值= 每个叶子节点少数服从多数。

XGB与GBDT的核心区别

以上是一颗树最后的预测结果,对于梯度提升回归树(GBDT)来说,每个样本的预测结果可以表示为所有树上的结果的加权求和:

其中, K是树的总数量, 代表第k棵树, rk是这棵树的权重, hk(xi)表示这棵树上的预测结果。

而对XGB来说,作为GBDT的改进,在预测值y上却有所不同。对于XGB来说,每个叶子节点上会有一个预测分数(prediction score),也被称为叶子权重。这个叶子权重就是所有在这个叶子节点上的样本在这一棵树上的回归取值。当只有一棵树的时候,就是提升集成算法返回的结果,但这个结果往往非常糟糕。当有多棵树的时候,集成模型的回归结果就是所有树的预测分数之和,假设这个集成模型中总共有 棵决策树,则整个模型在这个样本 上给出的预测结果为:

用fk(x)或者w来表示,其中k表示第k棵决策树, xi表示样本i对应的特征向量。

这个地方对比装袋法和提升法有新的比较,装袋法是一次性建立好多树,然后,基于平均的处理。而提升法是每次都在上次迭代的基础上再添加新的树进行迭代,两者是存在差异的。所以说,在装袋法中每棵树之间是平等的,而在提升算法中每棵树的关系是相互递进的。

实例讲解
 

from xgboost import XGBRegressor as XGBR #表示XGB的回归
from sklearn.ensemble import RandomForestRegressor as RFR #导入随机森林的回归作为XGB回归的对比
from sklearn.linear_model import LinearRegression as LinearR #导入线性回归来作为XGB回归的对比
from sklearn.datasets import load_boston #导入波士顿数据集
from sklearn.model_selection import KFold, cross_val_score as CVS, train_test_split as TTS #接着导入k折交叉验证、交叉验证分数、分训练集和测试集的类
from sklearn.metrics import mean_squared_error as MSE #导入模型评估指标,均方误差
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from time import time
import datetime
data = load_boston() #将波士顿数据集实例化
#波士顿数据集非常简单,但它所涉及到的问题却很多

data里面是一个类字典的模式,通过键的方式将特征矩阵和标签取出来

X = data.data #特征矩阵
y = data.target #特征标签

有了数据之后,就要把数据分成测试集和训练集

Xtrain,Xtest,Ytrain,Ytest = TTS(X,y,test_size=0.3,random_state=420) #测试集百分之30

 下面开始建模,首先,实例化:我们先建100棵树,fit代表开始训练,训练完之后的模型就是reg。

reg = XGBR(n_estimators=100).fit(Xtrain,Ytrain) #训练

那么用训练好的reg对测试样本进行预测:

reg.predict(Xtest) #传统接口predict

同样,可以导入score接口,直接对模型进行打分,这个分数输入测试的特征矩阵和测试的真实结果:

reg.score(Xtest,Ytest) #你能想出这里应该返回什么模型评估指标么?利用shift+Tab可以知道,R^2评估指标

返回的是一个值(R平方)

接下来是回归类模型另外一个常用评估指标,均方误差

y.mean()
MSE(Ytest,reg.predict(Xtest))#可以看出均方误差是平均值y.mean()的1/3左右,结果不算好也不算坏

feature_importances调用模型重要性分数,根据每一个所进行共享的打分。

reg.feature_importances_ #树模型的优势之一:能够查看模型的重要性分数,可以使用嵌入法(SelectFromModel)进行特征选择
#xgboost可以使用嵌入法进行特征选择

行到此处,我们已经基本建立了一个XGB的回归模型。下面对所建立的模型进行交叉验证。

新建立的模型与线性回归和随机森林比起来效果咋样

首先,还是来进行实例化建模,

reg = XGBR(n_estimators=100) #交叉验证中导入的没有经过训练的模型,即不需要点fit

填入交叉验证

CVS(reg,Xtrain,Ytrain,cv=5).mean()
#这里应该返回什么模型评估指标,还记得么? 返回的是与reg.score相同的评估指标R^2(回归),准确率(分类),cv是交叉验证的折数

交叉验证返回都是R^2。

PS:关于交叉验证的讨论,交叉验证分为严谨(只输入训练集)的交叉验证和不严谨(输入全数据)的交叉验证,因为全数据输入,有将训练过的数据重新作为测试集来使用的嫌疑,会使结果虚高,故而是不严谨。所以,我们先把全数据分成训练集和测试集,然后,把训练集放入到交叉当中,然后,将训练集分成n折,其中一折专做验证,剩下的n-1专做训练。那么会得到n-1组的交叉验证结果评分,我们选平分最高的评分模型,作为最终模型,来在测试集上进行训练,即可。交叉验证训练出的模型在完全未知的数据上也好,才算是性能好。

但其实并没有这么严谨,交叉验证本身就是一个不太严谨的东西,基于经验来说,有验证集没验证集没啥区别——  ——||。

查看返回的均方差结果

CVS(reg,Xtrain,Ytrain,cv=5,scoring='neg_mean_squared_error').mean()

对比随机森林和逻辑回归的效果,XGB回归还是挺好的。

 

在训练的过程中,如何判断该训练数据是否有潜力呢?如果经过训练的模型的学习能力展现的是过拟合或者欠拟合状态,说明这个模型还有很大潜力,可以通过调参的方式,避免过拟合、欠拟合状态。红色表示训练数据,绿色表示验证数据,验证数据准确率没有趋于稳定,而且,是朝下走的,中间图是在实际训练中的常态,如果测试数据的准确度无法进一步提高,哪怕以牺牲训练集上的准确度也是可以的,至少说让模型的过拟合减轻,右图是理想状态下,的情况但基本实际中不可能遇到。

那么如下图所示,左一是过拟合的,验证数据

通过图像验证过拟合还是欠拟合的方法,第一,测试集的曲线是否变化趋于稳定,第二,测试集和训练集数据是否差距足够小

 

如何保证模型的效果是逐渐变强的呢?

有放回随机抽样。可以有效防止过拟合,因为人为的打乱了所携带的信息。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值