学习Python中的装袋算法

250 阅读11分钟

Python中的装袋算法

在构建机器学习模型时,我们可以使用单一算法,也可以结合多种算法。使用多种算法被称为集合学习。

集合学习比单一算法有更好的预测结果。最常见的集合学习技术是bagging和boosting。

在Bagging中,多个同质化的算法被独立训练,并在之后进行组合以确定模型的平均值。

Boosting是一种集合技术,我们依次训练多个同质的算法。这些单独的算法创造了一个具有最佳结果的最终模型。一个算法的性能会受到之前建立的算法的性能影响。

本教程将使用这两种方法来构建机器学习模型。

在第一种方法中,我们将使用被称为决策树分类器的单一算法来建立和寻找模型的准确性。

在第二种方法中,我们将使用Bagging分类器和随机森林分类器来建立同一个模型并找出其准确性。

前提条件

要跟上本教程的进度,读者应该知道以下内容。

  • [Python编程。]
  • [机器学习工作流程。]
  • [使用Scikit-learn的Python机器学习。]
  • 使用[Pandas]进行数据分析[。]

注意:在本教程中,我们将使用[谷歌Colab笔记本。]

装袋与提升

如上所述,在Bagging中,多个同质算法被独立地并行训练,而在Boosting中,多个同质算法被连续训练。下面的图片显示了Bagging和Boosting之间的区别。

Bagging Vs Boosting

在本教程中,我们将只关注实现Bagging算法。

打包是如何工作的

Bagging技术也被称为Bootstrap Aggregation,可以用来解决分类和回归问题。此外,Bagging算法还能提高模型的准确度得分。

这些算法可以防止模型过拟合并减少方差。

过度拟合是指模型在使用训练数据集时表现良好,但在使用测试数据集时表现不佳,这意味着模型将无法做出准确的预测。

方差是用来描述模型内部的变化。例如,当你使用不同的分片来训练模型时,就会出现变异。

分袋算法被用来产生一个低方差的模型。

装袋包括三个过程:引导、平行训练和聚合。

