赞
踩
XGBoost算法预测时序数据的原理和GBDT算法原理类似,这里大致再提一下。用多个回归树将来拟合训练集,拟合好的模型需要做到多个回归树的结果之和训练集的结果一致,将该模型保存起来,之后只需要将要预测的数据再过一遍模型,即可得到预测数据结果。
XGBoost(由陈天奇大佬开发,可以理解为X (Extreme) GBoosted)算法可以看作是GBDT算法的plus版本,本质上还是一个GBDT。
XGBoost与GBDT的区别主要还是目标函数的不同,目标函数只依赖于每个数据点在误差函数上的一阶导数和二阶导数。由于之前的目标函数求最优解的过程中只对平方函数有便利性,对于其他的平方损失函数处理会比较复杂。现在通过二阶泰勒展开式的变换,这样就可以比较方便的求解其他损失函数了。
可以看成对于GBDT算法有很多的优点,缺点则是和它的改进算法Light GBM来讲的,它的缺点也就是Light GBM的优点,所以这里就先不讨论XGBoost的缺点了,在讲Light GBM的时候会写到。
对于GBDT的优势有:
XGBoost的基分类器不仅可以是CART分类器,还支持线性分类器。
GBDT在优化时只用到一阶导数,而XGBoost可以做到二阶泰勒展开。
XGBoost在样本存在缺失值时,能自动学习分裂方向。
XGBoost不仅可以防止过拟合,还能降低计算的复杂度,效率更高。
XGBoost可以在每次迭代之后,为叶子节点分配学习速率,降低每棵树的权重,减少每 棵树的影响,为后面提供更好的学习空间。
可以分配多个cpu核心进行模型训练,减少模型训练时间。
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':
-
- }
- # -*- 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算法 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。