梯度提升决策树(GBDT)作为集成学习中的佼佼者,以其在分类和回归任务中的卓越性能,赢得了广大数据科学家的青睐。本文将带您深入探索GBDT的神秘面纱,并展示如何使用sklearn库高效实现GBDT。
一 什么是GBDT
介绍GBDT之前,让我们先介绍下提升树(Boosting Tree)
提升树是以 分类树 或 回归树 为基本分类器的提升方法。 提升树被认为是统计学习中性能最好的方法之一。
提升方法实际采用加法模型( 即基函数的线性组合)与前向分步算法。 以决策树为基函数的提升方法称为提升树( boosting tree)。对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。
提升树利用加法模型与前向分歩算法实现学习的优化过程。 当损失函数是平方损失和指数损失函数时, 每一 步 优化是很简单的。 但对 一般损失函数而言, 往往每一步优化并不那么容易。 针对这一问题, Freidman 提出了 梯度提升( gradient boosting) 算法。它将问题转变成在损失函数梯度上寻找下降最快的方向,近似地求解。
GBDT 与提升树类似,模型依旧为加法模型、学习算法为前向分步算法。不同的是,GBDT 没有规定损失函数的类型,设损失函数为 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x))。
Gradient Boosting 是 Boosting 中的一大类算法,它的思想借鉴于梯度下降法,其基本原理是**「根据当前模型损失函数的负梯度信息来训练新加入的弱分类器」**,然后将训练好的弱分类器以累加的形式结合到现有模型中。采用决策树作为弱分类器的 Gradient Boosting 算法被称为 GBDT。
二 sklearn中的GBDT实现
让我们来看看如何使用scikit-learn
库来实现GBDT算法。
梯度树提升Gradient Tree Boosting或梯度提升树(Gradient Boosted Decision Trees,GBDT)是Booting对任意可微损失函数的推广。GBDT是一种准确有效的现成程序,可用于各种领域的回归和分类问题,包括Web搜索、排名和生态领域。
集成模块 sklearn.ensemble
通过梯度提升树提供了分类和回归的方法。
注意:在LightGBM (参看 [[LightGBM]](http://scikit-learn.org.cn/view/90.html#1.11.6 投票分类器))的启发下,Scikit-learn 0.21引入了两种新的梯度提升树的实验实现,即 HistGradientBoostingClassifier和 HistGradientBoostingRegressor。当样本数大于数万个样本时,这些基于直方图的估计可以比
GradientBoostingClassifier
和GradientBoostingRegressor
快几个数量级。他们还内置了对缺失值的支持,从而避免了计算的需要。这些估计器将在下面基于直方图的梯度提升[Histogram-Based Gradient Boosting](http://scikit-learn.org.cn/view/90.html#1.11.5 基于直方图的梯度提升)中更详细地描述。下面的指南重点介绍
GradientBoostingClassifier
和GradientBoostingRegressor
,它们可能是小样本大小的首选,因为在这个设置中,装箱可能会导致分割点过于接近。
-
导入必要的库:
from sklearn.ensemble import GradientBoostingClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split
-
加载数据:
# 加载鸢尾花数据集 iris = load_iris() X, y = iris.data, iris.target
-
划分数据集:
# 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
-
创建GBDT分类器:
# 创建GBDT分类器实例 gbdt = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
调参是提升GBDT性能的关键步骤。以下是一些常用的调参策略:
- n_estimators:控制弱学习器的数量,需要权衡模型复杂度和过拟合风险。
- learning_rate:学习率较小意味着需要更多的弱学习器来达到相同的拟合效果。
- max_depth:控制决策树的深度,防止模型过于复杂。
- subsample:样本抽样比例,小于1可以减少过拟合。
- max_features:划分时考虑的最大特征数,可以是整数或百分比。
-
训练模型:
# 训练模型 gbdt.fit(X_train, y_train)
-
评估模型:
# 预测 y_pred = gbdt.predict(X_test) # 计算准确率 from sklearn.metrics import accuracy_score accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy:.2f}")