目录

机器学习 - Bootstrap 聚合


在此页面上,W3schools.com 与纽约数据科学院,为我们的学生提供数字培训内容。


套袋

诸如决策树之类的方法可能容易在训练集上过度拟合,从而导致对新数据的错误预测。

Bootstrap Aggregation(bagging)是一种尝试解决分类或回归问题的过度拟合的集成方法。 Bagging 旨在提高机器学习算法的准确性和性能。它通过替换原始数据集的随机子集来实现此目的,并将分类器(用于分类)或回归器(用于回归)适合每个子集。然后通过多数投票进行分类或对回归进行平均来聚合每个子集的预测,从而提高预测准确性。


评估基分类器

要了解 bagging 如何提高模型性能,我们必须首先评估基分类器在数据集上的执行情况。如果您不知道什么是决策树,请在继续之前查看有关决策树的课程,因为装袋是该概念的延续。

我们将寻求识别 Sklearn 葡萄酒数据集中发现的不同类别的葡萄酒。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier

接下来我们需要加载数据并将其存储到 X(输入特征)和 y(目标)中。参数 as_frame 设置为 True,这样我们在加载数据时就不会丢失特征名称。 (sklearn0.23之前的版本必须跳过as_frame参数,因为它不受支持)

data = datasets.load_wine(as_frame = True)

X = data.data
y = data.target

为了在未见过的数据上正确评估我们的模型,我们需要将 X 和 y 分成训练集和测试集。有关拆分数据的信息,请参阅训练/测试课程。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22)

准备好数据后,我们现在可以实例化基分类器并将其适合训练数据。

dtree = DecisionTreeClassifier(random_state = 22)
dtree.fit(X_train,y_train)

结果:

DecisionTreeClassifier(random_state=22)

我们现在可以预测未见过的测试集的葡萄酒类别并评估模型性能。

y_pred = dtree.predict(X_test)

print("Train data accuracy:",accuracy_score(y_true = y_train, y_pred = dtree.predict(X_train)))
print("Test data accuracy:",accuracy_score(y_true = y_test, y_pred = y_pred))

结果:

Train data accuracy: 1.0
Test data accuracy: 0.8222222222222222

示例

导入必要的数据并评估基分类器的性能。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier

data = datasets.load_wine(as_frame = True)

X = data.data
y = data.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22)

dtree = DecisionTreeClassifier(random_state = 22)
dtree.fit(X_train,y_train)

y_pred = dtree.predict(X_test)

print("Train data accuracy:",accuracy_score(y_true = y_train, y_pred = dtree.predict(X_train)))
print("Test data accuracy:",accuracy_score(y_true = y_test, y_pred = y_pred))
运行示例 »

基分类器在数据集上表现相当好,在当前参数的测试数据集上达到 82% 的准确率(如果您没有random_state参数集)。

现在我们有了测试数据集的基准准确性,我们可以看到装袋分类器如何执行单个决策树分类器。


广告


创建装袋分类器

对于装袋,我们需要设置参数 n_estimators,这是我们的模型将聚合在一起的基分类器的数量。

对于这个样本数据集,估计器的数量相对较少,通常情况下会探索更大的范围。超参数调整通常是通过网格搜索,但现在我们将使用一组选定的值来表示估计器的数量。

我们首先导入必要的模型。

from sklearn.ensemble import BaggingClassifier

现在让我们创建一系列值来表示我们想要在每个集合中使用的估计器的数量。

estimator_range = [2,4,6,8,10,12,14,16]

为了了解装袋分类器如何使用不同的 n_estimators 值执行,我们需要一种方法来迭代值的范围并存储每个集合的结果。为此,我们将创建一个 for 循环,将模型和分数存储在单独的列表中以供以后可视化。

注意:基分类器的默认参数BaggingClassifier是个DicisionTreeClassifier因此我们在实例化bagging模型时不需要设置它。

models = []
scores = []

