关于“sklearn.ensemble.BaggingClassifier”的问题

数据挖掘 scikit-学习
2022-02-25 16:33:19

我正在尝试使用 BagginClassifier,但未能获得预期的功能。

基本上,BagginClassifier 应该绘制(引导)一个带有替换的新数据集。例如:以下代码应生成与原始数据集大小相同的新引导样本:

import sklearn.datasets as ds
import numpy as np


X, y = ds.load_iris().data, ds.load_iris().target

bag = BaggingClassifier(base_estimator=LogisticRegression(), 
                        n_estimators=100,
                        max_samples=1.0,
                        bootstrap=True,
                        n_jobs=1)
bag.fit(X, y)

print X[bag.estimators_samples_[0]].shape
>> 95

(或任何其他接近 95 的数字)。

天真地,我希望得到与原始样本(150)相同大小的自举样本,但会有一些随机重复的行。但是,我得到的样本量较小,并且具有唯一的行。那很奇怪。

这里有什么问题?

1个回答

在 bagging.py 文件的第 93-100 行中找到了答案。
这是我的理解 - 引导过程分三个步骤进行:

  1. 计算样本数以训练每个估计器(bagging.py 代码中的 max_samples 变量)。在您的情况下,它是1.0x.shape[0]=150

  2. 重复选择所需的最大样本(如上一步中计算的)。
    选择是通过使用函数完成的,它会生成一个系列索引randint数组。x给定的索引可以多次出现在此数组中。

  3. 为了考虑选择多个索引(样本),将权重向量传递到基本估计器拟合函数中。因此,例如,被选中两次的样本的将对拟合算法产生预期的影响。 weight2

据我了解,可以使用estimators_samples_only 来找出包含哪些样本,而不是每个样本做了多少次。