我是靠谱客的博主 傻傻睫毛,最近开发中收集的这篇文章主要介绍梯度提升回归树,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

梯度提升回归树(梯度提升机)

梯度提升回归树是区别于随机森林的另一种集成方法,它的特点在于纠正加强,通过合并多个决策树来构建一个更为强大的模型。

该模型即可以用于分类问题,也可以用于回归问题中。

梯度提升回归树与随机森林的方法不同,梯度提升采用连续的方式构造树,每颗树都试图纠正前一颗树的错误,也可称为弱学习器。

三个重要参数

在该模型中,有三个重要参数分别为 n_estimators(子树数量)、learning_rate(学习率)、max_depth(最大深度)

子树数量 n_estimators

通常用来设置纠正错误的子树数量,梯度提升树通常使用深度很小(1到 5之间)的子树,即强预剪枝,来进行构造强化树。

并且这样占用的内存也更少,预测速度也更快。

学习率 learning_rate

通常用来控制每颗树纠正前一棵树的强度。

较高的学习率意味着每颗树都可以做出较强的修正,这样的模型普遍更复杂。

最大深度 max_depth

通常用于降低每颗树的复杂度,从而避免深度过大造成过拟合的现象。

梯度提升模型的 max_depth 通常都设置得很小,一般来讲不超过5。

GradientBoostingClassifier类的应用

下面是在乳腺癌数据集上应用sklearn.ensemble包GradientBoostingClassifier类的示例。

默认参数

默认使用100颗树,最大深度为3,学习率为0.1。

from sklearn.ensemble import GradientBoostingClassifier           #引入梯度提升回归树类
from sklearn.datasets import load_breast_cancer                   #加载乳腺癌数据集
from sklearn.model_selection import train_test_split              #引入切分数据集方法

cancer = load_breast_cancer()

X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)    #切分数据集


grbt = GradientBoostingClassifier()         #定义梯度提升回归树模型
grbt.fit(X_train, y_train)                  #训练数据


print('Accuracy on training set: {:.3f}'.format(grbt.score(X_train, y_train)))
print('Accuracy on test set: {:.3f}'.format(grbt.score(X_test, y_test)))                            #输出训练集与测试集的结果

Accuracy on training set: 1.000
Accuracy on test set: 0.965

可见训练集的预测准确度为 100%, 测试集的准确度为 96.5%, 存在过拟合现象,接下来微调参数。

降低最大深度 max_depth

from sklearn.ensemble import GradientBoostingClassifier           #引入梯度提升回归树类
from sklearn.datasets import load_breast_cancer                   #加载乳腺癌数据集
from sklearn.model_selection import train_test_split              #引入切分数据集方法

cancer = load_breast_cancer()

X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)    #切分数据集


grbt = GradientBoostingClassifier(max_depth=1)         #定义梯度提升回归树模型,子树最大深度设置为 1
grbt.fit(X_train, y_train)                             #训练数据


print('Accuracy on training set: {:.3f}'.format(grbt.score(X_train, y_train)))
print('Accuracy on test set: {:.3f}'.format(grbt.score(X_test, y_test)))                            #输出训练集与测试集的结果

Accuracy on training set: 0.991
Accuracy on test set: 0.972

可见,测试集性能有所提升,训练集性能有所降低,泛化能力加强。

降低学习率 learning_rate

from sklearn.ensemble import GradientBoostingClassifier           #引入梯度提升回归树类
from sklearn.datasets import load_breast_cancer                   #加载乳腺癌数据集
from sklearn.model_selection import train_test_split              #引入切分数据集方法

cancer = load_breast_cancer()

X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)    #切分数据集


grbt = GradientBoostingClassifier(learning_rate=0.01)         #定义梯度提升回归树模型,学习率设置为 0.01
grbt.fit(X_train, y_train)                                    #训练数据


print('Accuracy on training set: {:.3f}'.format(grbt.score(X_train, y_train)))
print('Accuracy on test set: {:.3f}'.format(grbt.score(X_test, y_test)))                            #输出训练集与测试集的结果
Accuracy on training set: 0.988
Accuracy on test set: 0.958

可见,训练集与测试集预测准确度都有所下降,且泛化能力无明显加强,故学习率取默认值较好。

特征重要性分析

我们可以将梯度提升回归树的特征重要性可视化,便于更好地理解模型。

import matplotlib.pyplot as plt
import numpy as np

def plot_feature_importance_cancer(model):
    
    #获取到特征的个数
    n_features = cancer.data.shape[1]
    
    #根据重要性进行绘图
    plt.barh(range(n_features), model.feature_importances_, align='center')
    
    plt.yticks(np.arange(n_features), cancer.feature_names)
    plt.xlabel('Feature importance')
    plt.ylabel('Feature')

grbt = GradientBoostingClassifier(max_depth=1)                #树的最大深度设置为1
grbt.fit(X_train, y_train)                                    #训练数据
#绘图画出重要性
plot_feature_importance_cancer(grbt)

在这里插入图片描述

可以看到,梯度提升树的特征重要性与随机森林的特征重要性有些类似,不过梯度提升树完全忽略了某些特征。

优、缺点

梯度提升决策树是监督学习中最强大也是最常用的模型之一。

该算法无需对数据进行缩放就可以表现得很好,而且也适用于二元特征与连续特征同时存在的数据集。

缺点是需要进行仔细调参,且训练时间可能较长,通常不适用于高维稀疏数据。

最后

以上就是傻傻睫毛为你收集整理的梯度提升回归树的全部内容,希望文章能够帮你解决梯度提升回归树所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部