使用 Scikit Learn 的梯度提升分类器

2025 年 6 月 4 日 | 11 分钟阅读

梯度提升是一种集成技术,其中决策树是顺序构建的,根据指定损失函数(误差梯度)的总和来纠正先前树的错误。

通过结合多个弱学习器(即决策树),梯度提升分类器是一组强大的机器学习算法,可生成强大的预测模型。由于它们能够处理大型数据集,因此它们帮助赢得了许多 Kaggle 数据科学竞赛。

如果您要在 Python 应用程序中使用梯度提升分类器,您会发现 Scikit Learn 中提供了多种梯度提升分类器实现,包括 XGBoost 等。

在本文中,我们将快速了解梯度提升模型的理论和各种在 Scikit-Learn 中拟合梯度提升模型以执行分类任务的技术。

梯度提升参数

参数描述
n_estimators (int, 默认值=100)提升阶段(树)的数量。值越高,性能越好,但训练时间越长。
learning_rate (float, 默认值=0.1)创建一个新的贡献,该贡献小于与该树关联的原始值。有时需要使用较低的值,但结果可能会好得多。
max_depth (int, 默认值=3)每棵树的最大深度。有助于调节模型复杂性并防止过拟合。
Subsample (float, 默认值=1.0)这是在 bagging 的情况下用于拟合每个材料树的训练数据比例,或者在 boosting 的情况下用于组合决策树以做出单一决策的学习率数量。小于 1.0 的值会减少实例间分离(学习率或收缩或随机梯度提升)。
max_features (int float string None, 可选)在对决策树进行拆分之前需要查看的特征数量,我们可以将其用作选择拆分的启发式方法。减少此值可以降低方差。
min_samples_split (int, 默认值=2)分割节点所需的最小样本数。提及的值可以促进模型中更高层次的调节。
min_samples_leaf (int, 默认值=1)节点中必须存在的样本数才能成为叶节点。减少模型的复杂性,从而最大限度地减少学习模型的过拟合,以提高整体性能和准确性。
random_state (int, 可选)通过在训练期间固定初始化,这始终使训练非随机,从而使结果可重现。
loss ({‘deviance’} | 默认值='deviance')在此处优化的损失函数的名称,其中“deviance”指的是概率分类(逻辑回归)。
max_leaf_nodes (int 或 None | 默认值=None)叶节点的最大数量。它以最佳优先方式生长树。如果设置,则覆盖 max_depth。
init (estimator 或 None | 默认值=None)用于预测的初始估计器。必须实现 fit 和 predict。默认为损失函数的初始估计器。
verbose (int | 默认值=0)它在训练期间设置输出参数。
0:静默
1:偶尔更新
>1:每棵树更新
warm_start (bool | 默认值=False)否则,如果为 True,则重用以前的拟合结果并添加更多估计器,而不是重新开始。

梯度提升属性

属性描述
feature_importances_ (数组, 形状 = [n_features])这些值显示每个特征的重要性。获得较高评分的特征对模型结果的影响更大。
oob_improvement_ (数组, 形状 = [n_estimators])第一阶段,袋外样本上的损失偏差减少,显示了初始估计器的性能。
通过创建为分解记录的模型运行数组 (n_estimators) 来控制性能指标。
我们的模型在所有处理步骤都评估了袋外数据。该属性现已过时;将其替换为 oob_improvement_。
train_score_ (数组, 形状 = [n_estimators])在训练期间,每个步骤都根据袋内样本评估偏差。当 subsample 等于 1 时,完整的训练数据集用作损失数据的基础。
loss_ (LossFunction 对象)训练过程使用特定的损失函数。
init (BaseEstimator)估计器需要从初始预测开始,这些预测要么来自用户输入作为 init 参数,要么来自损失函数分析。
Estimators_ (DecisionTreeRegressor 列表)在 boosting 期间训练子估计器后,这将创建所有已构建的 DecisionTreeRegressor 的集成。

实现梯度提升的步骤

构建梯度提升分类器的主要步骤通常是

1. 拟合模型

设置模型后,您可以轻松地在 Scikit-Learn 中拟合它;只需使用其 fit 方法在训练数据上调用它。

2. 调整参数和超参数

模型的性能需要优化,因此其超参数需要仔细调整。常见的调整策略包括调整学习率、估计器数量和树的深度。

3. 进行预测

拟合模型后,您可以使用 predict() 方法对测试数据进行预测。应将性能与实际标签和预测值进行比较。

4. 解释结果

