XGBoost学习(一):原理
XGBoost学习(二):安装及介绍
XGBoost学习(三):模型详解
XGBoost学习(四):实战
XGBoost学习(五):参数调优
XGBoost学习(六):输出特征重要性以及筛选特征
完整代码及其数据
1,Xgboost能加载的各种数据格式解析
Xgboost可以加载多种数据格式的训练数据:
libsvm 格式的文本数据;
Numpy 的二维数组;
XGBoost 的二进制的缓存文件。加载的数据存储在对象 DMatrix 中。
下面一一列举:
#记载libsvm格式的数据
dtrain1 = xgb.DMatrix('train.svm.txt')
#记载二进制的缓存文件
dtrain2 = xgb.DMatrix('train.svm.buffer')
#加载numpy的数组
data = np.random.rand(5,10) # 5行10列数据集
label = np.random.randint(2,size=5) # 二分类目标值
dtrain = xgb.DMatrix(data,label=label) # 组成训练集
#将scipy.sparse格式的数据转化为Dmatrix格式
csr = scipy.sparse.csr_matrix((dat,(row,col)))
dtrain = xgb.DMatrix( csr )
#将Dmatrix格式的数据保存成Xgboost的二进制格式,在下次加载时可以提高加载速度,使用方法如下:
dtrain = xgb.DMatrix('train.svm.txt')
dtrain.save_binary("train.buffer")
#可以使用如下方式处理DMatrix中的缺失值
dtrain = xgb.DMatrix( data, label=label, missing = -999.0)
#当需要给样本设置权重时,可以用如下方式:
w = np.random.rand(5,1)
dtrain = xgb.DMatrix( data, label=label, missing = -999.0, weight=w)
2,Xgboost的模型参数
Xgboost使用key-value字典的方式存储参数
# xgboost模型
params = {
'booster':'gbtree',
'objective':'multi:softmax', # 多分类问题
'num_class':10, # 类别数,与multi softmax并用
'gamma':0.1, # 用于控制是否后剪枝的参数,越大越保守,一般0.1 0.2的样子
'max_depth':12, # 构建树的深度,越大越容易过拟合
'lambda':2, # 控制模型复杂度的权重值的L2 正则化项参数,参数越大,模型越不容易过拟合
'subsample':0.7, # 随机采样训练样本
'colsample_bytree':3,# 这个参数默认为1,是每个叶子里面h的和至少是多少
# 对于正负样本不均衡时的0-1分类而言,假设h在0.01附近,min_child_weight为1
#意味着叶子节点中最少需要包含100个样本。这个参数非常影响结果,
# 控制叶子节点中二阶导的和的最小值,该参数值越小,越容易过拟合
'silent':0, # 设置成1 则没有运行信息输入,最好是设置成0
'eta':0.007, # 如同学习率
'seed':1000,
'nthread':7, #CPU线程数
#'eval_metric':'auc'
}
在运行Xgboost之前,必须设置三种类型成熟:general parameters,booster parameters和task parameters:
通用参数(General Parameters):该参数控制在提升(boosting)过程中使用哪种booster,常用的booster有树模型(tree)和线性模型(linear model)
Booster参数(Booster Parameters):这取决于使用哪种booster
学习目标参数(Task Parameters):控制学习的场景,例如在回归问题中会使用不同的参数控制排序
2.1, 通用参数
- booster [default=gbtree]
有两种模型可以选择gbtree和gblinear。gbtree使用基于树的模型进行提升计算,gblinear使用线性模型进行提升计算。缺省值为gbtree
- silent [default=0]
取0时表示打印出运行时信息,取1时表示以缄默方式运行,不打印运行时的信息。缺省值为0
建议取0,过程中的输出数据有助于理解模型以及调参。另外实际上我设置其为1也通常无法缄默运行。。
- nthread [default to maximum number of threads available if not set]
XGBoost运行时的线程数。缺省值是当前系统可以获得的最大线程数
如果你希望以最大速度运行,建议不设置这个参数,模型将自动获得最大线程
- num_pbuffer [set automatically by xgboost, no need to be set by user]
size of prediction buffer, normally set to number of training instances. The buffers are used to save the prediction results of last boosting step.
- num_feature [set automatically by xgboost, no need to be set by user]
boosting过程中用到的特征维数,设置为特征个数。XGBoost会自动设置,不需要手工设置
2.2,tree booster参数
- eta [缺省值=0.3,别名:learning_rate]
为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守。缺省值为0.3
取值范围为:[0,1]
通常最后设置eta为0.01~0.2
- [缺省值=0,别名: min_split_loss](分裂最小loss)
在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。范围: [0,∞]
- range: [0,∞]
模型在默认情况下,对于一个节点的划分只有在其loss function 得到结果大于0的情况下才进行,而gamma 给定了所需的最低loss function的值
gamma值使得算法更conservation,且其值依赖于loss function ,在模型中应该进行调参。
- max_depth [default=6]
树的最大深度。缺省值为6
取值范围为:[1,∞]
指树的最大深度
树的深度越大,则对数据的拟合程度越高(过拟合程度也越高)。即该参数也是控制过拟合
建议通过交叉验证(xgb.cv ) 进行调参
通常取值:3-10
- min_child_weight [default=1]
孩子节点中最小的样本权重和。如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束。在现行回归模型中,这个参数是指建立每个模型所需要的最小样本数。该成熟越大算法越conservative。即调大这个参数能够控制过拟合。
取值范围为: [0,∞]
- max_delta_step [default=0]
在每棵树的权重估计中,允许的最大delta步长。
如果这个值设置为0,意味着没有约束。如果设置为一个正数,它有助于在更新步长的时候,使得模型更加保守。通常,这个参数不需要设置,但是当类别极度不平衡的时候,有助于逻辑回归模型的训练。设置它的值为1-10,可能有助于控制更新。
取值范围为:[0,∞]
- subsample [default=1]
用于训练模型的子样本占整个样本集合的比例。如果设置为0.5则意味着XGBoost将随机的从整个样本集合中抽取出50%的子样本建立树模型,这能够防止过拟合。
取值范围为:(0,1]
- colsample_bytree [default=1]
在建立树时对特征随机采样的比例。缺省值为1
取值范围:(0,1]
- colsample_bylevel[default=1]
决定每次节点划分时子样例的比例
通常不使用,因为subsample和colsample_bytree已经可以起到相同的作用了
- scale_pos_weight[default=0]
大于0的取值可以处理类别不平衡的情况。帮助模型更快收敛
2.3,Linear Booster参数
- lambda [default=0]
L2 正则的惩罚系数
用于处理XGBoost的正则化部分。通常不使用,但可以用来降低过拟合
- alpha [default=0]
L1 正则的惩罚系数
当数据维度极高时可以使用,使得算法运行更快。
- lambda_bias
在偏置上的L2正则。缺省值为0(在L1上没有偏置项的正则,因为L1时偏置不重要)
2.4,学习目标参数
这个参数是来控制理想的优化目标和每一步结果的度量方法。
- objective [ default=reg:linear ]
定义学习任务及相应的学习目标,可选的目标函数如下:
“reg:linear” –线性回归。
“reg:logistic” –逻辑回归。
“binary:logistic” –二分类的逻辑回归问题,输出为概率。
“binary:logitraw” –二分类的逻辑回归问题,输出的结果为wTx。
“count:poisson” –计数问题的poisson回归,输出结果为poisson分布。
在poisson回归中,max_delta_step的缺省值为0.7。(used to safeguard optimization)
“multi:softmax” –让XGBoost采用softmax目标函数处理多分类问题,同时需要设置参数num_class(类别个数)
“multi:softprob” –和softmax一样,但是输出的是ndata * nclass的向量,可以将该向量reshape成ndata行nclass列的矩阵。每行数据表示样本所属于每个类别的概率。
“rank:pairwise” –set XGBoost to do ranking task by minimizing the pairwise loss 采用评分机制进行训练
- base_score [ default=0.5 ]
所有实例的初始化预测分数,全局偏置;
为了足够的迭代次数,改变这个值将不会有太大的影响。
- eval_metric [ default according to objective ]
校验数据所需要的评价指标,不同的目标函数将会有缺省的评价指标(rmse for regression, and error for classification, mean average precision for ranking)
用户可以添加多种评价指标,对于Python用户要以list传递参数对给程序,而不是map参数list参数不会覆盖’eval_metric’
The choices are listed below:
“rmse”: root mean square error
“logloss”: negative log-likelihood
“error”: Binary classification error rate. It is calculated as #(wrong cases)/#(all cases). For the predictions, the evaluation will regard the instances with prediction value larger than 0.5 as positive instances, and the others as negative instances.
“merror”: Multiclass classification error rate. It is calculated as #(wrong cases)/#(all cases).
“mlogloss”: Multiclass logloss
“auc”: Area under the curve for ranking evaluation.
“ndcg”:Normalized Discounted Cumulative Gain
“map”:Mean average precision
“ndcg@n”,”map@n”: n can be assigned as an integer to cut off the top positions in the lists for evaluation.
“ndcg-“,”map-“,”ndcg@n-“,”map@n-“: In XGBoost, NDCG and MAP will evaluate the score of a list without any positive samples as 1. By adding “-” in the evaluation metric XGBoost will evaluate these score as 0 to be consistent under some conditions.
training repeatively
- seed [ default=0 ]
随机数的种子。缺省值为0
可以用于产生可重复的结果(每次取一样的seed即可得到相同的随机划分)
3,Xgboost基本方法和默认参数
xgboost.train(params,dtrain,num_boost_round=10,evals(),obj=None,
feval=None,maximize=False,early_stopping_rounds=None,evals_result=None,
verbose_eval=True,learning_rates=None,xgb_model=None)
parms:这是一个字典,里面包含着训练中的参数关键字和对应的值,形式是parms = {‘booster’:‘gbtree’,‘eta’:0.1}
dtrain:训练的数据
num_boost_round:这是指提升迭代的个数
evals:这是一个列表,用于对训练过程中进行评估列表中的元素。形式是evals = [(dtrain,‘train’),(dval,‘val’)] 或者是 evals =[(dtrain,‘train’)] ,对于第一种情况,它使得我们可以在训练过程中观察验证集的效果。
obj :自定义目的函数
feval:自定义评估函数
maximize:是否对评估函数进行最大化
early_stopping_rounds:早起停止次数,假设为100,验证集的误差迭代到一定程度在100次内不能再继续降低,就停止迭代。这要求evals里至少有一个元素,如果有多个,按照最后一个去执行。返回的是最后的迭代次数(不是最好的)。如果early_stopping_rounds存在,则模型会生成三个属性,bst.best_score ,bst.best_iteration和bst.best_ntree_limit
evals_result:字典,存储在watchlist中的元素的评估结果
verbose_eval(可以输入布尔型或者数值型):也要求evals里至少有一个元素,如果为True,则对evals中元素的评估结果会输出在结果中;如果输入数字,假设为5,则每隔5个迭代输出一次。
learning_rates:每一次提升的学习率的列表
xgb_model:在训练之前用于加载的xgb_model
4,模型训练
有了参数列表和数据就可以训练模型了
num_round = 10
bst = xgb.train( plst, dtrain, num_round, evallist )
5,模型预测
# X_test类型可以是二维List,也可以是numpy的数组
dtest = DMatrix(X_test)
ans = model.predict(dtest)
完整代码如下:
xgb_model.get_booster().save_model('xgb.model')
tar = xgb.Booster(model_file='xgb.model')
x_test = xgb.DMatrix(x_test)
pre=tar.predict(x_test)
act=y_test
print(mean_squared_error(act, pre))
6,保存模型
在训练完成之后可以将模型保存下来,也可以查看模型内部的结构
bst.save_model('test.model')
导出模型和特征映射(Map)
你可以导出模型到txt文件并浏览模型的含义:
# 导出模型到文件
bst.dump_model('dump.raw.txt')
# 导出模型和特征映射
bst.dump_model('dump.raw.txt','featmap.txt')
7,加载模型
通过如下方式可以加载模型
bst = xgb.Booster({'nthread':4}) # init model
bst.load_model("model.bin") # load data