Python实现Xgboost模型

更新时间:2023-05-20 08:41:03 阅读: 评论:0

Python实现Xgboost模型
2.安装xgboost包:命令管理器输⼊ pip install G:\GoogleDownload\xgboost-0.82-cp36-cp36m-win_amd64.whl
优点:(1)正则化:XGBoost在代价函数⾥加⼊了正则项,⽤于控制模型的复杂度。正则项⾥包含了树的叶⼦节点个数、每个叶⼦节点上输出的score的L2模的平⽅和。从Bias-variance tradeoff⾓度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防⽌过拟合,这也是xgboost优于传统GBDT的⼀个特性。
(2)并⾏处理:XGBoost⼯具⽀持并⾏。Boosting不是⼀种串⾏的结构吗?怎么并⾏的?注意XGBoost的并⾏不是tree粒度的并
⾏,XGBoost也是⼀次迭代完才能进⾏下⼀次迭代的(第t次迭代的代价函数⾥包含了前⾯t-1次迭代的预测值)。XGBoost的并⾏是在特征粒度上的。我们知道,决策树的学习最耗时的⼀个步骤就是对特征的值进⾏排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进⾏了排序,然后保存为block结构,后⾯的迭代中重复地使⽤这个结构,⼤⼤减⼩计算量。这个block结构也使得并⾏成为了可
能,在进⾏节点的分裂时,需要计算每个特征的增益,最终选增益最⼤的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进⾏。
(3)灵活性:XGBoost⽀持⽤户⾃定义⽬标函数和评估函数,只要⽬标函数⼆阶可导就⾏。whenyousaynothingatall
(4)缺失值处理:对于特征的值有缺失的样本,xgboost可以⾃动学习出它的分裂⽅向
(5)剪枝:XGBoost 先从顶到底建⽴所有可以建⽴的⼦树,再从底到顶反向进⾏剪枝。⽐起GBM,这样不容易陷⼊局部最优解。
(6)内置交叉验证:XGBoost允许在每⼀轮boosting迭代中使⽤交叉验证。因此,可以⽅便地获得最优boosting迭代次数。⽽GBM使⽤⽹格搜索,只能检测有限个值。
4.XGBoost参数详解
在运⾏XGboost之前,必须设置三种类型参数:general parameters,booster parameters和task parameters:
4.1通⽤参数(general parameters):该参数参数控制在提升(boosting)过程中使⽤哪种booster,常⽤的booster有树模型(tree)和线性模型(linear model)
booster [default=gbtree]:有两中模型可以选择gbtree和gblinear。gbtree使⽤基于树的模型进⾏提升计算,gblinear使⽤线性模型进⾏提升计算。缺省值为gbtree
silent [default=0]:取0时表⽰打印出运⾏时信息,取1时表⽰以缄默⽅式运⾏,不打印运⾏时信息。缺省值为0
nthread:XGBoost运⾏时的线程数。缺省值是当前系统可以获得的最⼤线程数
num_pbuffer:预测缓冲区⼤⼩,通常设置为训练实例的数⽬。缓冲⽤于保存最后⼀步提升的预测结果,⽆需⼈为设置。
num_feature:Boosting过程中⽤到的特征维数,设置为特征个数。XGBoost会⾃动设置,⽆需⼈为设置。
4.2 Booster参数(booster parameters):这取决于使⽤哪种booster。
(1)tree booster参数(booster=gbtree)
eta [default=0.3] :为了防⽌过拟合,更新过程中⽤到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守。缺省值为0.3 ,取值范围为:[0,1]。典型值为0.01~0.2。
gamma [default=0] :在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最⼩损失函数下降值。 这个参数的值越⼤,算法越保守。
这个参数的值和损失函数息息相关,所以是需要调整的。 取值范围为:[0,∞]
max_depth [default=6] :数的最⼤深度。缺省值为6 。取值范围为:[1,∞]。需要使⽤CV函数来进⾏调优。典型值:3-10
min_child_weight [default=1] :孩⼦节点中最⼩的样本权重和。如果⼀个叶⼦节点的样本权重和⼩于min_child_weight则拆分过程结束。在现⾏回归模型中,这个参数是指建⽴每个模型所需要的最⼩样本数。这个参数⽤于避免过拟合。当它的值较⼤时,可以避免模型学习到局部的特殊样本。 但是如果这个值过⾼,会导致⽋拟合。这个参数需要使⽤CV来调整。取值范围为:[0,∞]
max_delta_step [default=0] :我们允许每个树的权重被估计的值。如果它的值被设置为0,意味着没有约束;如果它被设置为⼀个正值,它能够使得更新的步骤更加保守。通常这个参数是没有必要的,但是如果在逻辑回归中类极其不平衡这时候他有可能会起到帮助作⽤。把它范围设置为1-10之间也许能控制更新。 取值范围为:[0,∞]
subsample [default=1] :⽤于训练模型的⼦样本占整个样本集合的⽐例。如果设置为0.5则意味着XG
Boost将随机的从整个样本集合中随机的抽取出50%的⼦样本建⽴树模型,这能够防⽌过拟合。 取值范围为:(0,1]
colsample_bytree [default=1] :在建⽴树时对特征采样的⽐例。缺省值为1 。取值范围为:(0,1]
(2)Linear Booster参数(booster=gblinear)
lambda [default=0] :L2 正则的惩罚系数
alpha [default=0] :L1 正则的惩罚系数
lambda_bias :在偏置上的L2正则。缺省值为0(在L1上没有偏置项的正则,因为L1时偏置不重要)
4.3 学习⽬标参数(task parameters):控制学习的场景,例如在回归问题中会使⽤不同的参数控制排序。
objective [ default=reg:linear ] :定义学习任务及相应的学习⽬标,可选的⽬标函数:reg:linear(线性回归);reg:logistic(逻辑回归);binary:logistic(⼆分类的逻辑回归问题,输出为概率);binary:logitraw(⼆分类的逻辑回归问题,输出的结果为
wTx);count:poisson(计数问题的poisson回归,输出结果为poisson分布。在poisson回归中,max_delta_step的缺省值为0.7。(ud to safeguard optimization) );multi:softmax(让XGBoost采⽤softmax⽬标函数处理多分类问题,同时需要设置参数
num_class(类别个数));multi:softprob(和softmax⼀样,但是输出的是ndata * nclass的向量,可以将该向量reshape成ndata⾏nclass列的矩阵。没⾏数据表⽰样本所属于每个类别的概率。);rank:pairwi(t XGBoost to do ranking task by minimizing the pairwi loss)
ba_score [ default=0.5 ]:所有实例的初始化预测分数,全局偏置;当有⾜够的迭代次数时,改变这个值将不会有太⼤影响。
eval_metric [ default according to objective ]:校验数据所需要的评价指标,不同的⽬标函数将会有缺省的评价指标(rm for regression, and error for classification, mean average precision for ranking);⽤户可以添加多种评价指标,对于Python⽤户要以list传递参数对给程序,⽽不是map参数list参数不会覆盖’eval_metric’,可供的选择:rm(均⽅根误差);mae(平均绝对误差);logloss(负对数似然函数值);error(⼆分类错误率(阈值为0.5) );merror(多分类错误率);mlogloss (多分类logloss损失函数);auc(曲线下⾯积)
ed [ default=0 ]:随机数的种⼦。缺省值为0
4.ain()函数参数
2              dtrain,
3              num_boost_round=10,
4              evals=(),
5              obj=None,
6              feval=None,
7              maximize=Fal,
8              early_stopping_rounds=None,
9              evals_result=None,
10              verbo_eval=True,
11              learning_rates=None,
12              xgb_model=None)
params :这是⼀个字典,⾥⾯包含着训练中的参数关键字和对应的值,形式是params = {‘booster’:’gbtree’, ’eta’:0.1}
dtrain :训练的数据
num_boost_round :这是指提升迭代的个数
evals :这是⼀个列表,⽤于对训练过程中进⾏评估列表中的元素。形式是evals = [(dtrain,’train’), (dval,’val’)]或者是evals = [ (dtrain,’train’)], 对于第⼀种情况,它使得我们可以在训练过程中观察验证集的效果。
obj:⾃定义⽬的函数
feval:⾃定义评估函数
horizontal是什么意思
maximize: 是否对评估函数进⾏最⼤化
early_stopping_rounds: 早期停⽌次数 ,假设为100,验证集的误差迭代到⼀定程度在100次内不能再继续降低,就停⽌迭代。这要求evals ⾥⾄少有⼀个元素,如果有多个,按最后⼀个去执⾏。返回的是最后的迭代次数(不是最好的)。如果early_stopping_rounds 存在,则模型会⽣成三个属性,bst.best_score, bst.best_iteration, 和bst.best_ntree_limit
evals_result :字典,存储在watchlist 中的元素的评估结果。
verbo_eval(可以输⼊布尔型或数值型):也要求evals ⾥⾄少有 ⼀个元素。如果为True, 则对evals中元素的评估结果会输出在结果中;如果输⼊数字,假设为5,则每隔5个迭代输出⼀次。
learning_rates :每⼀次提升的学习率的列表,
xgb_model:在训练之前⽤于加载的xgb model。
5.Xgboost实战:
XGBoost有两⼤类接⼝:XGBoost原⽣接⼝和scikit-learn接⼝ ,并且XGBoost能够实现分类和回归两种任务
1
2
3# 基于XGBoost原⽣接⼝的分类
4from sklearn.datats import load_iris
5import xgboost as xgb
6from xgboost import plot_importance
7from matplotlib import pyplot as plt
del_lection import train_test_split
ics import accuracy_score  # 准确率
10
11
教育部考试中心网12iris = load_iris()  # 加载样本数据集
13x_data, y_data = iris.data, iris.target
14x_train, x_test, y_train, y_test = train_test_split(x_data, y_data,test_size=0.2, random_state=1234565)  # 数据集分割
15params = {
16    'booster': 'gbtree',
17    'objective': 'multi:softmax',
18    'num_class': 3,
19    'gamma': 0.1,
20    'max_depth': 6,
21    'lambda': 2,
22    'subsample': 0.7,
23    'colsample_bytree': 0.7,
24    'min_child_weight': 3,
25    'silent': 1,
26    'eta': 0.1,
27    'ed': 1000,
28    'nthread': 4,
29}
30plst = params.items()
31dtrain = xgb.DMatrix(x_train, y_train)  # ⽣成数据集格式
32model = ain(params,
33                  dtrain,  # 训练的数据
34                  num_boost_round=500  # 提升迭代的个数
35                  ) # xgboost模型训练
36wmsf
37
38# 对测试集进⾏预测
39dtest = xgb.DMatrix(x_test)
40y_pred = model.predict(dtest)
41
42# 计算准确率
43accuracy = accuracy_score(y_test,y_pred)
44print("accuarcy: %.2f%%" % (accuracy*100.0))
44print("accuarcy: %.2f%%" % (accuracy*100.0))
45
46# 显⽰重要特征
47plot_importance(model)
48plt.show()
49
50
51# ================基于XGBoost原⽣接⼝的回归=============
52
53import xgboost as xgb
54from xgboost import plot_importance
55from matplotlib import pyplot as plt
del_lection import train_test_split
僵尸预警指南57from sklearn.datats import load_boston
ics import mean_squared_error
59
60# 加载数据集
61boston = load_boston()
62X,y = boston.data,boston.target
63
64# XGBoost训练过程
65X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
66
67params = {
68    'booster': 'gbtree',
69    'objective': 'reg:gamma',
70    'gamma': 0.1,
71    'max_depth': 5,
72    'lambda': 3,
73    'subsample': 0.7,
74    'colsample_bytree': 0.7,
75    'min_child_weight': 3,
76    'silent': 1,
77    'eta': 0.1,
78    'ed': 1000,
79    'nthread': 4,
80}
81
企业外语培训82dtrain = xgb.DMatrix(X_train, y_train)
83model = ain(params, dtrain, num_boost_round=500)
84
85# 对测试集进⾏预测
86dtest = xgb.DMatrix(X_test)
87ans = model.predict(dtest)
2013年12月英语六级成绩查询88
89# 显⽰重要特征
90plot_importance(model)
91plt.show()
92
93
94
95# ==============基于Scikit-learn接⼝的分类================
96from sklearn.datats import load_iris
97import xgboost as xgb
98from xgboost import plot_importance
99from matplotlib import pyplot as plt
del_lection import train_test_split
ics import accuracy_score
102
103# 加载样本数据集
104iris = load_iris()
105X,y = iris.data,iris.target
106X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234565) # 数据集分割
107
108# 训练模型
109model = xgb.XGBClassifier(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective='multi:softmax')
109model = xgb.XGBClassifier(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective='multi:softmax')
110model.fit(X_train, y_train)
111
112# 对测试集进⾏预测
113y_pred = model.predict(X_test)
114
115# 计算准确率
116accuracy = accuracy_score(y_test,y_pred)
简历封面设计117print("accuarcy: %.2f%%" % (accuracy*100.0))
118
119# 显⽰重要特征
120plot_importance(model)
industrial是什么意思121plt.show()
122
123
124# ================基于Scikit-learn接⼝的回归================
125import xgboost as xgb
126from xgboost import plot_importance
127from matplotlib import pyplot as plt
del_lection import train_test_split
129from sklearn.datats import load_boston
130
131boston = load_boston()
132X,y = boston.data,boston.target
133
134# XGBoost训练过程
brazzaville135X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
136
137model = xgb.XGBRegressor(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective='reg:gamma')
138model.fit(X_train, y_train)
139
140# 对测试集进⾏预测
141ans = model.predict(X_test)
142
143# 显⽰重要特征
144plot_importance(model)
145plt.show()
146
147
148
6.参数调优的⼀般⽅法
我们会使⽤和GBM中相似的⽅法。需要进⾏如下步骤:
1. 选择较⾼的学习速率(learning rate)。⼀般情况下,学习速率的值为0.1。但是,对于不同的问题,理想的学习速率有时候会在0.05到0.3之间波动。选择对应于此学习速率的理想决策树数量。XGBoost有⼀个很有⽤的函数“cv”,这个函数可以在每⼀次迭代中使⽤交叉验证,并返回理想的决策树数量。
2. 对于给定的学习速率和决策树数量,进⾏决策树特定参数调优(max_depth, min_child_weight, gamma, subsample,
colsample_bytree)。在确定⼀棵树的过程中,我们可以选择不同的参数,待会⼉我会举例说明。
3. xgboost的正则化参数的调优。(lambda, alpha)。这些参数可以降低模型的复杂度,从⽽提⾼模型的表现。
4. 降低学习速率,确定理想参数。
咱们⼀起详细地⼀步步进⾏这些操作。
第⼀步:确定学习速率和tree_bad 参数调优的估计器数⽬。
为了确定boosting 参数,我们要先给其它参数⼀个初始值。咱们先按如下⽅法取值:
1、max_depth = 5 :这个参数的取值最好在3-10之间。我选的起始值为5,但是你也可以选择其它的值。起始值在4-6之间都是不错的选择。

本文发布于:2023-05-20 08:41:03,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/115585.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:参数   学习   模型
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图