默认情况下,使用准确性来评估分类器。如果准确性不够好,您可以重新访问模型的参数或超参数。重复此过程,直到模型达到所需的性能水平。

使用 Scikit-Learn 进行梯度提升分类

为此,我们将使用 scikit-learn 的乳腺癌数据集来构建梯度提升分类器。

然后,我们导入用于数据处理、构建和评估模型以及交叉验证的必要库。

之后,我们加载数据集并将其转换为 pandas 数据帧以便于处理。然后,我们根据特征和标签分割数据,并训练它们使用 5 折交叉验证将数据分割成训练集和验证集。

然后,我们最后初始化一个具有特定学习率的 GradientBoostingClassifier,并验证其默认参数。

安装 sci-kit-learn 库

确保您已安装最新版本的 scikit learn,并且在继续之前,请确保为您的 Python 安装运行更新和升级。您只需在 shell 中发出以下命令即可安装它

如果您想了解更多关于您平台安装的信息,请参阅官方 scikit-learn 安装指南。

验证安装

此脚本将在安装后检查您是否正确安装了 scikit-learn,然后验证版本。

输出

 
1.4.0

它应该输出版本 0.22.1 及以上。

示例 1:乳腺癌数据集 (Scikit-learn)

输出

 
{
 'ccp_alpha': 0.0,
 'criterion': 'friedman_mse',
 'init': None,
 'learning_rate': 0.1,
 'loss': 'log_loss',  # (if sci-kit-learn >= 1.1) or 'deviance' in older versions
 'max_depth': 3,
 'max_features': None,
 'max_leaf_nodes': None,
 'min_impurity_decrease': 0.0,
 'min_samples_leaf': 1,
 'min_samples_split': 2,
 'min_weight_fraction_leaf': 0.0,
 'n_estimators': 100,
 'n_iter_no_change': None,
 'presort': 'deprecated',  # (only in old versions, not in newer ones)
 'random_state': None,
 'subsample': 1.0,
 'tol': 0.0001,
 'validation_fraction': 0.1,
 'verbose': 0,
 'warm_start': False
}

示例 2:数字识别

输出

 
Gradient Boosting Classifier accuracy is 0.96

使用 XGBoost 进行梯度提升

XGBoost (Extreme Gradient Boosting) 是一种广泛使用、可扩展且功能强大的机器学习算法,基于决策树集成。它是一种非常流行的算法,用于分类和回归任务,并因其速度和性能而使用。对于此示例,我们向您展示如何通过使用 XGBClassifier 来解决二元分类问题。

  • 合成数据集创建 (make_classification)
  • K 折交叉验证以评估模型
  • 在完整数据集上进行训练
  • 预测新的数据样本

它有助于评估模型性能并在实际场景中生成预测。

安装 XGBoost 库

如果您想使用 pip 安装 XGBoost,请在终端中运行以下命令。

请参阅 XGBoost 安装指南以获取您平台的官方详细安装说明,另一方面,某些步骤是本节中所示的通用说明。

验证安装

此脚本可在安装后运行,以确保 XGBoost 已正确安装及其版本。

输出

 
3.0.0

输出应显示版本 1.0.1 或更高。

它提供与 scikit learn 兼容的包装器,像 GridSearchCV 和 Pipeline 一样易于使用。其中包括

XGBClassifier – 用于分类任务

XGBRegressor – 用于回归任务

凭借 XGBoost 的性能优势,您可以利用其 scikit-learn API。

示例

输出

 
Mean Accuracy: 0.933 (0.022)
Predicted Class: 1

使用 LightGBM 进行梯度提升

Light Gradient Boosting Machine (LightGBM) 是 Microsoft 开发的一个高性能框架,用于运行梯度提升任务。它旨在以速度和效率运行,特别是在大型数据集上。与传统梯度提升方法相比,LightGBM 使用基于直方图的算法和叶式树增长,这往往会带来更快的训练和更高的准确性。

对于此示例,我们在二元分类问题中使用 LGBMClassifier。工作流程包括

  • 创建合成数据集
  • 重复分层 K 折交叉验证用于评估模型。
  • 在完整数据集上进行训练
  • 预测新的数据点

安装 LightGBM 库

如果您想使用 pip 安装它,可以运行以下命令

如果您想获取特定平台的更详细安装说明,请参阅官方 LightGBM 安装指南。

验证安装

以下脚本可用于检查 LightGBM 是否正确安装并验证 Python 中安装的版本。

输出

 
4.6.0

