干货|XGBoost进阶—调参+实战

2019-05-27 21:03:10 浏览数 (1)

1.通用参数

宏观功能可以理解为整体的功能。

1.1 booster

参数默认值是gbtree,就是每次迭代的模型选择,一共有两种:

gbtree:基于决策树的模型

gbliner:线性模型(模型效果不如gbtree,所以用的比较少)

1.2 silent

参数默认值是0,控制的是模型每次的输出信息。参数有两种选择:

1,silent模式开启,模型不会输出任何信息。

0,silent模式关闭(一般我们选择slient=0,因为这样能更好的帮助我们理解模型)

1.3 nthread

看到这个参数的第一反应就猜到是和多线程相关的,果不其然,该参数是用来控制应当输入系统的核数。如果不输入这个参数的话,算法自动检测会默认使用CPU的全部核。

2.booster参数

这里的booster参数是基于1.1的booster的选择来看的,其中gbtree的效果要远好于gblinear。

2.1 eta

参数默认值是0.3,我的理解是该值的作用是减少每一步的权重(类似于之前介绍过的Shinkage方法),以便于之后的学习有更多的学习空间,典型的取值范围是[0.01-0.2]

2.2 min_child_weight

参数默认值是1,决定的是最小叶子节点的样本权重和,当该值较大的时候,能有效的避免学习到样本的局部特征,能够有效的避免过拟合。但是如果值设置的太大,则会导致欠拟合。该参数需要根据cv(coefficient of variation)值来调整。

2.3 max-depth

参数默认值是6,该值控制的是决策树的最大深度,用来避免过拟合。试想一颗决策树的深度越大,那么这颗决策树划分样本的粒度也就更加细,也就更能学习到样本的局部特征。该参数同2.2一样,需要根据cv(coefficient of variation)值来调整。典型的取值范围是[3-10]。

2.4 max-leaf-nodes

直观解释就是:树上最大的节点或叶子数。该参数的作用和2.3类似,因此可以替代参数2.3,因为它们都用于避免决策树的过拟合。试想一颗深度为n的二叉树,其叶子节点数最多为n^2。

2.5 gamma

参数默认值是0,我们都知道,XGBoost在分裂节点时都会看分裂后损失函数的增益,只有增益大于一个阈值,才会对节点进行分裂。该参数指定的就是那个阈值,该参数越大,则表示决策树越难进行分裂,也就意味着算法越保守。该参数和损失函数息息相关。

2.6 max_delta_step

参数默认值是0,该参数限制的是每棵树权重改变的最大步长。如果该参数设置为0,则表示没有约束,如果其被赋予了某个正值,则会让算法更加保守。原文说该参数一般用不到,但是在样本不平衡的情况下,对逻辑回归很有帮助(有待测试)。

2.7 subsample

参数默认值是1,之前的文章中提到过随机采样,该参数控制的就是对于每棵树,随机采样的比例。减少这个参数的值,同样会使算法更加保守,避免过拟合,但是如果设置的过于小,可能会导致欠拟合。典型的取值范围[0.5-1.0]。

2.8 colsample_bytree

参数默认值是1,用来控制每棵树随机采样的列数的占比(每一列是一个特征)。典型的取值范围[0.5-1.0]。

2.9 colsample_bytree

参数默认值是1,用来控制树的每一级的每一次分裂,对列数的采样的占比。和2.7的作用相同。

2.10 lambda

参数默认值是1,权重的L2正则化项(类似于Ridge Regression)该参数是用来控制XGBoost中的正则化部分的,一般很少用,但是在减少过拟合方面,该参数应该还是能起到很大作用的。

2.11 alpha

参数默认值是1,权重的L1正则化项(类似于Lasso Regression),原文说该参数能应用到很高维度的情况,可以让算法的速度更快(有待测试)。

2.12 scale_pos_weight

参数默认值是1,该参数用于样本十分不平衡时,把该参数设置为一个正值,可以使算法很快收敛。

3.学习目标参数

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

3.1 objective

参数默认值是reg:linear,该参数就是用来定义需要被最小化的损失函数的,最常用的值有如下几个:

  • binary:logistic 二分类的逻辑回归,输出的是分类的概率,不是具体的类别。
  • multi:softmax 返回的是具体的类别,不是概率。在使用该参数的情况下,还需要设置另外一个参数:num_class,具体划分的类别数目。
  • multi:softprob multi:softmax一样,只不过返回的是样本属于各个类别的概率,而不再是具体的类别。

3.2 eval_metric

参数默认值会随着3.1参数的取值变化而变化,如果是回归问题,默认值是rmse,如果是分类问题,默认值是mae。

典型取值如下:

  • rmse(均方根误差)
  • mae(平均绝对误差)
  • logloss(负对数似然函数值)
  • error(二分类误差,阈值0.5)
  • merror(多分类错误率)
  • mlogloss(多分类logloss损失函数)
  • auc(曲线下面积)

3.3 seed

参数默认值是0,随机数的种子,设置它可以复现随机数的结果,也可以用于调整参数。


参数说了这么多,但还没说完,以后会根据实战的内容不断更新。接下来就是实战部分:

代码语言:javascript复制
import xgboost as xgbfrom sklearn.metrics import accuracy_scorefrom xgboost import XGBClassifier
path = './data/'#准备数据 数据下载在xgboost的github上 /demo/data/dtrain = xgb.DMatrix(path 'agaricus.txt.train')dtest = xgb.DMatrix(path 'agaricus.txt.test')#准备参数param = {'max_depth':2,'eta':1,'silent':0,'objective':'binary:logistic'}#参数说明'''max_depth:树的最大深度 缺省值为6 取值范围[1, 无穷]eta:防止过拟合在更新的时候使用的收缩步长 缺省值为0.3 取值[0,1] 其实就是学习率silent:0表示运行时打印运行信息,1表示不打印运行信息 缺省值为0objective:定义学习任务和学习目标 binary:logistic表示二分类逻辑回归 输出为概率'''#设置Boosting的迭代轮数 也就是最后会用到多少颗树num_round = 3#训练bst = xgb.train(param,dtrain,num_round)
def evaluate(data,model):    pre = model.predict(data)    pre_res = [round(res) for res in pre]    y = data.get_label()    acc = accuracy_score(y,pre_res)    return acc
acc_train = evaluate(dtrain,bst)acc_test = evaluate(dtest,bst)print(acc_train)print(acc_test)

为了方便理解,以及篇幅限制,在这里就不放所有代码了,完整代码包括一般模式,xgboost和sklearn结合 fit predict方式,模型可视化,学习曲线,K折交叉验证,GridSearch CV等等,持续更新中。。。

0 人点赞