XGB
XGBoost是专注于梯度提升算法的机器学习函数库,此函数库因其优良的学习效果以及高效的训练速度而获得广泛的关注。
XGBoost 所应用的算法是梯度提升树(gradient boosting decision tree),既可以用于分类也可以用于回归问题中。
CART树
CART分类回归树(Classification And Regression Tree)是一种典型的二叉决策树,可以做分类或者回归。如果待预测结果是离散型数据,则CART生成分类决策树;如果待预测结果是连续型数据,则CART生成回归决策树。
算法原理
CART算法由以下两步组成:
1.决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
2.决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时损失函数最小作为剪枝的标准。
假设每次迭代生成一棵树,则训练目标函数可以写成:
obj
(
θ
)
(
t
)
=
Σ
i
n
l
(
y
i
,
y
i
^
(
t
)
)
+
Σ
k
=
1
t
Ω
(
f
k
)
\text{obj}(\theta)^{(t)}=\Sigma_i^nl(y_i,\hat{y_i}^{(t)})+\Sigma_{k=1}^t\Omega(f_k)
obj(θ)(t)=Σinl(yi,yi^(t))+Σk=1tΩ(fk)
其中第一部分是训练误差,第2部分是每棵树的复杂度。yi^(t)为第t步迭代的预测值,且有一下迭代关系:
y
i
^
(
t
)
=
Σ
k
=
1
t
(
f
k
(
x
i
)
)
=
y
i
^
(
t
−
1
)
+
f
t
(
x
i
)
\hat{y_i}^{(t)}=\Sigma_{k=1}^t(f_k(x_i))= \hat{y_i}^{(t-1)}+f_t(x_i)
yi^(t)=Σk=1t(fk(xi))=yi^(t−1)+ft(xi)
第t次训练的目标函数:
o
b
j
(
t
)
=
Σ
i
=
1
n
l
(
y
i
,
y
i
^
(
t
)
)
+
Σ
i
=
1
t
Ω
(
f
i
)
obj^{(t)} =\Sigma_{i=1}^nl(y_i,\hat{y_i}^{(t)})+\Sigma_{i=1}^t\Omega(f_i)
obj(t)=Σi=1nl(yi,yi^(t))+Σi=1tΩ(fi)
所以有:
o
b
j
(
t
)
=
Σ
i
=
1
n
l
(
y
i
,
y
i
^
(
t
−
1
)
+
f
t
(
x
i
)
)
+
Ω
(
f
t
)
+
Σ
i
=
1
(
t
−
1
)
Ω
(
f
i
)
obj^{(t)} =\Sigma_{i=1}^nl(y_i,\hat{y_i}^{(t-1)}+ f_t(x_i))+\Omega(f_t)+ \Sigma_{i=1}^{(t-1)}\Omega(f_i)
obj(t)=Σi=1nl(yi,yi^(t−1)+ft(xi))+Ω(ft)+Σi=1(t−1)Ω(fi)
损失函数
对
l
l
l使用平方损失函数,则有:
o
b
j
(
t
)
=
Σ
i
=
1
n
[
y
i
−
(
y
i
^
(
t
−
1
)
+
f
t
(
x
i
)
]
2
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
obj^{(t)} =\Sigma_{i=1}^n[y_i-(\hat{y_i}^{(t-1)}+ f_t(x_i)]^2+\Omega(f_t)+ constant
obj(t)=Σi=1n[yi−(yi^(t−1)+ft(xi)]2+Ω(ft)+constant
=
Σ
i
=
1
n
[
y
i
2
−
2
y
i
(
y
i
^
(
t
−
1
)
+
f
t
(
x
i
)
)
+
(
y
i
^
(
t
−
1
)
+
f
t
(
x
i
)
)
2
]
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
=\Sigma_{i=1}^n[y_i^2-2y_i(\hat{y_i}^{(t-1)}+ f_t(x_i))+(\hat{y_i}^{(t-1)}+ f_t(x_i))^2]+\Omega(f_t)+ constant
=Σi=1n[yi2−2yi(yi^(t−1)+ft(xi))+(yi^(t−1)+ft(xi))2]+Ω(ft)+constant
=
Σ
i
=
1
n
[
y
i
2
−
2
y
i
y
i
^
(
t
−
1
)
−
2
y
i
f
t
(
x
i
)
+
(
y
i
^
(
t
−
1
)
)
2
+
2
y
i
^
(
t
−
1
)
f
t
(
x
i
)
+
(
f
t
(
x
i
)
)
2
]
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
=\Sigma_{i=1}^n[y_i^2-2y_i\hat{y_i}^{(t-1)}- 2y_if_t(x_i)+ (\hat{y_i}^{(t-1)})^2+2\hat{y_i}^{(t-1)}f_t(x_i) +(f_t(x_i))^2]+\Omega(f_t)+ constant
=Σi=1n[yi2−2yiyi^(t−1)−2yift(xi)+(yi^(t−1))2+2yi^(t−1)ft(xi)+(ft(xi))2]+Ω(ft)+constant
=
Σ
i
=
1
n
[
2
(
y
i
^
(
t
−
1
)
−
y
i
)
f
t
(
x
i
)
+
(
f
t
(
x
i
)
)
2
]
+
Σ
i
=
1
n
[
(
y
i
)
2
−
2
y
i
y
i
^
+
(
y
i
^
(
t
−
1
)
)
2
]
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
=\Sigma_{i=1}^n[2{(\hat{y_i}^{(t-1)} - y_i)}f_t{(x_i)} +(f_t(x_i))^2]+ \Sigma_{i=1}^n[{(y_i)}^2-2y_i\hat{y_i} + {(\hat{y_i}^{(t-1)})}^2 ]+\Omega(f_t)+ constant
=Σi=1n[2(yi^(t−1)−yi)ft(xi)+(ft(xi))2]+Σi=1n[(yi)2−2yiyi^+(yi^(t−1))2]+Ω(ft)+constant
其中对于第t步来说,
Σ
i
=
1
n
[
(
y
i
)
2
−
2
y
i
y
i
^
+
(
y
i
^
(
t
−
1
)
)
2
]
\Sigma_{i=1}^n[{(y_i)}^2-2y_i\hat{y_i} + {(\hat{y_i}^{(t-1)})}^2 ]
Σi=1n[(yi)2−2yiyi^+(yi^(t−1))2]也是常数,所以 目标函数优化为:
o
b
j
(
t
)
=
Σ
i
=
1
n
[
2
(
y
i
^
(
t
−
1
)
−
y
i
)
f
t
(
x
i
)
+
(
f
t
(
x
i
)
)
2
]
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
obj^{(t)}=\Sigma_{i=1}^n[2{(\hat{y_i}^{(t-1)} - y_i)}f_t{(x_i)} +(f_t(x_i))^2]+\Omega(f_t)+ constant
obj(t)=Σi=1n[2(yi^(t−1)−yi)ft(xi)+(ft(xi))2]+Ω(ft)+constant
其中
(
y
i
^
(
t
−
1
)
−
y
i
)
(\hat{y_i}^{(t-1)} - y_i)
(yi^(t−1)−yi)为残差
分裂结点算法
1.贪心算法
2.近似算法
3.分布式加权直方图算法
正则化
Xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项中包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。 正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合。
对缺失值处理
xgboost把缺失值当做稀疏矩阵来对待,本身的在节点分裂时不考虑的缺失值的数值。缺失值数据会被分到左子树和右子树分别计算损失,选择较优的那一个。如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树。
优缺点
1.传统gbdt是用CART作为基分类器,xgboost还支持线性分类器。此时xgboost相当于带l1和l2正则化项的逻辑回归(分类问题)或者线性回归(回归问题)。
2.gbdt优化时只用到了一阶求导,xgboost对代价函数进行二阶泰勒展开,同时用到了一阶导数和二阶导数。xgboost可以自定义代价函数,只要函数可以一阶二阶求导。
3.xgboost在代价函数中加入了正则项用于控制模型复杂度。正则项包含树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。正则项用于降低模型variance,让模型更简单,防止过拟合。
4.缩减shrikage。xgboost在一次迭代完成后,会将叶子节点的权重乘上这个系数,为了削弱每个树的影响,让后面有更大学习空间。
5.列抽样。xgboost借鉴了随机森林的做法,支持列抽样,可以降低过拟合,减少计算。
6.对缺失值的处理。对于有特征缺失值的样本,xgboost可以自动学习分裂方向。
7.xgboost支持并行。xgboost的并行不是树粒度的,而是特征粒度上的。xgboost在训练之前,预先对数据进行排序,保存为block结构,迭代过程反复利用这个结构。在进行节点分裂时,需要计算每个特征的增益,选择增益大的特征做分裂,那么各个特征的增益计算可以并行。
sklearn参数
General Parameters(常规参数)
1.booster [default=gbtree]:选择基分类器,gbtree: tree-based models/gblinear: linear models
2.silent [default=0]:设置成1则没有运行信息输出,最好是设置为0.
3.nthread [default to maximum number of threads available if not set]:线程数
Booster Parameters(模型参数)
1.eta [default=0.3]:shrinkage参数,用于更新叶子节点权重时,乘以该系数,避免步长过大。参数值越大,越可能无法收敛。把学习率 eta 设置的小一些,小学习率可以使得后面的学习更加仔细。
2.min_child_weight [default=1]:这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
3.max_depth [default=6]: 每颗树的最大深度,树高越深,越容易过拟合。
4.max_leaf_nodes:最大叶结点数,与max_depth作用有点重合。
5.gamma [default=0]:后剪枝时,用于控制是否后剪枝的参数。
6.max_delta_step [default=0]:这个参数在更新步骤中起作用,如果取0表示没有约束,如果取正值则使得更新步骤更加保守。可以防止做太大的更新步子,使更新更加平缓。
7.subsample [default=1]:样本随机采样,较低的值使得算法更加保守,防止过拟合,但是太小的值也会造成欠拟合。
8.colsample_bytree [default=1]:列采样,对每棵树的生成用的特征进行列采样.一般设置为: 0.5-1
9.lambda [default=1]:控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
10.alpha [default=0]:控制模型复杂程度的权重值的 L1 正则项参数,参数值越大,模型越不容易过拟合。
11.scale_pos_weight [default=1]:如果取值大于0的话,在类别样本不平衡的情况下有助于快速收敛。
Learning Task Parameters(学习任务参数)
1.objective [default=reg:linear]:定义最小化损失函数类型,常用参数:
binary:logistic –logistic regression for binary classification, returns predicted probability (not class)
multi:softmax –multiclass classification using the softmax objective, returns predicted class (not probabilities)
you also need to set an additional num_class (number of classes) parameter defining the number of unique classes
multi:softprob –same as softmax, but returns predicted probability of each data point belonging to each class.
2.eval_metric [ default according to objective ]:
The metric to be used for validation data.
The default values are rmse for regression and error for classification.
Typical values are:
rmse – root mean square error
mae – mean absolute error
logloss – negative log-likelihood
error – Binary classification error rate (0.5 threshold)
merror – Multiclass classification error rate
mlogloss – Multiclass logloss
auc: Area under the curve
3.seed [default=0]:
The random number seed. 随机种子,用于产生可复现的结果
Can be used for generating reproducible results and also for parameter tuning.
注意: python sklearn style参数名会有所变化
eta –> learning_rate
lambda –> reg_lambda
alpha –> reg_alpha
参考文章:
https://www.cnblogs.com/xlingbai/p/8274250.html
https://blog.csdn.net/qdbszsj/article/details/79615712
https://blog.csdn.net/sb19931201/article/details/52557382
https://www.zhihu.com/question/41354392
https://www.zhihu.com/question/58230411/answer/242037063