本文共 5225 字,大约阅读时间需要 17 分钟。
boosting是一种集成技术,试图从多个弱分类器中创建强分类器。通过从训练数据构建一个模型,然后创建第二个模型试图纠正第一个模型中的错误。不断添加模型,直到训练集被完美地预测或者添加到最大数量。
提升算法的理论意义在于:如果一个问题存在弱分类器,则可通过提升的方法来得到一个强分类器。
集成方法主要包括Bagging和Boosting两种方法,Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法,即将弱分类器组装成强分类器的方法。
AdaBoost算法是基于Boosting思想的机器学习算法,AdaBoost是adaptive boosting(自适应boosting)的缩写,AdaBoost采用的是增加上一轮学习错误样本的权重的策略,其运行过程如下。
1、假设有如下数据集:
其中 ( x i , y i ) (x_i,y_i) (xi,yi)为第i个样本, x i x_i xi为输入向量, y i y_i yi为样本标签。2、初始化样本权重:
设定每个样本的权重都是相等的,即1/N。3、得到基本分类器:
使用具有权值分布 D m D_m Dm的训练数据集学习,得到第m个基本分类器 G m ( x ) G_m(x) Gm(x)。4、计算 G m ( x ) G_m(x) Gm(x)错误率:
其中,当 G m ( x i ) = y i G_m(x_i)=y_i Gm(xi)=yi时, I ( G m ( x i ) ) I(G_m(x_i)) I(Gm(xi))等于1,反之等于-1。5、计算 G m ( x ) G_m(x) Gm(x)权重系数:
6、更新第m+1次样本的权重: 其中, Z m Z_m Zm是规范化因子,目的是让权重相加为1,使 D m + 1 D_m+1 Dm+1成为一个概率分布。 7、构建基本分类器的线性组合: 8、得到最终分类器:AdaBoost使用的是指数损失,这个损失函数的缺点是对于异常点非常敏感,因而通常在噪音比较多的数据集上表现不佳。Gradient Boosting在这方面进行了改进,使得可以使用任何损失函数 (只要损失函数是连续可导的),使模型抗噪音能力更强。
在Gradient Boosting中将负梯度作为上一轮基学习器犯错的衡量指标,在下一轮学习中通过拟合负梯度来纠正上一轮犯的错误。梯度提升算法首先给定一个目标损失函数,它的定义域是所有可行的弱函数集合(基函数),提升算法通过迭代的选择一个负梯度方向上的基函数来逐渐逼近局部极小值。
1、假设有如下数据集:
其中 ( x i , y i ) (x_i,y_i) (xi,yi)为第i个样本, x i x_i xi为输入向量, y i y_i yi为样本标签。2、给定目标损失函数:
目标是找到一个近似函数 F ( x ) F(x) F(x)使得损失函数 L ( y , F ( x ) ) L(y,F(x)) L(y,F(x))的损失值最小。 损失函数的典型定义:3、构造近似函数:
假设 F ( x ) F(x) F(x)是一族基函数 f i ( x ) f_i(x) fi(x)的加权和: 4、扩展基函数: 以贪心思路来扩展 F ( x ) F(x) F(x)中的基函数,为了每次都能选择最优的基函数,这里使用梯度下降算法近似计算。 将所给样本代入基函数 f ( x ) f(x) f(x)得到 f ( x 1 ) , f ( x 2 ) , . . . , f ( x n ) f(x_1),f(x_2), ... , f(x_n) f(x1),f(x2),...,f(xn), 从而可以得到关于目标函数 L L L的向量,为 L ( y 1 , f ( x 1 ) ) , L ( y 2 , f ( x 2 ) ) , . . . , L ( y n , f ( x n ) ) L(y_1,f(x_1)),L(y_2,f(x_2)), ... ,L(y_n,f(x_n)) L(y1,f(x1)),L(y2,f(x2)),...,L(yn,f(xn)),我们对这个向量对于 f f f求偏导,让它们沿着负梯度方向下降一点点: 这里的 γ m \gamma_m γm就是步长,可以使用线性搜索求最优步长: 计算为伪残差 : 更新模型:XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学习竞赛中并取得了不错的成绩。
举个例子,我们要预测一家人谁是谁,则可以先通过年龄区分开小孩和大人,然后再通过性别区分开是男是女,如下图所示。
就这样,训练出了2棵树tree1和tree2,类似GBDT的原理,两棵树的结论累加起来便是最终的结论,所以小孩的预测分数就是两棵树中小孩所落到的结点的分数相加:2 + 0.9 = 2.9。爷爷的预测分数同理:-1 + (-0.9)= -1.9。具体如下图所示 如果不考虑工程实现、解决问题上的一些差异,XGBoost与GBDT比较大的不同就是目标函数的定义。XGBoost的目标函数如下图所示: 其中: 红色方框中的 l l l即为损失函数,绿色方框内为正则项(包括L1正则、L2正则),蓝色方框内为常数项。正则项:树的复杂度
XGBoost对树的复杂度包含了两个部分:枚举可行的分割点,选择增益最大的划分,继续同样的操作,直到满足某阈值或得到纯结点。
XGBoost 参数
在运行XGBoost程序之前,必须设置三种类型的参数: 通用类型参数(general parameters)、booster参数和学习任务参数(task parameters)。 一般类型参数——参数决定在提升的过程中用哪种booster,常见的booster有树模型和线性模型。 Booster参数——该参数的设置依赖于我们选择哪一种booster模型。 学习任务参数——参数的设置决定着哪一种学习场景,例如,回归任务会使用不同的参数来控制着排序任务。 命令行参数——一般和xgboost的CL版本相关。 Booster参数: 1、eta[默认是0.3] 和GBM中的learning rate参数类似。通过减少每一步的权重,可以提高模型的鲁棒性。典型值0.01-0.2 2. min_child_weight[默认是1] 决定最小叶子节点样本权重和。当它的值较大时,可以避免模型学习到局部的特殊样本。但如果这个值过高,会导致欠拟合。这个参数需要用cv来调整 3. max_depth [默认是6] 树的最大深度,这个值也是用来避免过拟合的3-10 4. max_leaf_nodes 树上最大的节点或叶子的数量,可以代替max_depth的作用,应为如果生成的是二叉树,一个深度为n的树最多生成2n个叶子,如果定义了这个参数max_depth会被忽略 5. gamma[默认是0] 在节点分裂时,只有在分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。这个参数值越大,算法越保守。 6. max_delta_step[默认是0] 这参数限制每颗树权重改变的最大步长。如果是0意味着没有约束。如果是正值那么这个算法会更保守,通常不需要设置。 7. subsample[默认是1] 这个参数控制对于每棵树,随机采样的比例。减小这个参数的值算法会更加保守,避免过拟合。但是这个值设置的过小,它可能会导致欠拟合。典型值:0.5-1 8. colsample_bytree[默认是1] 用来控制每颗树随机采样的列数的占比每一列是一个特征0.5-1 9. colsample_bylevel[默认是1] 用来控制的每一级的每一次分裂,对列数的采样的占比。 10. lambda[默认是1] 权重的L2正则化项 11. alpha[默认是1] 权重的L1正则化项 12. scale_pos_weight[默认是1] 各类样本十分不平衡时,把这个参数设置为一个正数,可以使算法更快收敛。 通用参数: 1. booster[默认是gbtree] 选择每次迭代的模型,有两种选择:gbtree基于树的模型、gbliner线性模型 2. silent[默认是0] 当这个参数值为1的时候,静默模式开启,不会输出任何信息。一般这个参数保持默认的0,这样可以帮我们更好的理解模型。 3. nthread[默认值为最大可能的线程数] 这个参数用来进行多线程控制,应当输入系统的核数,如果你希望使用cpu全部的核,就不要输入这个参数,算法会自动检测。 学习目标参数: 1. objective[默认是reg:linear] 这个参数定义需要被最小化的损失函数。最常用的值有:binary:logistic二分类的逻辑回归,返回预测的概率非类别。multi:softmax使用softmax的多分类器,返回预测的类别。在这种情况下,你还要多设置一个参数:num_class类别数目。 2. eval_metric[默认值取决于objective参数的取之] 对于有效数据的度量方法。对于回归问题,默认值是rmse,对于分类问题,默认是error。典型值有:rmse均方根误差;mae平均绝对误差;logloss负对数似然函数值;error二分类错误率;merror多分类错误率;mlogloss多分类损失函数;auc曲线下面积。 3. seed[默认是0] 随机数的种子,设置它可以复现随机数据的结果,也可以用于调整参数。转载地址:http://srmwi.baihongyu.com/