引导(Bootstrapping

引导是一种数据抽样技术,用于从训练数据集中创建样本。

Bootstrapping对训练数据集的行和列进行随机采样,并进行替换。我们可以使用替换抽样法多次选择相同的数据样本。

引导过程会从原始数据集中产生多个子集。多个子集具有相等的图元,可以作为训练数据集使用。

下面的图片显示了自举过程。

Bootstrapping Process

图片来源。数据爱好者

平行训练

引导的过程产生了多个子集。在每个子集上,都有一个机器学习算法被拟合。

拟合算法使用多个子集进行训练,以产生各种模型。产生的各种模型被称为弱学习者或基础模型。

在这个阶段,我们将有多个基础模型进行并行训练。

下面的图片显示了并行训练的过程。

Parallel Training

图片来源。数据爱好者

聚合

聚合是Bagging的最后一个阶段。由基础模型做出的多个预测被结合起来,产生一个单一的最终模型。最终模型将具有低方差和高准确率。

最终模型的产生取决于所使用的投票技术。我们有两种常用的投票技术,硬投票和软投票。

硬投票

硬投票也被称为多数投票。硬投票主要是在处理分类问题时使用。

在分类问题中,每个基础模型所做的预测被看作是一种投票。这是因为基础模型做出的最常见的预测是正确的预测。

下面的图片显示了硬投票的过程。

Hard Voting

软投票

软投票主要是在处理回归问题时使用。在软投票中,我们找到基础模型所做预测的平均值。平均值被作为预测结果。

下面的图片显示了硬投票和软投票的并列情况。

Hard vs Soft voting

下面的图片进一步显示了Bagging的过程。同样,该图片清楚地描述了每个过程是如何完成的。

How Bagging works

使用Bagging算法的好处

  • 装袋算法可以提高模型的准确度。
  • 装袋算法可以处理过度拟合。
  • 捆绑算法可以减少偏差和方差误差。
  • 捆绑可以很容易地实现,并产生更稳健的模型。

现在我们已经讨论了这个理论,让我们用Python实现Bagging算法。

使用的数据集

我们将使用糖尿病数据集来预测一个人是否患有糖尿病。收集到的数据集有Ageblood pressure ,这有助于模型判断一个人是否患有糖尿病。

加载数据集

我们将使用Pandas库来加载我们通过上述链接下载的数据集。

让我们导入Pandas。

import pandas as pd

要加载数据集,请使用这段代码。

df = pd.read_csv("/content/diabetes.csv")

现在让我们用下面的代码看看我们的数据集是如何结构的。

df.head()

数据集的结构如下图所示。

Diabetes dataset

我们的数据集有一些列,如上图中的Ageblood pressure

这些特征将被用作模型的输入。最后一列标注为Outcome ,将是一个输出列。Outcome 列被标记为0(非糖尿病)或1(糖尿病)。

让我们检查一下这个数据集的缺失值。

检查缺失值

缺失值使数据集不完整。有缺失值的数据集会导致不一致的结果和糟糕的模型性能。

要检查缺失值,请使用这段代码。

df.isnull().sum()

输出显示如下。

Missing Values

从上面的图片来看,没有缺失值。因此,我们的数据集是完整的,可以使用。

添加x和y变量

我们需要指定x和y变量。x变量将保存所有的输入列,而y变量将保存输出列。

在我们的例子中,我们的输出列是Output 列。其余的列将被用作模型输入。

我们使用以下代码添加x和y变量。

X = df.drop("Outcome",axis="columns")
y = df.Outcome

下一步是缩放我们的数据集。

数据集的缩放

数据集缩放是对数据集进行转换,以适应特定的范围。例如,你可以将一个数据集缩放到0-1、-1-1或0-100的范围内。

数据集缩放可以确保在模型训练过程中不遗漏任何数据点的值。

我们对数据集的缩放有不同的尺度。在我们的案例中,我们使用StandardScaler 来缩放我们的数据集。

让我们导入StandardScaler

from sklearn.preprocessing import StandardScaler

为了缩放我们的输入列(x变量),使用这段代码。

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

如果该代码被执行,它将缩放整个数据集。要看一些缩放后的数据集,使用这段代码。

X_scaled[:3]

输出将显示缩放后的数据集的第四行。

Scaled dataset

缩放数据集后,我们可以分割缩放后的数据集。

分割数据集

我们将把缩放后的数据集分成训练和测试。为了分割数据集,我们将使用train_test_split 方法。

from sklearn.model_selection import train_test_split

要进行分割,请使用这段代码。

X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, stratify=y, random_state=10)

上面的代码在拆分数据集时将使用默认的拆分比例。80%的数据将是训练集,20%是测试集。

要检查训练集中的数据样本数,请使用这段代码。

X_train.shape

输出如下所示。

(576, 8)

我们还可以使用以下代码查看测试数据集的大小。

X_test.shape

输出显示如下。

(192, 8)

使用决策树分类器建立模型

决策树分类器是用于分类的Scikit-learn算法。要导入这种算法,请使用这段代码。

from sklearn.tree import DecisionTreeClassifier

我们将使用k-fold交叉验证来建立我们的决策树分类器。此外,K-fold交叉验证允许我们将我们的数据集分割成各种子集或部分。

然后使用每个子集训练模型,并在每次迭代后得到准确率分数。最后,计算出平均精度分数。K指的是我们分割数据集的子集/部分的数量。

让我们导入有助于进行K-折交叉验证的方法。

from sklearn.model_selection import cross_val_score

要使用cross_val_score 方法,请运行此代码。

scores = cross_val_score(DecisionTreeClassifier(), X, y, cv=5)
scores

在上面的代码中,我们将把数据集分成五折。它在每次迭代后都会产生模型的准确度分数,如下面的输出所示。

