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