sklearn 基础教程

sklearn 特征工程

sklearn 基础教程

sklearn 分类算法

sklearn 回归算法

sklearn 笔记

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/sklearn-gbdt.html

sklearn GBDT回归


sklearn(scikit-learn)的ensemble包中,实现了非常流行的gbdt回归算法。

gbdt算法的详细说明不在这里讲述,请参见机器学习之GBDT算法

sklearn的gbdt回归

sklearn中的gbdt实现是GradientBoostingRegressor类。

GradientBoostingRegressor是一个基于向前分布算法的加法模型。每一轮迭代,它都用损失函数的负梯度来拟合本轮损失的近似值。

GradientBoostingRegressor类构造方法

def __init__(self, loss='ls', 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.,
                 max_depth=3, min_impurity_decrease=0.,
                 min_impurity_split=None, init=None, random_state=None,
                 max_features=None, alpha=0.9, verbose=0, max_leaf_nodes=None,
                 warm_start=False, presort='auto')

参数

  • loss:表示损失函数,可选项为{'ls', 'lad', 'huber', 'quantile'},默认是'ls';'ls'(least squares)指的是最小二乘法(即最小化均方差),适合数据噪点不多的情况下,因为对于异常点会施以较大的惩罚;'lad'(least absolute deviation)指的是最小化绝对偏差,如果有较多异常点,则绝对值损失表现较好,但绝对值损失的缺点是在y−f(x)=0处不连续可导,因而不容易优化;'huber'是对'ls'和'lad'的综合,当|y−f(x)|小于一个事先指定的值δ时,变为平方损失,大于δ时,则变成类似于绝对值损失,因此也是比较鲁棒(健壮)的损失函数;'quantile'指的是分位数损失函数,它允许分位数回归(使用alpha来指定分位数);
  • learning_rate:学习率(也称之为step,即步长),通俗一点讲就是基学习器权重缩减的系数,对于同样的训练集拟合效果,较小的步长意味着我们需要更多的迭代次数,通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数n_estimators和learning_rate要一起调参。默认是0.1;
  • n_estimators:迭代的次数;GB对于过拟合的数据有很强的鲁棒性,所以较大的迭代次数会有很好的效果,默认是100;
  • criterion:用来设置回归树的切分策略,可选项为{'friedman_mse','mse','mae'},默认是'friedman_mse';'friedman_mse'对应的是最小平方误差的近似,加入了Friedman的一些改进;'mse'指的是最小均方差;'mae'对应的是最小绝对值误差,0.18版本及之后引进的
  • alpha:当loss选择为'huber'或'quantile'时,对应的alpha值,只有这两种值时,alpha才有意义,如果噪音点较多,可以适当降低这个分位数的值,默认是0.9;
  • subsample:子采样率,如果小于1.0,则会导致随机梯度增强(Stochastic Gradient Boosting)。 子样本与参数n_estimators一起调整使用。 选择子样本<1.0会导致方差减少和偏差增加。推荐在[0.5, 0.8]之间,默认是1.0,即不使用子采样,训练每个基学习器时使用原始的全部数据集;
  • max_depth:基回归估计器的最大深度,调整好该参数可以收到更好的学习效果,默认是3;
  • min_samples_split:基回归树在分裂时的最小样本数或占比,默认是2;当传值为整数时,表示分裂最小样本数;当传值为浮点数时,表示分裂最小样本数是ceil(min_samples_split * n_samples),浮点数的用法是0.18版本时增加的
  • min_samples_leaf:基回归树叶子节点上的最小样本数,默认是1;当传值为整数时,表示叶子最小样本数;当传值为浮点数时,表示叶子最小样本数是ceil(min_samples_split * n_samples),浮点数的用法是0.18版本时增加的
  • min_weight_fraction_leaf:叶子节点最小样本权重总和值,即叶子节点所有样本的权重总和值小于该阈值,那就选择树的剪枝(即不分裂);如果样本本身不存在样本权重,该参数无任何意义,默认是0;
  • max_features:在选择分裂特征时的候选特征的最大数,可以是int,、float、string或None,默认是None;如果是int型,表示候选特征的最大数;如果是float型,代表最大数是所占比,即阈值是int(max_features * n_features);如果是"auto",最大数就等于总特征数n_features;如果是"sqrt",则max_features=sqrt(n_features);如果是"log2",则max_features=log2(n_features);如果是None,则max_features=n_features;当选择`max_features < n_features`时,会导致方差减少和偏差增加;
  • max_leaf_nodes:最大的叶子节点数,默认是None;
  • min_impurity_split:树分裂时的最小不纯度阈值,小于该阈值,树不分裂,即为叶子节点;默认是None,该参数在0.19版本之后抛弃使用,0.19版本暂时保留,最好选用min_impurity_decrease
  • min_impurity_decrease:最小不纯度的阈值,用于代替之前的min_impurity_split参数,阈值公式为N_t / N * (impurity - N_t_R / N_t * right_impurity - N_t_L / N_t * left_impurity),N_t表示当前节点的样本数,N表示总样本数,N_t_R表示右子节点的样本数,N_t_L表示左子节点的样本数;
  • init:用来计算初始基学习器的预测,需要具备fit和predict方法,若未设置则默认为loss.init_estimator,默认是None;
  • verbose:日志跟踪级别,默认是0;如果传值为1,根据情况(树越多,越低频率)打印训练过程和训练表现;如果传值大于1,打印每棵树的训练过程和训练表现;
  • warm_start:是否热启动,bool类型,默认是False;若设置为True,允许添加更多的估计器到已经适合的模型;
  • random_state:随机状态,可以是整型数字,也可以是RandomState实例,默认是None;主要是通过随机种子,重现训练过程,None表示不设置随机种子,底层使用numpy的random函数;
  • presort:是否预排序,可以是bool值和'auto',默认auto;预排序可以加速查找最佳分裂点,当设置为auto时,对非稀疏数据进行预排序,对稀疏数据不起作用;对稀疏数据设置True的话,会引起error;预排序是0.17版本新加的

最终估计器对象的相关属性

  • feature_importances_:每个特征的重要性,是一个浮点数数组,每项相加总和为1;数值越高说明该特征越重要;
  • oob_improvement_:使用包外样本来计算每一轮训练后模型的表现提升,它是一个数组,外包估算可用于模型选择,例如确定最佳迭代次数。OOB估计通常非常悲观,因此我们建议使用交叉验证,而只有在交叉验证太费时的情况下才使用OOB;
  • train_score_:训练得分,其实就是每棵训练树的误差(损失函数对应的值);
  • loss_:具体的损失函数对象;
  • init:设置init参数时的对象;
  • estimators_:基回归树集合,是一个数组;

示例

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn import ensemble


# 加载sklearn自带的波士顿房价数据集
dataset = load_boston()

# 提取特征数据和目标数据
X = dataset.data
y = dataset.target

# 将数据集以9:1的比例随机分为训练集和测试集,为了重现随机分配设置随机种子,即random_state参数
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.9, test_size=0.1, random_state=188)

# 实例化估计器对象
params = {'n_estimators': 500, 'max_depth': 4, 'min_samples_split': 2,
          'learning_rate': 0.01, 'loss': 'ls'}
gbr = ensemble.GradientBoostingRegressor(**params)

# 估计器拟合训练数据
gbr.fit(X_train, y_train)

# 训练完的估计器对测试数据进行预测
y_pred = gbr.predict(X_test)

# 输出特征重要性列表
print(gbr.feature_importances_)
print(mean_squared_error(y_test, y_pred))