array([0.69480519, 0.68181818, 0.71428571, 0.77777778, 0.73856209])

获得平均准确度得分

使用下面的代码可以得到平均分。

scores.mean()

输出显示如下。

0.7214497920380273

使用交叉验证得分,我们得到的准确度得分是0.7214497920380273 。我们可以使用袋化算法建立相同的模型来比较准确率得分。

实现袋化算法

让我们首先使用BaggingClassifier 来建立模型。

使用袋化分类器建立模型

BaggingClassifier 分类器将遵循所有的分袋步骤并建立一个优化的模型。BaggingClassifier 将在随机抽样的子集上拟合弱/基础学习者。

接下来,它将使用投票技术来产生一个聚合的最终模型。最后,我们将使用DecisionTreeClassifier 算法作为我们的弱/基学习器。

要导入BaggingClassifier,请使用此代码。

from sklearn.ensemble import BaggingClassifier

要使用这个模型,请使用这段代码。

bag_model = BaggingClassifier(
base_estimator=DecisionTreeClassifier(), 
n_estimators=100, 
max_samples=0.8, 
bootstrap=True,
oob_score=True,
random_state=0
)

在上面的代码片段中,我们使用了以下参数:base_estimator- 这代表作为基础/弱学习者的算法。我们将使用DecisionTreeClassifier 算法作为我们的弱/基础学习者。

n_estimators- 这代表所使用的弱学习器的数量。我们将使用100棵决策树来建立袋化模型。

max_samples- 从训练集取样的最大数据数。我们使用80%的训练数据集进行再抽样。

bootstrap- 允许对训练数据集进行无替换的重新取样。

oob_score- 用于在训练后计算模型的准确性分数。

random_state- 允许我们重现相同的数据集样本。此外,它确保在产生多个子集时使用相同的比例。

下一步是将初始化的模型拟合到我们的训练集中。

拟合模型

拟合将使模型能够从训练数据集中学习,以了解数据集并获得有用的洞察力。

要拟合模型,请使用这段代码。

bag_model.fit(X_train, y_train)

最后,让我们计算一下模型的准确性得分。

准确率得分

为了得到准确率分数,运行这段代码。

bag_model.oob_score_

准确率得分显示如下。

0.7534722222222222

该模型提高了准确率得分。例如,准确率得分从0.7214497920380273 提高到0.7534722222222222

我们还可以使用测试数据集来检查准确率得分,以确定我们的模型是否过度拟合。要获得准确率得分,请使用这段代码。

bag_model.score(X_test, y_test)

输出如下所示。

0.7760416666666666

准确率得分表明我们的模型没有过拟合。当我们在使用测试数据集时得到较低的准确率时,就会发生过度拟合。

现在让我们使用随机森林分类器。

使用随机森林分类器建立模型

随机森林分类器有几个决策树在各种子集上训练。这种算法是一个典型的袋化算法的例子。

随机森林在下使用bagging,对数据集进行随机的替换采样。随机森林不仅对数据行进行采样,还对列进行采样。它还遵循袋化步骤,产生一个聚合的最终模型。

让我们导入随机森林分类器。

from sklearn.ensemble import RandomForestClassifier

要使用RandomForestClassifier 算法,请运行此代码。

scores = cross_val_score(RandomForestClassifier(n_estimators=50), X, y, cv=5)

我们还使用了K-fold交叉验证法来训练模型。要获得平均准确度得分,请使用此代码片段。

scores.mean()

输出如下所示。

0.7618029029793736

准确度得分很高,表明袋化算法提高了模型的准确度得分。它还可以防止模型的过度拟合。

总结

本教程指导读者如何在Python中实现bagging算法。我们讨论了Bagging和boosting之间的区别。我们还经历了Bagging的所有步骤,清楚地说明了每个步骤是如何工作的。

此外,我们使用单一算法和袋化算法建立了一个糖尿病分类模型。袋化算法产生的模型具有更高的准确度,表明袋化算法最适合于建立更好的模型。