主要创新点:
链接:https://www.jianshu.com/p/a62f4dce3ce8
XGBoost使用了和CART回归树一样的想法,利用贪婪算法,遍历所有特征的所有特征划分点,不同的是使用的目标函数不一样。具体做法就是分裂后的目标函数值比单子叶子节点的目标函数的增益,同时为了限制树生长过深,还加了个阈值,只有当增益大于该阈值才进行分裂。从而继续分裂,形成一棵树,再形成一棵树,每次在上一次的预测基础上取最优进一步分裂/建树。
与GBDT对比
只支持CART树
,而XGBoost支持线性分类器
,此时相当于带有L1和L2正则项的逻辑回归(分类问题)和线性回归(回归问题)。一阶导数
,而XGBoost对目标函数进行二阶泰勒展开
,此外,XGBoost支持自定义损失函数
,只要损失函数二阶可导目标函数
中引入了正则项
,正则项包括叶节点的个数
及叶节点的输出值的L2范数
。通过约束树结构,降低模型方差,防止过拟合。对缺失值不敏感
,能自动学习其分裂方向引入缩减因子
,降低单颗树对结果的影响
,让后续模型有更大的优化空间,进一步防止过拟合。引进近似直方图算法
,用于生成高效的分割点,即用分裂后的某种值减去分裂前的某种值,获得增益,为了限制树的增长,引入阈值,当增益大于阈值时,进行分裂;读取数据
dtrain = xgb.DMatrix(‘demo/data/agaricus.txt.train’)
dtest = xgb.DMatrix(‘demo/data/agaricus.txt.test’)
通过 map 指定参数
param = {‘max_depth’:2, ‘eta’:1, ‘silent’:1, ‘objective’:‘binary:logistic’ }
num_round = 2
bst = xgb.train(param, dtrain, num_round)
预测
preds = bst.predict(dtest)
要加载 numpy 的数组到 DMatrix 对象中, 代码如下:
import numpy as np
import xgboost as xgb
data = np.random.rand(5,10) # 5 entities, each contains 10 features
label = np.random.randint(2, size=5) # binary target
dtrain = xgb.DMatrix( data, label=label)
->data
array([[4.58112586e-01, 5.15109055e-01, 9.49322368e-01, 4.12068451e-01,
9.07828945e-01, 6.01836350e-01, 2.67689084e-02, 8.71999699e-01,
9.70469774e-01, 4.08043402e-01],
[3.84152246e-01, 3.33657143e-01, 5.09202802e-01, 7.49937855e-01,
6.76731623e-01, 5.98826160e-01, 8.87044516e-01, 2.42738478e-01,
5.54069014e-01, 7.31676395e-01],
[4.31604612e-04, 2.37646980e-01, 7.08828313e-01, 2.97212746e-01,
7.08635495e-01, 5.25163997e-01, 3.93572198e-01, 9.49710807e-01,
7.81015022e-01, 2.29557159e-01],
[7.72886296e-01, 2.38108229e-01, 1.25507593e-01, 2.79567575e-01,
2.82561160e-02, 7.04470072e-01, 2.61917976e-01, 5.98723606e-01,
6.72975320e-01, 7.21076548e-01],
[2.88186647e-01, 6.24797266e-01, 5.15669053e-01, 8.68095215e-01,
4.43562171e-01, 5.07861559e-01, 6.53741982e-01, 9.29474058e-01,
7.91150281e-02, 1.52469552e-01]])
-> label
array([1, 1, 1, 0, 0])
-> dtrain
import scipy
csr = scipy.sparse.csr_matrix((dat, (row, col)))
dtrain = xgb.DMatrix(csr)
dtrain = xgb.DMatrix(‘train.svm.txt’)
dtrain.save_binary(“train.buffer”)
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)
param = {'bst:max_depth':2, 'bst:eta':1, 'silent':1, 'objective':'binary:logistic' }
param['nthread'] = 4
param['eval_metric'] = 'auc'
param[‘eval_metric’] = [‘auc’, ‘ams@0’]
#alternativly:
#plst = param.items()
#plst += [(‘eval_metric’, ‘ams@0’)]
evallist = [(dtest,‘eval’), (dtrain,‘train’)]
num_round = 10
bst = xgb.train( plst, dtrain, num_round, evallist )
bst.save_model(‘0001.model’)
#转存模型
bst.dump_model(‘dump.raw.txt’)
#转储模型和特征映射
bst.dump_model(‘dump.raw.txt’,‘featmap.txt’)
bst = xgb.Booster({‘nthread’:4}) #init model
bst.load_model(“model.bin”) # load data
如果您有一个验证集, 你可以使用提前停止找到最佳数量的 boosting rounds(梯度次数)
. 提前停止至少需要一个 evals
集合. 如果有多个, 它将使用最后一个.
train(…, evals=evals, early_stopping_rounds=10)
该模型将开始训练, 直到验证得分停止提高为止. 验证错误需要至少每个 early_stopping_rounds
减少以继续训练.
如果提前停止,模型将有三个额外的字段: bst.best_score, bst.best_iteration 和 bst.best_ntree_limit.
请注意 train()
将从上一次迭代中返回一个模型, 而不是最好的一个.
这与两个度量标准一起使用以达到最小化(RMSE, 对数损失等)
和最大化(MAP, NDCG, AUC)
. 请注意, 如果您指定多个评估指标, 则 param [‘eval_metric’]
中的最后一个用于提前停止.
#7 个样本, 每一个包含 10 个特征
data = np.random.rand(7, 10)
dtest = xgb.DMatrix(data)
ypred = bst.predict(xgmat)
如果在训练过程中提前停止, 可以用 bst.best_ntree_limit
从最佳迭代中获得预测结果:
ypred = bst.predict(xgmat,ntree_limit=bst.best_ntree_limit)
当你观察到训练精度高,但是测试精度低时,你可能遇到了过拟合
的问题。
通常有两种方法可以控制 xgboost 中的过拟合。
第一个方法是直接控制模型的复杂度
这包括max_depth, min_child_weight 和 gamma
第二种方法是增加随机性,使训练对噪声强健
这包括 subsample, colsample_bytree
你也可以减小步长 eta
, 但是当你这么做的时候需要记得增加 num_round
。
对于广告点击日志等常见情况,数据集是极不平衡的。 这可能会影响 xgboost 模型的训练,有两种方法可以改善它。
如果你只关心预测的排名顺序(AUC)
通过 scale_pos_weight
来平衡positive
和 negative
权重。
如果你关心预测正确的概率
在这种情况下,您无法重新平衡数据集
在这种情况下,将参数max_delta_step
设置为有限数字(比如说1)将有助于收敛
原文链接:https://blog.csdn.net/weixin_40083227/article/details/103610953