Xgboost参数
- ‘booster’:‘gbtree’, 提升树
- ‘objective’: ‘multi:softmax’, 多分类的问题
- ‘num_class’:10, 类别数,与 multisoftmax 并用
- ‘gamma’:损失下降多少才进行分裂-(即xgboost公式推导中的,类似于信息增益)
- ‘max_depth’:12, 构建树的深度,越大越容易过拟合
- ‘lambda’:2, 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
- ‘subsample’:0.7, 随机采样训练样本(每颗构造的树,训练数据是不一样的,随机选择部分数据,这里是70%)
- ‘colsample_bytree’:0.7, 生成树时进行的列采样(随机选择部分特征)
- ‘min_child_weight’:3, 孩子节点中最小的样本权重和。如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束
- ‘silent’:0 ,设置成1则没有 运行信息 输出,最好是设置为0.
- ‘eta’: 0.007, 如同学习率(一棵树对结果预测的权重)
- ‘seed’:1000,
- ‘nthread’:7, cpu 线程数
Xgboost API:
- num_boost_round 建立的树个个数
- nfold 交叉验证n折
- feval 评估方法
调参
分组调节参数:
- 模型复杂程度的参数
- 评估方法参数
- 数据采样策略
- 学习率
前一步的参数调好之后,固定不变
- Step 1: 选择一组初始参数
- Step 2: 改变
max_depth
和min_child_weight
. - Step 3: 调节
gamma
降低模型过拟合风险. - Step 4: 调节
subsample
和colsample_bytree
改变数据采样策略. - Step 5: 调节学习率
eta
.
Step 1: 这些参数对xgboost性能影响最大,因此,他们应该调整第一。我们简要地概述它们:
max_depth
: 树的最大深度。增加这个值会使模型更加复杂,也容易出现过拟合,深度3-10是合理的。min_child_weight
: 正则化参数. 如果树分区中的实例权重小于定义的总和,则停止树构建过程(停止策略)。
Step 2: 调节 gamma去降低过拟合风险
- 在固定以上最好取值的情况下,调节其他参数
Step 3: 调节样本采样方式 subsample 和 colsample_bytree
Step 4: 学习率与树个数
GridSearchCV
它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数。但是这个方法适合于小数据集,一旦数据的量级上去了,很难得出结果。这个时候就是需要动脑筋了。数据量比较大的时候可以使用一个快速调优的方法——坐标下降。它其实是一种贪心算法:拿当前对模型影响最大的参数调优,直到最优化;再拿下一个影响最大的参数调优,如此下去,直到所有的参数调整完毕。这个方法的缺点就是可能会调到局部最优而不是全局最优,但是省时间省力,巨大的优势面前,还是试一试吧,后续可以再拿bagging再优化。回到sklearn里面的GridSearchCV,GridSearchCV用于系统地遍历多种参数组合,通过交叉验证确定最佳效果参数。
常用方法:
grid.fit():运行网格搜索
grid_scores_:给出不同参数情况下的评价结果
best_params_:描述了已取得最佳结果的参数的组合
best_score_:成员提供优化过程期间观察到的最好的评分
# 先得到一个基准模型
dtrain = xgb.DMatrix(x_train, y_train)
cv_rounds = xgb.cv(params=self.params, dtrain=dtrain, num_boost_round=self.num_boost_round,
nfold=nfold, feval=xg_eval_mae, maximize=False, early_stopping_rounds=10)
# 将要遍历的参数输入GridSearchCV-param_grid
xgb_param_grid = {'max_depth': list(range(4,9)), 'min_child_weight': list((1,3,6))}
xgb_param_grid['max_depth']
grid = GridSearchCV(XGBoostRegressor(eta=0.1, num_boost_round=50, colsample_bytree=0.5, subsample=0.5),
param_grid=xgb_param_grid, cv=5, scoring=mae_scorer)
grid.fit(train_x, train_y.values)
grid.grid_scores_, grid.best_params_, grid.best_score_
OUT:grid.best_score_:
{‘max_depth’: 8, ‘min_child_weight’: 6},
-1187.9597499123447)