跳至主要内容

什么是机器学习中的装袋法?附示例的指南

本教程概述了机器学习中的装袋集成方法,包括其工作原理、在 Python 中的实现、与提升法的比较、优势与最佳实践。
· 10分钟 阅读

使用 AI 探索

集成方法是机器学习中强大的技术,通过组合多个模型来提升整体预测准确率和模型稳定性。其中,自助聚合(Bootstrap Aggregating),更常见的名称是装袋(Bagging),是一种广受欢迎且广泛实现的集成方法。

在本教程中,我们将深入探讨装袋法的工作原理及其优势。我们会将其与另一种集成方法(提升法)进行比较,并在 Python 中给出装袋示例。阅读完毕后,您将对装袋法及其最佳实践有扎实的理解。

理解集成学习

集成建模是一种通过组合多个机器学习模型来提升整体预测性能的技术。其基本思想是:一组弱学习器可以汇聚成一个强学习器。

一个集成模型通常包括两个步骤:

  1. 独立训练多个机器学习模型。
  2. 以投票、平均或加权等方式聚合它们的预测。该集成随后用于做出整体预测。

Image by Author

集成往往能产生更好的结果,因为不同模型可以相互补充、弥补各自的弱点。同时还能降低方差,防止过拟合。

常见的集成方法包括装袋、提升和堆叠。集成学习广泛应用于分类、回归和聚类等机器学习任务,以提升准确性与鲁棒性。

什么是装袋(Bagging)?

装袋(自助聚合)是一种集成方法,它在数据的随机子集上独立训练多个模型,并通过投票或平均来聚合它们的预测。

Image by Author

具体而言,每个模型都在通过放回抽样得到的随机数据子集上训练,这意味着某些数据点可能被选择多次。该随机子集称为自助样本(bootstrap sample)。通过在不同的自助样本上训练模型,装袋可以降低单个模型的方差。它还通过让各个模型接触数据集的不同部分来避免过拟合。

随后,将所有采样模型的预测通过简单平均进行组合,得到整体预测。通过这种方式,聚合后的模型既能吸收各个模型的优点,又能相互抵消它们的误差。

装袋在降低方差和过拟合方面尤为有效,使模型更稳健、更准确,特别适用于个体模型易表现出较高波动性的场景。

装袋 vs. 提升

提升(Boosting)是另一种常被拿来与装袋比较的流行集成方法。二者的主要区别在于基本学习器的训练方式。

在装袋中,模型在数据的不同随机子集上并行、相互独立地训练;而在提升中,模型按顺序训练,每个模型都从前一个模型的错误中学习。此外,装袋通常采用对模型进行简单平均,而提升会根据准确率分配权重。

Image by Author

装袋主要降低方差,而提升主要降低偏差。装袋适用于如决策树这类不稳定模型;提升更适用于如线性回归这类稳定模型。

两种方法各有优劣。装袋更容易并行运行,而提升往往更强大、更准确。在实践中,针对新问题同时尝试二者并比较性能是有帮助的。

装袋的优势

以下是装袋的一些关键优势:

  1. 降低过拟合:可减少模型过拟合的可能性,从而提升模型在未见数据上的准确率。
  2. 降低模型方差:在不同数据子集上训练的多个模型对预测求平均,使方差低于单一模型。
  3. 提升稳定性:训练数据集的变化对装袋模型影响更小,使整体模型更稳定。
  4. 应对高波动性:对如决策树等方差较高的算法尤其有效。
  5. 可并行计算:集成中的每个模型都可独立训练,便于并行处理并高效利用算力资源。
  6. 易于理解与实现:装袋背后的概念直观简单,无需对学习算法做复杂改动即可实现。
  7. 对噪声更健壮:平均过程有助于降低最终预测中的噪声。
  8. 处理类别不平衡:在数据集不平衡的情形下,装袋能够帮助提升模型表现。

Python 中的装袋:简要教程

在本 Python 教程中,我们将在电信客户流失数据集上训练一个决策树分类模型,并使用装袋集成方法来提升其表现。我们将使用 DataLab 获取数据集并运行代码。代码也可在此DataLab 工作簿中获取,您可复制后直接在浏览器中运行,无需安装任何软件。

数据集

关于电信客户流失的数据集来自一家伊朗电信公司。数据集中每一行对应某位客户一年的活动信息,包括呼叫失败次数、订阅时长以及指示该客户是否已离网的流失标签。

首先,我们将加载数据集并查看前 5 行。

import pandas as pd

customer = pd.read_csv("data/customer_churn.csv")
customer.head()

Viewing the dataset

接下来,我们将创建自变量(X)和因变量(y)。然后将数据集划分为训练集和测试集。

X = customer.drop("Churn", axis=1)
y = customer.Churn

# Split into train and test 
from sklearn.model_selection import train_test_split, cross_val_score
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

训练机器学习模型

我们将创建一个简单的机器学习流水线,并在其上拟合训练数据。该流水线会在将输入送入决策树分类器前对数据进行标准化。

from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('classifier', DecisionTreeClassifier(random_state=42))
])

pipeline.fit(X_train, y_train)

Pipeline diagram 1

