<>梯度提升回归树(梯度提升机)
梯度提升回归树是区别于随机森林的另一种集成方法,它的特点在于纠正与加强,通过合并多个决策树来构建一个更为强大的模型。
该模型即可以用于分类问题,也可以用于回归问题中。
梯度提升回归树与随机森林的方法不同,梯度提升采用连续的方式构造树,每颗树都试图纠正前一颗树的错误,也可称为弱学习器。
<>三个重要参数
在该模型中,有三个重要参数分别为 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_selectionimport 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_selectionimport 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_selectionimport 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)
可以看到,梯度提升树的特征重要性与随机森林的特征重要性有些类似,不过梯度提升树完全忽略了某些特征。
<>优、缺点
梯度提升决策树是监督学习中最强大也是最常用的模型之一。
该算法无需对数据进行缩放就可以表现得很好,而且也适用于二元特征与连续特征同时存在的数据集。
缺点是需要进行仔细调参,且训练时间可能较长,通常不适用于高维稀疏数据。