天天看点

趋势预测方法(七)XGBoost_决策树XGBoost

XGBoost

a基本原理:

XGBoost算法预测时序数据的原理和GBDT算法原理类似,这里大致再提一下。用多个回归树将来拟合训练集,拟合好的模型需要做到多个回归树的结果之和训练集的结果一致,将该模型保存起来,之后只需要将要预测的数据再过一遍模型,即可得到预测数据结果。

b算法原理:

XGBoost(由陈天奇大佬开发,可以理解为X (Extreme) GBoosted)算法可以看作是GBDT算法的plus版本,本质上还是一个GBDT。

XGBoost与GBDT的区别主要还是目标函数的不同,目标函数只依赖于每个数据点在误差函数上的一阶导数和二阶导数。由于之前的目标函数求最优解的过程中只对平方函数有便利性,对于其他的平方损失函数处理会比较复杂。现在通过二阶泰勒展开式的变换,这样就可以比较方便的求解其他损失函数了。

c方法优缺点:

可以看成对于GBDT算法有很多的优点,缺点则是和它的改进算法Light GBM来讲的,它的缺点也就是Light GBM的优点,所以这里就先不讨论XGBoost的缺点了,在讲Light GBM的时候会写到。

对于GBDT的优势有:

  1. XGBoost的基分类器不仅可以是CART分类器,还支持线性分类器。
  2. GBDT在优化时只用到一阶导数,而XGBoost可以做到二阶泰勒展开。
  3. XGBoost在样本存在缺失值时,能自动学习分裂方向。
  4. XGBoost不仅可以防止过拟合,还能降低计算的复杂度,效率更高。
  5. XGBoost可以在每次迭代之后,为叶子节点分配学习速率,降低每棵树的权重,减少每 棵树的影响,为后面提供更好的学习空间。
  6. 可以分配多个cpu核心进行模型训练,减少模型训练时间。

d算法入口:

Sklearn里面没有集成XGBoost模型,但是网上有一个xgboost模块,需要安装才能使用

pip install xgboost

# xgboost模型参数

params = {

    'booster':, # 用什么方式建树

    'objective':,   # 多分类问题

    'num_class':,  # 类别数,与multi softmax并用

    'gamma':,    # 用于控制是否后剪枝的参数,越大越保守,一般0.1 0.2的样子

    'max_depth':,  # 构建树的深度,越大越容易过拟合

    'lambda':,  # 控制模型复杂度的权重值的L2 正则化项参数,参数越大,模型越不容易过拟合

    'subsample':, # 随机采样训练样本

    'colsample_bytree':,# 这个参数默认为1,是每个叶子里面h的和至少是多少

    'silent':,  # 设置成1 则没有运行信息输入,最好是设置成0

    'eta':,  # 如同学习率

    'seed':,# random seed

    'nthread':,  #CPU线程数

    #'eval_metric':

}
           

e实例参考:

# -*- coding: utf-8 -*-
'''
    建立XGBoost决策树,并预测
'''

from sklearn.datasets import make_hastie_10_2
import xgboost


def change_y(y):  # 转化label的值,由原来的[-1,1]为[0,1]
    for i in range(len(y)):
        if y[i] == -1.0:
            y[i] = 0.0
    return y


# 使用make_hastie_10_2随机生成一组十维的数据X,和对应的输出值y,共12000条
X, y = make_hastie_10_2(random_state=0)
y = change_y(y)
dtrain = xgboost.DMatrix(X[:4000], label=y[:4000])
dtest = xgboost.DMatrix(X[4000:8000], label=y[4000:8000])
y_test = y[8000:]

# 配置基本参数
params = {'max_depth': 4,  # 最大深度
          'booster': 'gbtree',
          'seed': 0,  # random seed
          'silent': 0,  # 设置成1 则没有运行信息输入,最好是设置成0
          'lambda': 10,  # 控制模型复杂度的权重值的L2 正则化项参数,参数越大,模型越不容易过拟合
          'eta': 0.5,  # 如同学习率
          'gamma': 0.1,  # 用于控制是否后剪枝的参数,越大越保守,一般0.1 0.2的样子
          'num_class': 2  # 类别数
          }

# 迭代拟合再预测
xgb = xgboost.train(params=params, dtrain=dtrain, num_boost_round=100, evals=[(dtrain, 'train'), (dtest, 'eval')])
ypred = xgb.predict(xgboost.DMatrix(X[8000:], missing=-999.0))

error = 0
for i in range(ypred.shape[0]):  # 输出测试数据所有的预测和真实值
    print(ypred[i], y_test[i])
if ypred[i] != y_test[i]:
    	error += 1

print('错误率:{}'.format(error / ypred.shape[0]))
           

这次还是以之前GBDT模型的数据为例,运行结果如下

趋势预测方法(七)XGBoost_决策树XGBoost
趋势预测方法(七)XGBoost_决策树XGBoost

f参考文献:

终于有人说清楚了--XGBoost算法 https://www.cnblogs.com/mantch/p/11164221.html

机器学习算法(15)之Xgboost算法 https://blog.csdn.net/qq_20412595/article/details/82621744

xgBoost的优缺点 https://blog.csdn.net/smartcat2010/article/details/103219643

Python机器学习笔记:XgBoost算法 https://www.cnblogs.com/wj-1314/p/9402324.html