目录
余下部分引自简书:作者:ghostdogss 链接:https://www.jianshu.com/p/2e07e4186cfe
五、Shrinkage and Column Subsampling(XGBoost两种防止过拟合的方法)
主要根据贪心科技李文哲老师直播视频记录
Bagging与Boosting二者都是由weak learner 组合而成,但有所区别:
Bagging:Leverages unstable base learners that are weak because of Overfitting
----可以理解为‘’多个专家‘’组的组合因过拟合而变弱
Boosting: Leverages stable base learners that are weak because of Underfitting
----多个‘’普通人‘’的组合本身是弱的而欠拟合
Boosting:是基于残差的训练,即以和的形式不断地弥补模型的预测误差。
即预测模型是按照一定顺序迭代生成的(Additive Training)。
给定Model1,但它的预测效果不怎么好,误差比较大,如果我们不能对Model1做任何改变,那么只能在此模型基础上加上新的Model2去拟合Model1预测的残差(真实值-Model1预测值);以此类推,直到Modelk能够达到较好的预测效果(残差较小);
那么,最终预测=Model1预测+Model2预测+...
XGBoost的优点:
算法可以并行,训练效率高;实际效果相对较好;超参数多,可以灵活调整
下面引出理解XGBoost的四个主要部分
1.怎样构造目标函数呢?
2.目标函数难以直接优化,如何近似?
3.如何把树的结构引入到目标函数(参数化)
4.仍然难以优化,使用贪心算法
首先假设我们已经有K棵树
一、构造目标函数:
如前述最终预测等于各个模型预测的加和:
那么,我们有:
(1)
其中记
为前k-1颗树的预测值的加和(显然,为已知项)
那么目标(损失)函数为:
, 即损失函数+正则化项/惩罚项(控制模型复杂度,防止过拟合) (2)
那么,(训练第K棵树时)目标函数可以修改为:
(3)
其中第二项
为常数
那么最终目标函数化简为最小化下式
(4)
二、目标函数的近似
这里主要利用Taylor(泰勒的二阶展开式来近似目标函数)
Taylor展开式形式如下:
令(4)式中
,
分别记为
和
;那么目标函数可以近似为:
(5)
这里在训练第k颗树时,
,以及前k-1颗树对应的一阶偏导,二阶偏导都是已知(已经计算出来)的。
那么,目标函数就转化为最小化下式:
(6)
(7)
(8)
然后,我们怎么去定义(参数化)
以及 惩罚项
呢
三、把树的结构引入目标函数(参数化)
1.参数化
首先引入三个变量:
如上图所示
1)叶节点的值(leaf value)的向量
:如上图从左到右将叶节点排序那么得到,
2)样本x的位置(sample position)
:
,假设第一个叶节点上有样本{1,3};第二个叶节点上有样本{4};第三个叶节点上有样本{2,5}
------那么, 如图所示,
=1(第一个样本所在的位置)
最后,我们可以得到
(9)
但是,对于这种复合函数
依然难以去求解和处理
因此,这里又定义了第三个变量:
3)叶节点含有的样本集合:
,即哪些样本落在第j个叶节点上
如上图中,
;
;
2.参数化
树的复杂度通常可以通过两个方面表示:
树的深度/叶结点个数: T
叶节点的值:
那么我们得到参数化的惩罚项,
(10)
3.利用定义的变量
整合目标函数
经过1,2步骤我们可以得到参数化后的目标函数为:
(11)
之前说到,对于w下标含有自变量难以求解,那么我们利用之前定义的
去简化上式:
因为一个叶节点可能有多个样本,那么这些同一叶节点的样本的值
是相等的只有
不同
那么,上式可以被化简为:
(12)
不难发现,上式是一个二次优化:
的形式:
那么,目标函数的取得最优的点为:
(13)
(14)
,
(15)
四、生成树的过程,利用贪心算法
之前的决策树已经知道,树的形状选择(特征划分)是利用信息熵或基尼系数(ID3,C4.5,CART),选择使得不确定性减少最大的那个特征(信息增益最大):
min[ 不确定性(old) -不确定性(new)] --------即 选择使得信息不确定性最小(信息增益最大)的特征
那么,对于XGBoost也是类似,只是将信息增益替换为Obj,即按照使得目标函数最小的特征划分:
max[Obj(old)-Obj(new)] ---------即选择差值最大的那个特征(表明新的目标函数 Obj(new)最小)
余下部分引自简书:作者:ghostdogss 链接:https://www.jianshu.com/p/2e07e4186cfe
五、Shrinkage and Column Subsampling(XGBoost两种防止过拟合的方法)
XGBoost还提出了两种防止过拟合的方法:Shrinkage and Column Subsampling。
Shrinkage方法就是在每次迭代中对树的每个叶子结点的分数乘上一个缩减权重η,这可以使得每一棵树的影响力不会太大,留下更大的空间给后面生成的树去优化模型。
Column Subsampling类似于随机森林中的选取部分特征进行建树。
Column Subsampling可分为两种,
一种是按层随机采样,在对同一层内每个结点分裂之前,先随机选择一部分特征,然后只需要遍历这部分的特征,来确定最优的分割点。
另一种是随机选择特征,则建树前随机选择一部分特征然后分裂就只遍历这些特征。
一般情况下前者效果更好。
六、近似算法
对于连续型特征值,当样本数量非常大,该特征取值过多时,遍历所有取值会花费很多时间,且容易过拟合。
因此XGBoost思想是对特征进行分桶,即找到l个划分点,将位于相邻分位点之间的样本分在一个桶中。在遍历该特征的时候,只需要遍历各个分位点,从而计算最优划分。
从算法伪代码中该流程还可以分为两种,全局的近似是在新生成一棵树之前就对各个特征计算分位点并划分样本,之后在每次分裂过程中都采用近似划分,而局部近似就是在具体的某一次分裂节点的过程中采用近似算法。
七、针对稀疏数据的算法(缺失值处理)
当样本的第i个特征值缺失时,无法利用该特征进行划分时,
XGBoost的想法是将该样本分别划分到左结点和右结点,然后计算其增益,哪个大就划分到哪边。
八、python实现
from sklearn import datasets
from sklearn.model_selection import train_test_split
import xgboost as xgb
from sklearn import metrics
# 导入鸢尾花的数据
iris = datasets.load_iris()
# 特征数据
data = iris.data[:100] # 有4个特征
# 标签
label = iris.target[:100]
# 提取训练集和测试集
# random_state:是随机数的种子。
train_x, test_x, train_y, test_y = train_test_split(data, label, random_state=0)
dtrain = xgb.DMatrix(train_x, label = train_y)
dtest = xgb.DMatrix(test_x)
# 参数设置
params={'booster':'gbtree',
'objective': 'binary:logistic',
'eval_metric': 'auc',
'max_depth':4,
'lambda':10,
'subsample':0.75,
'colsample_bytree':0.75,
'min_child_weight':2,
'eta': 0.025,
'seed':0,
'nthread':8,
'silent':1}
watchlist = [(dtrain,'train')]
bst=xgb.train(params,dtrain,num_boost_round=100,evals=watchlist)
ypred=bst.predict(dtest)
# 设置阈值, 输出一些评价指标
# 0.5为阈值,ypred >= 0.5输出0或1
y_pred = (ypred >= 0.5)*1
# ROC曲线下与坐标轴围成的面积
print ('AUC: %.4f' % metrics.roc_auc_score(test_y,ypred))
# 准确率
print ('ACC: %.4f' % metrics.accuracy_score(test_y,y_pred))
print ('Recall: %.4f' % metrics.recall_score(test_y,y_pred))
# 精确率和召回率的调和平均数
print ('F1-score: %.4f' %metrics.f1_score(test_y,y_pred))
print ('Precesion: %.4f' %metrics.precision_score(test_y,y_pred))
metrics.confusion_matrix(test_y,y_pred)