ML之GB:GB算法相关论文、相关思路、关键步骤、代码实现、配图集合、案例应用之详细攻略
ML之GB:GB算法相关论文、相关思路、关键步骤、代码实现、配图集合、案例应用之详细攻略
GB算法相关文献、论文
后期更新……
GB算法关键步骤
后期更新……
1、算法流程
GB算法代码实现
1、Scikit-learn中的 GBM
sklearn.ensemble.GradientBoostingClassifier(loss='deviance', learning_rate=0.1,
n_estimators=100,
subsample=1.0, criterion='friedman_mse',
min_samples_split=2, min_samples_leaf=1,
min_weight_fraction_leaf=0.0, max_depth=3,
min_impurity_split=1e-07,
init=None, random_state=None, max_features=None,
verbose=0, max_leaf_nodes=None,
warm_start=False, presort='auto')
参数 | 说明 |
loss | 待优化的目标函数,'deviance’表示采用logistic损失,输出概率值;'exponential’ 表示采用指数损失。缺省'deviance’ |
learning_rate | 学习率或收缩因子。学习率和迭代次数/弱分类器数目n_estimators相关。 缺省:0.1 |
n_estimators | 当数/弱分类器数目. 缺省:100 |
subsample | 学习单个弱学习器的样本比例。缺省为:1.0 |
(1)、由于弱学习器为CART,所以很多参数与树模型的参数相同。
(2)、其中(loss='deviance', learning_rate=0.1, n_estimators=100, subsample=1.0, 这些参数主要关于弱学习器组合。
GB案例应用
1、GB用于回归
sklearn.ensemble.GradientBoostingRegressor 类的构造函数
函数API官方解释:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html#sklearn.ensemble.GradientBoostingRegressor
(1)、重点参数解释
Loss:字符串,可选(缺省值为“ls”)。梯度提升法用决策树来逼近整体损失函数的梯度。最常使用的整体损失项就是误差平方的和(sum squared error),这个就是通常的最小二乘回归方法的惩罚项。最小误差平方和(Least sum squared error)是一个很方便的选项,因为误差平方(squared error)在数学上处理比较简洁。但是对应实际的问题,其他的损失函数可能更合适。例如,笔者在研究自动交易问题时,注意到误差平方惩罚项会导致算法回避重大的损失,但是会接受较小的损失,但是较小的损失累积起来也是相当可观的。采用误差绝对值的和(Sum of absolute value of error)可以取得更好的性能,对自动交易问题更匹配。最小平均绝对值(Least mean absolute value)通常对异常点不敏感。梯度提升法是少数几个可以自由选择惩罚函数的算法。
可以取的字符串值如下。
● ls :最小均方误差(Least mean squared error)。
● lad :最小平均绝对误差(Least mean absolute value of error)。
● huber :胡贝尔误差是两种误差的混合:当误差数值较小时,取误差的平方,当
误差数值较大时,取误差的绝对值。
● quantile :分位数回归。预测分位数(由 alpha 参数指定)。
● Learning_rate。
浮点数,可选(缺省值为0.1)。
正如前面提到的,梯度提升法基于梯度下降法。Learning_rate 指明沿梯度方向的步长。如果步长太大,会看到误差迅速下降,然后迅速上升(是集成方法中决策树数目的函数)。如果步长太小,则误差下降得十分缓慢,需要训练更多的决策树。Learning_rate 的最佳值是依赖于问题的,也依赖于所选择的决策树的深度。缺省值0.1 是相对比较大的值,但是是一个很好的起点。首先选用这个值,观察是否导致了不稳定或者过拟合,然后再按需调整。
N_estimators:整型,可选(缺省值为100)。此参数指定集成方法中的决策树数目。如第6 章所述,也可以把它看作朝向梯度下降的方向,达到误差最小值所需的步数。也可以看作是增量式逼近所用的步数(即训练模型的数目)。因为每一个后续的逼近(每一个后续的决策树)都与learning rate( 学习速度)相乘,学习速度越大,朝向误差最小值取得同样的进步所需的决策树就越少。然而(正如在学习速度小节所讨论的那样),学习速度太高会导致过拟合。对于一个新问题,往往需要尝试几
次才能习得参数的最佳取值范围。缺省值100 可以作为一个很好的起点(特别是与学习速度的缺省值一起联合使用时)。
Subsample:浮点型,可选(缺省值为1.0)。如果与随机森林相似,用数据的抽样对决策树进行训练,则梯度提升法变成了随机梯度提升法。Friedman(算法发明人)建议subsample 取0.5。这是一个很好的起点。
Max_depth:整型,可选(缺省值为3)。就像随机森林,max_depth 是集成方法中单个决策树的深度,随机森林需要决策树达到一定深度才能产生高精确度的模型,然而梯度提升通过持续关注残差,使用深度为1 的决策树(叫作树桩stumps)就可以获得高精确度。梯度提升法对决策树深度的需求是由属性之间相关程度决定的。如果属性之间相互独立,则深度为1的决策树可以获得与深度为2 的决策树相同的性能。通常,可先将决策树的深度设为1,然后调整好其他参数。再将决策树的深度调整为2,看看是否会带来性能上的提升。笔者还从来没遇到过需要决策树深度为10 的问题。
Max_features:整型、浮点型、字符串,或者None, 可选(缺省值为None)。当查找最佳分割点时,需要考虑的属性的数目是由max_features 值和问题数据中属性的总数共同决定的。定义属性的总数为nFeatures,那么:如果 max_features 是整数,则在每次分割时考虑 max_features 个属性。如果 max_features 是浮点数,则 max_features 是需要考虑的属性占全体属性的百分比:int(max_features*nFeatures)。
可能的字符串值包括:
auto max_features=nFeatures
sqrt max_features=sqrt(nFeatures)
log2 max_features=log2(nFeatures)
如果 max_features 是 None,那么 max_features 等于 nFeatures。
在梯度提升法Python 实现中,max_features 起的作用与随机森林中的作用相同。它决定了在决策树的每个节点进行分割时需要考虑多少个属性。这使梯度提升法的Python 实现具有一个独特的能力:它可以用随机森林作为基学习器来代替原来需要考虑全部属性空间的决策树。
Warm_start:布尔型,可选(缺省值为False)。如果warm_start 设为True,fit() 函数将从上次训练停止的地方开始。
(2)、重点属性解释
Feature_importances:一个数组,其长度等于数据集中属性的数目。数组中的值是正的浮点数,表明了相应属性对预测结果的重要性。数值越大,表明此属性越重要。
Train_score:一个数组,其长度等于集成方法中决策树的数目。此数组存放在训练阶段对决策树依次训练时的误差。
(3)、重点方法解释
Fit(XTrain, yTrain, monitor=None):XTrain 和yTrain 的形式与随机森林中的一样。XTrain 是一个(nInstances*nAttributes)numpy 数组,这里nInstances 是训练数据集的行数,nAttributes 是属性的数目。yTrain 是
一个存放训练数据集目标的(nInstances *1)numpy 数组。对象monitor 是回调函数,用来提早停止训练。
Predict(X):Predict(x) 由一组属性X 产生预测,X 的列数(属性数)与训练数据集属性数一致,X 可以有任意行的数据。
Staged_predict(x):此函数的行为与predict() 函数的行为类似,除了它是可迭代的,根据梯度提升法生成一系列模型,然后根据模型产生一系列的预测值。每次调用都会利用梯度提升法在已产生的一系列模型中增加一个决策树,然后产生一个预测值。
2、GB用于分类
函数API官方解释:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html#sklearn.ensemble.GradientBoostingClassifier
(1)、重点参数解释
loss:deviance 对于分类问题,deviance 是缺省的,也是唯一的选项。
(2)、重点方法解释
fit(X,y , monitor=None):对于分类问题,其不同点只在于标签y 的不同。对应分类问题,标签是0 到类别总数减1 的一个整数。对于二分类问题,标签值为0或者1。对于多类别分类问题,如果共有nClass 个不同的类别,则标签取值为0 ~ nClass-1。
decision_function(X):梯度提升分类器实际上是回归决策树的集合,会产生与所属类别的概率相关的实数估计值。这些估计值还需要经过反logistic 函数将其转换为概率。转换前的实数估计值可通过此函数获得,对这些估计值的使用就像ROC 曲线计算中使用概率那样简单。
predict(X):此函数预测所属类别。
predict_proba(X):此函数预测所属类别的概率。它对于每个类别有一列概率值。对于二分类问题有两列。
对于多类别分类问题,共有nClass 列。上述函数的阶段性(staged)版本是可迭代的,产生与决策树数目相同的结果(也与
训练过程中执行的步数一致)。