输出应为版本 2.3.1 或更新版本。

lightgbm 中提供了与 Scikit-learn 兼容的包装类,可与 GridSearchCV、管道、交叉验证等无缝协作。其中包括

LGBMClassifier – 用于分类任务

LGBMRegressor – 用于回归任务

LightGBM 快速高效的梯度提升实现,用 C++ 编写,但可在 Python 中更新,可以通过这些类在 sci-kit-learn 熟悉的框架中轻松使用。

示例

输出

 
Mean Accuracy: 0.934 (0.021)
[LightGBM] [Info] Number of positive: 501, number of negative: 499
[LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 0.000212 seconds.
You can set `force_col_wise=true` to remove the overhead.
[LightGBM] [Info] Total Bins 2550
[LightGBM] [Info] Number of data points in the train set: 1000, number of used features: 10
[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.501000 -> initscore=0.004000
[LightGBM] [Info] Start training from score 0.004000
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
Predicted Class: 1

使用 CatBoost 进行梯度提升

Yandex 开发了 CatBoost 库,作为高性能梯度提升库。它对分类特征的本地支持可能使其在其他库(如 XGBoost 和 LightGBM)中脱颖而出,因为它不需要任何预处理。CatBoost 非常高效,也非常不同,而且速度非常快,并且通常在最小调整的情况下,其性能优于其他最先进的卡。

在此示例中,我们将使用 CatBoostClassifier 来

  • 生成合成数据集
  • 使用重复分层 K 折交叉验证评估模型性能。
  • 在整个数据集上训练模型
  • 预测新样本的类别标签

安装 CatBoost 库

如果您想使用 pip 安装 CatBoost,请在终端中输入以下命令

为了优化安装,官方 CatBoost 安装指南中提供了针对您平台的进一步定制安装说明。

验证安装

此脚本确认 CatBoost 已安装,以及如何检查版本

输出

 
1.2.8  

它应该是版本 0.21 或更高。

CatBoost 允许您将工具包(如 GridSearchCV、管道和交叉验证)与 Scikit-learn 对象一起使用(CatBoost 还提供与 Scikit-learn 兼容的包装类)。其中包括

CatBoostClassifier – 用于分类任务

CatBoostRegressor – 用于回归任务

这些包装器确保您在 scikit-learn 生态系统中尽可能轻松地充分利用 CatBoost 独特的有效梯度提升算法。

示例

输出

 
Mean Accuracy: 0.925 (0.025)
Predicted Class: 1  

改进的梯度提升技术

梯度提升是一种强大的机器学习方法,但很容易过拟合。为了解决这个问题,我们实施了惩罚学习、树约束、随机抽样和收缩。

1. 惩罚学习

引入正则化方法,即 L1 (Lasso)、L2 (Ridge) 等,以规范树叶的数字权重,否则分配给树叶。这些惩罚使模型更复杂并降低模型复杂性,这使得模型在嘈杂或高维设置中泛化得更好。

2. 树约束

它通过限制最大深度、叶子数量或分割节点所需的最小样本数等参数来限制单个树的复杂性。这降低了过拟合的可能性,但通常需要更多树才能获得良好的准确性。

3. 随机抽样

随机提升,正如它也称之为,涉及在数据的随机子集上训练每棵树。它减轻了树之间的相关性并使模型具有鲁棒性。通常,我们对行或特征进行二次抽样(在树创建之前或在每次拆分时),50% 的抽样对于许多情况非常有效。

4. 收缩

它通过学习率控制每棵树对最终模型的影响。使用较低的学习率提供更好的泛化能力,但训练时间更长,因此需要更多树。但是,为了获得最佳结果,您需要重新调整学习率和估计器数量。

5. XGBoost (eXtreme Gradient Boosting)

梯度提升是梯度提升的一种非常高效和可扩展的变体。它建立在上述所有技术之上,实现了并行处理、内置正则化和修剪树,是基于性能的应用程序的绝佳选择。

结论

在本教程中,您学习了如何使用 Python 有效地应用梯度提升算法进行分类和回归任务。特别是,使用 sci-kit-learn 实现梯度提升:它包括如何对 Scikit-learn 进行梯度提升,包括梯度增加机。

使用高级第三方库,例如 XGBoost、LightGBM 和 CatBoost,每个都提供性能改进和附加功能,例如支持分类变量和更快的训练。

它们为您提供了一种非常强大的方法来为大量机器学习任务构建高精度和灵活的模型。


下一主题什么是 P 值