参加 Python 课程基于树的模型的机器学习,学习如何使用 scikit-learn 将树模型和集成用于回归和分类。

模型评估

我们将对决策树模型进行评估,以便与集成模型进行比较。

我们将在测试数据表上进行预测并生成分类报告。

from sklearn.metrics import classification_report

# Make prediction on the testing data
y_pred = pipeline.predict(X_test)

# Classification Report
print(classification_report(y_pred, y_test))

我们的模型在多数类“0”上达到了 96% 精确率和 97% 召回率,但在少数类“1”上的表现较差。

Model performance results

为更深入地理解模型表现,我们将进行交叉验证并计算相应得分。

# Evaluate the classifier using cross-validation
cv_scores = cross_val_score(pipeline, X, y, cv=5)

print(f"Cross-validation scores: {cv_scores}")
print(f"Mean CV accuracy: {np.mean(cv_scores):.2f}")

得分波动较大,最高达 95%,最低为 92%。

Cross-validation scores: [0.95079365 0.94126984 0.93492063 0.94285714 0.92222222]
Mean CV accuracy: 0.94

装袋分类器

现在,我们用流水线(标准化器 + 决策树分类器)作为基学习器创建一个装袋分类器,并在训练集上进行训练。

我们可以通过增大 n_estimators 来提升模型性能,但 50 个基学习器足以作为基线结果。

from sklearn.ensemble import BaggingClassifier

# Create a bagging classifier with the decision tree pipeline
bagging_classifier = BaggingClassifier(base_estimator=pipeline, n_estimators=50, random_state=42)

# Train the bagging classifier on the training data
bagging_classifier.fit(X_train, y_train)

BaggingClassifier pipeline diagram

评估集成模型

接下来评估集成模型的结果,并与单一模型的表现进行比较。为此,我们将在测试数据集上生成分类报告。

# Make prediction on the testing data
y_pred = bagging_classifier.predict(X_test)

# Classification Report
print(classification_report(y_pred, y_test))

如您所见,模型表现有所提升。少数类的精确率和召回率分别从 79% 提高到 80%、从 77% 提高到 82%。这是一项显著改进。

Model performance results

现在来计算交叉验证得分。

# Evaluate the classifier using cross-validation
cv_scores = cross_val_score(bagging_classifier, X, y, cv=5)

print(f"Cross-validation scores: {cv_scores}")
print(f"Mean CV accuracy: {np.mean(cv_scores):.2f}")

交叉验证得分的方差较低,范围在 94% 到 96% 之间。模型的整体准确率也从 94% 提升到了 95%。

Cross-validation scores: [0.95396825 0.95714286 0.94126984 0.96190476 0.95714286]
Mean CV accuracy: 0.95

装袋技术是机器学习应用中提升模型准确率与稳定性的有用工具。

在 Python 的集成方法课程中学习装袋、提升和堆叠等技术,构建更先进、更高效的机器学习模型。

最佳实践与技巧

在机器学习中使用装袋时,遵循以下最佳实践与技巧可最大化其效果:

  1. 当您拥有高方差模型(如决策树)时使用装袋以提升稳定性。
  2. 将装袋与交叉验证结合,更可靠地评估模型。
  3. 使用随机森林(装袋的决策树)作为强大且开箱即用的装袋技术。
  4. 设置更高的 n_estimators(如 100–200),以充分获益于装袋。
  5. 装袋易于并行化,可使用 n_jobs 在多核/多机上加速训练。
  6. 由于装袋依赖自助采样,务必确保每个模型都在足够多样化的数据子集上训练。
  7. 在聚合前,使用 GridSearchCV 优化每个模型的性能。单个模型表现良好通常会转化为更优的集成表现。

阅读MLOps(机器学习工程)最佳实践,学习如何可靠、可扩展地部署机器学习系统。

结语

在本教程中,我们探讨了装袋法这一强大的机器学习集成技术。装袋通过聚合多个模型来提升整体预测性能。我们将其与提升法进行了比较,并了解了其相较单一模型的优势。

最后,我们在一个电信流失数据集上用 Python 实现了装袋分类器。由决策树组成的装袋集成在准确率和少数类表现上均优于单棵决策树。此外,我们还学习了多条实用技巧,以最大化装袋在机器学习中的效果。

如果您希望成为专业的机器学习工程师,可先报名参加Python 机器学习科学家职业路径。您将学习如何使用 Python 训练有监督、无监督以及深度学习模型。

Abid Ali Awan

作者

Abid Ali Awan

作为一名持证的数据科学家,我热衷于利用前沿技术打造创新的机器学习应用。凭借在语音识别、数据分析与报告、MLOps、对话式人工智能以及自然语言处理方面的扎实背景,我不断打磨构建智能系统的能力,力求带来切实影响。除技术专长外,我也擅长沟通,能够将复杂概念提炼为清晰、简明的表述。因此,我成为数据科学领域备受关注的博主,与不断壮大的数据专业人士社区分享洞见与实践经验。目前,我专注于内容创作与编辑,借助大语言模型打造有力且吸引人的内容,帮助企业与个人更好地发挥数据价值。

主题