概述
梯度提升回归树(梯度提升机)
梯度提升回归树是区别于随机森林的另一种集成方法,它的特点在于纠正与加强,通过合并多个决策树来构建一个更为强大的模型。
该模型即可以用于分类问题,也可以用于回归问题中。
梯度提升回归树与随机森林的方法不同,梯度提升采用连续的方式构造树,每颗树都试图纠正前一颗树的错误,也可称为弱学习器。
三个重要参数
在该模型中,有三个重要参数分别为 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)
可以看到,梯度提升树的特征重要性与随机森林的特征重要性有些类似,不过梯度提升树完全忽略了某些特征。
优、缺点
梯度提升决策树是监督学习中最强大也是最常用的模型之一。
该算法无需对数据进行缩放就可以表现得很好,而且也适用于二元特征与连续特征同时存在的数据集。
缺点是需要进行仔细调参,且训练时间可能较长,通常不适用于高维稀疏数据。
最后
以上就是傻傻睫毛为你收集整理的梯度提升回归树的全部内容,希望文章能够帮你解决梯度提升回归树所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复