for n_estimators in estimator_range:

    # Create bagging classifier
    clf = BaggingClassifier(n_estimators = n_estimators, random_state = 22)

    # Fit the model
    clf.fit(X_train, y_train)

    # Append the model and score to their respective list
    models.append(clf)
    scores.append(accuracy_score(y_true = y_test, y_pred = clf.predict(X_test)))

通过存储模型和分数,我们现在可以可视化模型性能的改进。

import matplotlib.pyplot as plt

# Generate the plot of scores against number of estimators
plt.figure(figsize=(9,6))
plt.plot(estimator_range, scores)

# Adjust labels and font (to make visable)
plt.xlabel("n_estimators", fontsize = 18)
plt.ylabel("score", fontsize = 18)
plt.tick_params(labelsize = 16)

# Visualize plot
plt.show()

示例

导入必要的数据并评估BaggingClassifier表现。

import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.ensemble import BaggingClassifier

data = datasets.load_wine(as_frame = True)

X = data.data
y = data.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22)

estimator_range = [2,4,6,8,10,12,14,16]

models = []
scores = []

for n_estimators in estimator_range:

    # Create bagging classifier
    clf = BaggingClassifier(n_estimators = n_estimators, random_state = 22)

    # Fit the model
    clf.fit(X_train, y_train)

    # Append the model and score to their respective list
    models.append(clf)
    scores.append(accuracy_score(y_true = y_test, y_pred = clf.predict(X_test)))

# Generate the plot of scores against number of estimators
plt.figure(figsize=(9,6))
plt.plot(estimator_range, scores)

# Adjust labels and font (to make visable)
plt.xlabel("n_estimators", fontsize = 18)
plt.ylabel("score", fontsize = 18)
plt.tick_params(labelsize = 16)

# Visualize plot
plt.show()

结果

运行示例 »

结果解释

通过迭代估计器数量的不同值,我们可以看到模型性能从 82.2% 提高到 95.5%。在 14 个估计器之后,如果您设置不同的估计器,准确性会再次下降random_state您看到的值会有所不同。这就是为什么最好的做法是使用交叉验证以确保结果稳定。

在这种情况下,我们发现识别葡萄酒类型的准确度提高了 13.3%。


另一种评估形式

由于引导选择观察的随机子集来创建分类器,因此在选择过程中会遗漏一些观察。然后,这些#"out-of-bag"观察结果可用于评估模型,类似于测试集。请记住,袋外估计可能会高估二元分类问题中的错误,并且只能用作其他指标的补充。

我们在上一个练习中看到 12 个估计器产生了最高的准确度,因此我们将使用它来创建我们的模型。这次设置参数oob_score设置为 true 以使用袋外分数评估模型。

示例

使用袋外指标创建模型。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingClassifier

data = datasets.load_wine(as_frame = True)

X = data.data
y = data.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22)

oob_model = BaggingClassifier(n_estimators = 12, oob_score = True,random_state = 22)

oob_model.fit(X_train, y_train)

print(oob_model.oob_score_)
运行示例 »

由于OOB和测试集使用的样本不同,且数据集比较小,所以准确率存在差异。它们很少会完全相同,同样应该使用 OOB 来快速估计误差,但不是唯一的评估指标。


从装袋分类器生成决策树

正如在决策树当然,可以将模型创建的决策树绘制成图表。还可以看到进入聚合分类器的各个决策树。这有助于我们更直观地了解 bagging 模型如何得出预测。

注意:这仅适用于较小的数据集,其中树相对较浅且较窄,因此易于可视化。

我们需要导入plot_tree函数来自sklearn.tree。可以通过更改您想要可视化的估计器来绘制不同的树。

示例

从装袋分类器生成决策树

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import plot_tree

X = data.data
y = data.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22)

clf = BaggingClassifier(n_estimators = 12, oob_score = True,random_state = 22)

clf.fit(X_train, y_train)

plt.figure(figsize=(30, 20))

plot_tree(clf.estimators_[0], feature_names = X.columns)

结果

运行示例 »

在这里,我们只能看到用于对最终预测进行投票的第一个决策树。同样,通过更改分类器的索引,您可以看到已聚合的每棵树。