梯度提升树GBDT
GBDT是Boosting家庭中,除AdaBoost外另一个重要的算法。算法思想同样是让本轮迭代找到的决策树的损失比上轮更小。
GBDT负梯度拟合
用损失函数负梯度来拟合本轮损失近似值,进而拟合一个CART回归树。第t轮的第i个样本的损失函数的负梯度表示为:
[r_{ti}=-[frac{partial L(y_i,f(x_i))} {partial f(x_i)}]_{f(x)=f_{t-1}(x)}
]
利用((x_i,r_{ti})quad i=1,2,...,m)我们可以拟合一棵CART回归树,得到了第t棵回归树,对应的叶节点区域(R_{tj},j=1,2,...,J)其中J为叶子节点的个数。
针对每一个叶子节点里的样本,我们求出使用损失函数最小,也就是拟合叶节点最好的输出值(c_{tj})如下
[c_{tj}=underbrace{argmin}_csum_{x_iin R_{tj}}L(y_i,f_{t-1}(x_i)+c)
]
这样我们得到了本轮的决策树拟合函数如下
[h_t(x)=sum_{j=1}^Jc_{tj}I(xin R_{tj})
]
从而本轮最终得到的强学习器表达如下:
[f_t(x)=f_{t-1}(x)+sum_{j=1}^Jc_{tj}(xin R_{tj})
]
通过损失函数负梯度拟合,来减小误差。
GBDT常用损失函数
指数损失函数--类
[L(y,f(x))=exp(-yf(x))
]
对数损失函数--分类
[L(y,f(x))=-sum_{k=1}^Ky_klog p_k(x)
]
均方差--回归
[L(y,f(x))=(y-f(x))^2
]
绝对损失--回归
[L(y,f(x))=|y-f(x)|
]
Huber损失、分位损失--回归
见刘建平博客园
GBDT正则化
为防止过拟合,主要有三种方式
1)学习步长
2)子采样比例,这里是不放回抽样
3)CART树进行剪枝
GBDT总结
GBDT优点:
- 可以灵活处理各类型数据,包括连续值和离散值
- 调参较少,也可达到较好的准确率,相对SVM
- 对异常点的鲁棒性强
GBDT缺点:
- 学习器之间存在信赖关系,不能并行
sklearn GBDT使用
类库
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import GradientBoostingRegressor
参数
- n_estimators:最大迭代次
- learning_rate:学习器权重缩减系数
- subsample:子采样
- init:初始化学习器
- loss:损失函数
实例
gbm = GradientBoostingClassifier(random_state=10)
gbm.fit(x,y)
然后使用GridSearchCV对各参数进行调试。
param_test = {'n_estimators': range(20, 81, 10)}
gs = GridSearchCV(estimator=GradientBoostingClassifier(learning_rate=0.1, min_samples_split=300, min_samples_leaf=20, max_depth=8,max_features='sqrt', subsample=0.8, random_state=10), param_grid=param_test,scoring='roc_auc', iid=False, cv=5)