GBDT:梯度提升树算法

GBDT全称为gradient boosting decision tree, 是一种基于决策树的集成学习算法。在Adaboost算法中,弱分类器的模型可以根据需要灵活选择,而GBDT则强制限定为决策树算法。

基于CART决策树算法,GBDT可以用于处理分类和回归两项任务。由此,GBDT又有了各种不同的叫法

1. GBDT, Gradient Boosting Decision Tree

2. GBRT,Gradient Boosting Regression Tree

3. MART, Multiple Addtive Regression Tree

从名称可以看出,GBDT和Adaboost算法一样,都是属于boosting的集成策略,多次迭代之间是存在一个链式的依赖关系。在Adaboost算法中,根据每次迭代调整下一次迭代样本的权重值,而在GBDT中,则将每次迭代的损失函数值作为下次迭代拟合的目标值。

在求解回归问题时,GBDT可以使用均方差作为误差的衡量值,在求解分类问题时,则使用逻辑回归中目标和损失函数的定义方式来量化计算过程。

以下列数据为例,具体看下算法的求解过程

该数据表示泰塔尼克号上乘客的生存情况,第一步,计算初始值,利用了逻辑回归中目标值的定义,计算如下

样本共6名乘客,其中4名生还,P表示生还的概率,1-P则表示死亡的概率,带入上述公式,即可算出初始值。

计算出初始值之后,计算样本初始值与真实值之间的残差,结果如下

将残差作为拟合的目标值,构建分类树,结果如下所示

注意,这个分类树是为了便于展示算法过程,构建的示例,并不是真实的分类结果。根据建好的分类树,要计算样本对应的新的拟合值,为了方便计算,引入了如下转换公式

使用该公式,对于示例中的决策树,第一个叶子节点的计算结果如下

第二个叶子节点的计算结果如下

第三个叶子节点的计算结果如下

整颗决策树的结果如下所示

接下来,引入学习率来定义每颗决策树的贡献,公式如下

学习率是自定义的,比如学习率设置为0.1, 根据上述公式计算每个乘客新的log odds, 以第一名乘客为例,结果如下

首先初始值为0.7,在第一次的决策树中该样本所在叶子节点的值为-0.16, 所以根据公式可以求解新的log odds值。接下来的迭代过程也是如此,每次迭代不断使用残差来计算新的log odds值,直到迭代终止。

在scikit-learn中,使用GBDT算法的代码如下

1. 分类

>>> from sklearn.datasets import make_hastie_10_2
>>> from sklearn.ensemble import GradientBoostingClassifier
>>> X, y = make_hastie_10_2(random_state=0)
>>> X_train, X_test = X[:2000], X[2000:]
>>> y_train, y_test = y[:2000], y[2000:]
>>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0,max_depth=1, random_state=0).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.913

2. 回归

>>> from sklearn.metrics import mean_squared_error
>>> from sklearn.datasets import make_friedman1
>>> from sklearn.ensemble import GradientBoostingRegressor
>>> X, y = make_friedman1(n_samples=1200, random_state=0, noise=1.0)
>>> X_train, X_test = X[:200], X[200:]
>>> y_train, y_test = y[:200], y[200:]
>>> est = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1,max_depth=1, random_state=0, loss='ls').fit(X_train, y_train)
>>> mean_squared_error(y_test, est.predict(X_test))
5.009154859960321
对于GBDT算法而言,其优点如下

1. 准确度和灵活性很高

2. 不需要数据预处理

3. 可以处理缺失值

缺点如下

1. 计算费时

2. 解释性不强

3. 容易过拟合

在实际运用中,相比Adaboost算法,GBDT的应用更多,无论在分类还是回归问题中,都可以尝试使用该模型。

·end·
(0)

相关推荐