参考:https://blog.csdn.net/qq_16000815/article/details/81063320
scikit-learn基于梯度提升树算法提供了两个模型:
- GradientBoostingClassifier即GBDT(Gradient Boosting Decision Tree)梯度提升决策树,用于分类问题
- GradientBoostingRegressor即GBRT(Gradient Boost Regression Tree)渐进梯度回归树,用于回归问题
梯度提升决策树
from sklearn.ensemble import GradientBoostingClassifier
GradientBoostingClassifier(loss='deviance', 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, verbose=0,
max_leaf_nodes=None, warm_start=False,
presort='auto')
参数含义:
1、loss:损失函数
- loss='deviance',默认值,此时的损失函数与逻辑回归的损失函数相同,为对数损失:L(Y,P(Y|X))=-logP(Y|X)。
- loss='exponential',损失函数为指数损失函数。
2、learning_rate:float, optional (default=0.1)。学习率,在learning_rate和n_estimators之间需要权衡。通常学习率越小,需要的基本分类器就越多,因此在learning_rate和n_estimators之间要有所折中。
3、n_estimators:int (default=100),指定基本决策树的数量。梯度提升对过拟合有很好的鲁棒性,因此该值越大,性能越好。
4、subsample:float, optional (default=1.0)
- 用于拟合个体基本学习器的样本数量。如果小于1.0,模型将会变成随机梯度提升决策树。
- 如果subsample<1.0,此时会减少方差,提高偏差
5、criterion:string, optional (default="friedman_mse"),评估节点分裂的质量指标。
6、min_samplses_split:int, float, optional (default=2),表示分裂一个内部节点需要的最少样本数。
- 如果为整数,则min_samples_split就是最少样本数。
- 如果为浮点数(0到1之间),则每次分裂最少样本数为ceil(min_samples_split * n_samples)
7、min_samples_leaf:int, float, optional (default=1),叶子节点最少样本数
- 如果为整数,则min_samples_split就是最少样本数。
- 如果为浮点数(0到1之间),则每个叶子节点最少样本数为ceil(min_samples_leaf * n_samples)
8、min_weight_fraction_leaf:float, optional (default=0.),指定叶子节点中样本的最小权重。
9、max_depth:integer, optional (default=3),指定每个基本决策树的最大深度。最大深度限制了决策树中的节点数量。调整这个参数可以获得更好的性能。
10、min_impurity_decrease:float, optional (default=0.)
如果节点的分裂导致不纯度的减少(分裂后样本比分裂前更加纯净)大于或等于min_impurity_decrease,则分裂该节点。
个人理解这个参数应该是针对分类问题时才有意义。这里的不纯度应该是指基尼指数。
回归生成树采用的是平方误差最小化策略。分类生成树采用的是基尼指数最小化策略。
11、min_impurity_split:树生长过程中停止的阈值。如果当前节点的不纯度高于阈值,节点将分裂,否则它是叶子节点。这个参数已经被弃用。用min_impurity_decrease代替了min_impurity_split。
12、init:BaseEstimator, None, optional (default=None),一个基本分类器对象或者None,该分类器对象用于执行初始的预测。如果为None,则使用loss.init_estimator
13、random_state:int, RandomState instance or None, optional (default=None)
- 如果为整数,则它指定了随机数生成器的种子。
- 如果为RandomState实例,则指定了随机数生成器。
- 如果为None,则使用默认的随机数生成器。
14、max_features:int, float, string or None, optional (default=None)
搜寻最佳划分的时候考虑的特征数量。
- 如果为整数,每次分裂只考虑max_features个特征。
- 如果为浮点数(0到1之间),每次切分只考虑int(max_features * n_features)个特征。
- 如果为'auto'或者'sqrt',则每次切分只考虑sqrt(n_features)个特征
- 如果为'log2',则每次切分只考虑log2(n_features)个特征。
- 如果为None,则每次切分考虑n_features个特征。
- 如果已经考虑了max_features个特征,但还是没有找到一个有效的切分,那么还会继续寻找下一个特征,直到找到一个有效的切分为止。
- 如果max_features < n_features,则会减少方差,增加偏差。
15、verbose:int, default: 0,如果为0则不输出日志信息,如果为1则每隔一段时间打印一次日志信息。
16、max_leaf_nodes:int or None, optional (default=None),指定每颗决策树的叶子节点的最大数量。
- 如果为None,则叶子节点数量不限。
- 如果不为None,则max_depth被忽略。
17、warm_start:bool, default: False,当为True时,则继续使用上一次训练的结果,增加更多的estimators来集成。
18、presort:bool or 'auto', optional (default='auto'),在训练过程中,是否预排序数据加速寻找最佳划分。
属性:
- feature_importances_:数组,给出每个特征的重要性。
- oob_improvement_:array, shape = [n_estimators],数组,给出了每增加一颗基本决策树,在包外估计(即测试集上)的损失函数的改善情况(相对于上一轮迭代),即损失函数的减少值。
- train_score_:数组,给出每增加一颗基本决策树,在训练集上的损失函数的值。
- init:初始预测使用的分类器。
- estimators_:数组,给出每棵基础决策树。
方法:
- fit():训练模型
- predict():模型预测
- predict_log_proba():数组,预测各个类别的概率对数值。
- predict_proba():数组,预测各个类别的概率值。
渐进梯度回归树
from sklearn.ensemble import GradientBoostingRegressor
GradientBoostingRegressor(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')
参数含义:
1、loss:{'ls', 'lad', 'huber', 'quantile'}, optional (default='ls'),指定优化的损失函数。
- loss='ls':损失函数是平方损失函数
- loss='lad':损失函数为绝对值损失函数
- loss='huber':损失函数是上边两种损失函数的结合。