![9500a4211f728d23db7e246d8bdb5205.png](https://i-blog.csdnimg.cn/blog_migrate/212544d42eef7e17bb5de8be4cf6d164.jpeg)
XGboost: 监督学习
是什么:
XGBoost Extreme Gradient Boosting 梯度提升决策树,解决有监督学习问题(监督学习:有n个特征和一个标签组成.标签为:比如标识是否患癌症,是为1,不是为0.)(“知识”蕴含在参数中)
Tree Boosting(Boosting 目前最好的机器学习方法之一,boosting最开始使用最简单的模型去拟合数据,得到一个比较一般的结果,然后不断向模型中添加简单模型,即层数较浅的模型,随着树的增多,整个boosting 模型的复杂度逐渐升高,接近数据本身的复杂度,达到最佳水平.) 的一个代表为梯度提升决策树Gradient Boosting Decision Tree GBDT
决策树的复杂度体现在树的深度上,xgboost使用了一种替代指标,即叶子节点的个数.
gbdt是用监督学习数据训练一棵树,得出预测值后,使用预测值和真值的偏差,相减既残差,训练第二棵树;此时不再使用真值,而是使用残差作为标准答案,再次训练,得到每个样本的残差,以此类推,不断训练.可以人为指定树的总棵树,也可以通过监控某些指标来停止训练.
gbdt 的核心在于后面的树拟合的是前面预测值的残差,这样可以一步步的逼近真值. 通过拟合可以逼近真值是由于使用了平方损失作为损失函数. xgboost的方法是将损失函数做泰勒展开到第二阶,使用前两阶作为改进的残差. 传统的gbdt使用的残差是泰勒展开到一阶的结果.
Boosting算法的其中一种(boosting算法是将许多弱分类器(复合树模型)集成在一起,形成一个强分类器.所用到的树模型是cart回归树模型).将每棵树的输出值,相加,得出最终的预测值.
一般监督学习,两步:定出模型确定参数,二是根据训练数据找出最佳的参数值.
找出最佳参数:通过目标函数来找出最佳参数(将模型预测值规约到0到1,然后与该条数据的真实标签值0或1 做差,再求平方. 这个平方值越大,表名预测的越不准. 这就是模型的预测误差. ) 对预测全集的预测误差求和,得出一组具体参数的预测好坏的度量值.
通过正则化对参数实施一定的控制,防止某一相关性不高的参数过度影响预测结果,通常的正则化是L2正则(也就是所有参数的平方和,该和应该尽可能的小.) ,通过正则化项来限制模型复杂度.
正则化是为了限制模型的复杂度的. 模型越复杂,就越有可能“记住”训练数据,导致训练误差达到很低,而测试数据却很高,也就是过拟合. 在机器学习领域,正则化大多以惩罚函数的信息存在于目标函数中. 在训练时,不能只顾最小化误差,同时模型的复杂度也 不能太高.
对于回归问题,使用的损失函数是MSE;对于分类问题,常用是的损失函数是对数损失函数
在GBDT的基础上进行改进,更强大,范围更广.
一般和sklaern一起使用,单独下载xgboost.
开源软件库,提供了一个梯度提升框架. 自动利用cpu的多线程进行并行
除了可以在单一机器上运行,也支持运行在分布式框架上,比如hadoop,spark,flink.,可以在scikit-learn中使用.
优点:
1.自动利用cpu的多线程进行并行(提升速度). xgboost的并行是在特征粒度上的,每一颗数的构造都依赖于前一棵树. xgboost在训练之前,预先对数据进行排序,然后保存,在以后的迭代中重复使用这个结果.减小计算量.
2.正则化,利用正则项控制模型的复杂度,防止过拟合.
3.灵活性:可以自定义目标函数和评估函数(函数需要满足二阶可导).
4.缺失值处理.:自动学习出分裂方向.
5.剪枝 :先建立所有可能的子树,在反向机芯剪枝.
6.内置交叉验证:可以在每一轮boosting迭代中使用交叉验证,获得最优boosting迭代次数.
xgboost可以训练的数据格式:
libsvm ,numpy,xgboost(加载的数据存储在对象DMatrix中).
使用
xgboost python 使用
Introduction to Boosted Trees
# 导入相关包
import pandas as pd
import numpy as np
import xgboost as xgb
import matplotlib.pylab as plt
%matplotlib inline
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
# 数据集
from sklearn.datasets import make_classification
# X为样本特征,y为样本类别输出, 共10000个样本,每个样本20个特征,输出有2个类别,没有冗余特征,每个类别一个簇
X, y = make_classification(n_samples=10000, n_features=20, n_redundant=0, n_clusters_per_class=1, n_classes=2, flip_y=0.1)
# 随机初始化了一个二分类的数据集
# 分成了训练集和验证集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
# 训练集和验证集分别初始化了一个DMatrix,有了DMatrix,就可以做训练和预测了。
dtrain = xgb.DMatrix(X_train,y_train)
dtest = xgb.DMatrix(X_test,y_test)
param = {'max_depth':5, 'eta':0.5, 'verbosity':1, 'objective':'binary:logistic'}
raw_model = xgb.train(param, dtrain, num_boost_round=20)
# 使用sklearn风格构造函数
sklearn_model_new = xgb.XGBClassifier(max_depth=5,learning_rate= 0.5, verbosity=1, objective='binary:logistic',random_state=1)
# 训练集的准确率
from sklearn.metrics import accuracy_score
pred_train_raw = raw_model.predict(dtrain)
for i in range(len(pred_train_raw)):
if pred_train_raw[i] > 0.5:
pred_train_raw[i]=1
else:
pred_train_raw[i]=0
print (accuracy_score(dtrain.get_label(), pred_train_raw))
# 验证集的准确率
pred_test_raw = raw_model.predict(dtest)
for i in range(len(pred_test_raw)):
if pred_test_raw[i] > 0.5:
pred_test_raw[i]=1
else:
pred_test_raw[i]=0
print (accuracy_score(dtest.get_label(), pred_test_raw))
# xgboost 参数
# 1.xgboost类库参数
# 2.弱学习器参数
# 3.其他参数
# xgboost 类库参数
# booster,n_estimators 和 objectve。
# booster:定义使用的弱学习器类型,默认为gbtree,cart决策树;线性弱学习器gblinear;dart。一般来说使用gbtree即可,无需调参
# n_estimators:定义xgboost模型的复杂度,即决策树弱学习器的个数,n_estimators大小,容易欠拟合,n_estimators太大,模型会过于复杂,一般需要调参选择。
# objectve:定义是分类还是回归,或其他问题。 以及对应的损失函数。
# 回归问题objectve一般使用reg:squarederror 即MSE均方误差
# 二分类问题一般使用binary:logistic
# 多分类问题一般使用:multi:softmax
# xgboost 弱学习器参数
# max_depth: 控制树的深度,数据少或者特征少可以无需设置此值;如果样本和特征也多,则需要限制最大深度。具体的取值一般要网络搜索调参。
# min_child_weight: 最小的子节点权重阈值。如果某个树节点的权重小于这个阈值,则不会再分裂子树,即这个树节点就是叶子结点。该权重使用的是该节点所有样本的二阶导数的和。需要网络搜索寻找最优值。
# gamma: xgboost的决策树分裂所带来的损失减小阈值。经过最大化后的值需要大于gamma,才能继续分裂子树,该值也需要通过网络搜索寻找最优值。
# subsample:子采样参数,不放回抽样。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。初期可以取值1,如果发现过拟合后可以网络搜索调参找一个相对小一些的值。
# colsample_bytree / colsample_bylevel / colsample_bynode 用于特征采样,默认是不做采样。 即使用所有的特征建立决策树。
# colsample_bytree 控制整棵树的特征采样比例
# colsample_bylevel 控制某一层的特征采样比例
# colsample_bynode 控制某一个树节点的特征采样比例。
# 比如有64个特征,则如果三个参数都是0,5,则某一个树节点分裂时,会随机采样8个特征分类子树。
# reg_alpha / reg_lambda xgboost的正则化系数。
# reg_alpha L1正则化系数
# reg_lambda L2正则化系数。
# 一般先调max_depth ,min_child_weight 和gamma.如果有过拟合的情况,再尝试调后面几个参数
# 其他参数
# learning_rate 控制每个弱学习器的权重缩减系数。较小的learning_rate 意味着我们需要更多的弱学习器的迭代次数。
# 通常使用补偿和迭代最大次数来决定算法的拟合效果,通过参数n_estimators 和 learning_rate 一起使用。
# 通常先固定一个learning_rate 然后调完n_estimators ,在调完其他参数后,最好再来调learning_rate和n_estimators
# n_jobs 控制算法的并发线程数,scale_pos_weight 用于类别不平衡时,负例和正例的比例。
# importance_type 查询各个特征的重要性程度。 参数选择有:gain;weight;cover;total_gain;total_cover
# weight 通过特征被选择作为分裂特征的计数来计算重要性
# gain 和total_gain 通过计算特征被选择做分裂特征时带来的平均增益和总增益来计算重要性。
# cover 和 total_cover 通过计算特征被选中做分裂时的平均样本覆盖度和总体样本覆盖度来计算重要性
# 调用booster的get_score方法获取对应的特征权重。
# xgboost 网络搜索调参
# sklearn 的网络搜索类 GridSearchCV 结合来调参。
# 实例:
gsCv = GridSearchCV(sklearn_model_new,
{'max_depth': [4,5,6],
'n_estimators': [5,10,20]})
gsCv.fit(X_train,y_train)
print(gsCv.best_score_)
print(gsCv.best_params_)
# 根据如下,搜索的基础之上,调整learning_rate
sklearn_model_new2 = xgb.XGBClassifier(max_depth=4,n_estimators=10,verbosity=1, objective='binary:logistic',random_state=1)
gsCv2 = GridSearchCV(sklearn_model_new2,
{'learning_rate': [0.3,0.5,0.7]})
gsCv2.fit(X_train,y_train)
print(gsCv2.best_score_)
print(gsCv2.best_params_)
# 通过网络搜索的参数,再次构造模型
sklearn_model_new2 = xgb.XGBClassifier(max_depth=4,learning_rate= 0.3, verbosity=1, objective='binary:logistic',n_estimators=10)
sklearn_model_new2.fit(X_train, y_train, early_stopping_rounds=10, eval_metric="error",eval_set=[(X_test, y_test)])
# sklearn_model_new 保存模型
# sklearn_model_new.save_model('test.model')
# 导出模型
# sklearn_model_new.dump_model('dump.raw.txt') # 或者是json 等其他文件格式
# 导出模型和特征映射
# sklearn_model_new.dump_model('dump.raw.txt','featmap.txt')
# 加载模型
# sklearn_model_new = xgb.Booster({'nthread':4}) # init model
# sklearn_model_new.load_model("model.bin") # load data
相关技术:randomForest ,gbm,glmnet.
参考:
XGBoost Documentation 官网
https://zh.wikipedia.org/zh-hans/XGBoost
xgboost: 速度快效果好的boosting模型
Python机器学习笔记:XgBoost算法 - 战争热诚 - 开发者的网上家园
XGBoost简介_wuxiaosi808的博客-CSDN博客
https://www.google.com/search?ei=DbpxX-nxCKXj9AOa1oGwBQ&q=xgboost+python+%E4%BD%BF%E7%94%A8&oq=xgboost+python+%E4%BD%BF%E7%94%A8&gs_lcp=CgZwc3ktYWIQAzIFCCEQoAE6AggAOgYIABAMEAo6BAgAEBM6CAgAEAoQHhATOgYIABAeEBM6CAgAEAUQHhATOgoIABAIEAoQHhATOggIABAIEB4QE1C8FFjmG2C7HWgBcAB4AIABogKIAeAIkgEDMi00mAEAoAEBqgEHZ3dzLXdpesABAQ&sclient=psy-ab&ved=0ahUKEwiprKyp0YvsAhWlMX0KHRprAFYQ4dUDCA0&uact=5
xgboost 算法原理_哆啦A梦的博客-CSDN博客
XGBoost类库使用小结 - 刘建平Pinard - 开发者的网上家园 刘建平
刘建平Pinard - 博客园 刘建平
章华燕:史上最详细的XGBoost实战 xgboost参数