XGBoost学习(三):模型详解

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, 通用参数

  1. booster [default=gbtree]
    有两种模型可以选择gbtree和gblinear。gbtree使用基于树的模型进行提升计算,gblinear使用线性模型进行提升计算。缺省值为gbtree
  2. silent [default=0]
    取0时表示打印出运行时信息,取1时表示以缄默方式运行,不打印运行时的信息。缺省值为0
    建议取0,过程中的输出数据有助于理解模型以及调参。另外实际上我设置其为1也通常无法缄默运行。。
  3. nthread [default to maximum number of threads available if not set]
    XGBoost运行时的线程数。缺省值是当前系统可以获得的最大线程数
    如果你希望以最大速度运行,建议不设置这个参数,模型将自动获得最大线程
  4. 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.
  5. num_feature [set automatically by xgboost, no need to be set by user]
    boosting过程中用到的特征维数,设置为特征个数。XGBoost会自动设置,不需要手工设置

2.2,tree booster参数

  1. eta [缺省值=0.3,别名:learning_rate]
    为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守。缺省值为0.3
    取值范围为:[0,1]
    通常最后设置eta为0.01~0.2
  2. [缺省值=0,别名: min_split_loss](分裂最小loss)
    在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。范围: [0,∞]
  3. range: [0,∞]
    模型在默认情况下,对于一个节点的划分只有在其loss function 得到结果大于0的情况下才进行,而gamma 给定了所需的最低loss function的值
    gamma值使得算法更conservation,且其值依赖于loss function ,在模型中应该进行调参。
  4. max_depth [default=6]
    树的最大深度。缺省值为6
    取值范围为:[1,∞]
    指树的最大深度
    树的深度越大,则对数据的拟合程度越高(过拟合程度也越高)。即该参数也是控制过拟合
    建议通过交叉验证(xgb.cv ) 进行调参
    通常取值:3-10
  5. min_child_weight [default=1]
    孩子节点中最小的样本权重和。如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束。在现行回归模型中,这个参数是指建立每个模型所需要的最小样本数。该成熟越大算法越conservative。即调大这个参数能够控制过拟合。
    取值范围为: [0,∞]
  6. max_delta_step [default=0]
    在每棵树的权重估计中,允许的最大delta步长。
    如果这个值设置为0,意味着没有约束。如果设置为一个正数,它有助于在更新步长的时候,使得模型更加保守。通常,这个参数不需要设置,但是当类别极度不平衡的时候,有助于逻辑回归模型的训练。设置它的值为1-10,可能有助于控制更新。
    取值范围为:[0,∞]
  7. subsample [default=1]
    用于训练模型的子样本占整个样本集合的比例。如果设置为0.5则意味着XGBoost将随机的从整个样本集合中抽取出50%的子样本建立树模型,这能够防止过拟合。
    取值范围为:(0,1]
  8. colsample_bytree [default=1]
    在建立树时对特征随机采样的比例。缺省值为1
    取值范围:(0,1]
  9. colsample_bylevel[default=1]
    决定每次节点划分时子样例的比例
    通常不使用,因为subsample和colsample_bytree已经可以起到相同的作用了
  10. scale_pos_weight[default=0]
    大于0的取值可以处理类别不平衡的情况。帮助模型更快收敛

2.3,Linear Booster参数

  1. lambda [default=0]
    L2 正则的惩罚系数
    用于处理XGBoost的正则化部分。通常不使用,但可以用来降低过拟合
  2. alpha [default=0]
    L1 正则的惩罚系数
    当数据维度极高时可以使用,使得算法运行更快。
  3. lambda_bias
    在偏置上的L2正则。缺省值为0(在L1上没有偏置项的正则,因为L1时偏置不重要)

2.4,学习目标参数

这个参数是来控制理想的优化目标和每一步结果的度量方法。

  1. 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 采用评分机制进行训练
  2. base_score [ default=0.5 ]
    所有实例的初始化预测分数,全局偏置;
    为了足够的迭代次数,改变这个值将不会有太大的影响。
  3. 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
  4. seed [ default=0 ]
    随机数的种子。缺省值为0
    可以用于产生可重复的结果(每次取一样的seed即可得到相同的随机划分)
    XGBoost学习(三):模型详解_第1张图片

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

你可能感兴趣的:(XGBoost,深度学习,python,机器学习)