Bagging 分类器的“max_samples”关键字如何影响每个基本估计器使用的样本数量?

Posted

技术标签:

【中文标题】Bagging 分类器的“max_samples”关键字如何影响每个基本估计器使用的样本数量?【英文标题】:How does 'max_samples' keyword for a Bagging classifier effect the number of samples being used for each of the base estimators? 【发布时间】:2016-12-10 20:29:46 【问题描述】:

我想了解 Bagging 分类器的 max_samples 值如何影响用于每个基本估计器的样本数量。

这是 GridSearch 的输出:

GridSearchCV(cv=5, error_score='raise',
       estimator=BaggingClassifier(base_estimator=DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
            max_features=None, max_leaf_nodes=None, min_samples_leaf=1,
            min_samples_split=2, min_weight_fraction_leaf=0.0,
            presort=False, random_state=1, spl... n_estimators=100, n_jobs=-1, oob_score=False,
         random_state=1, verbose=2, warm_start=False),
       fit_params=, iid=True, n_jobs=-1,
       param_grid='max_features': [0.6, 0.8, 1.0], 'max_samples': [0.6, 0.8, 1.0],
       pre_dispatch='2*n_jobs', refit=True, scoring=None, verbose=2)

我在这里找出最好的参数是什么:

print gs5.best_score_, gs5.best_params_
0.828282828283 'max_features': 0.6, 'max_samples': 1.0

现在我正在挑选最好的网格搜索估计器,并尝试查看特定 Bagging 分类器在其 100 个基本决策树估计器集中使用的样本数量。

val=[]
for i in np.arange(100):
    x = np.bincount(gs5.best_estimator_.estimators_samples_[i])[1]
    val.append(x)
print np.max(val)
print np.mean(val), np.std(val)

587
563.92 10.3399032877

现在,训练集的大小为 891。由于 CV 为 5,因此每个 Bagging 分类器评估应使用 891 * 0.8 = 712.8,并且由于 max_samples 为 1.0,因此 891 * 0.5 * 1.0 = 712.8 应该是样本数每个基本估计器,还是接近它的东西?

那么,为什么数字在 564 +/- 10 范围内,最大值为 587,根据计算,它应该接近 712?谢谢。

【问题讨论】:

【参考方案1】:

在做了更多研究之后,我想我已经弄清楚发生了什么。 GridSearchCV 对训练数据使用交叉验证来确定最佳参数,但它返回的估计器适合整个训练集,而不是 CV-折叠。这是有道理的,因为更多的训练数据通常会更好。

因此,您从 GridSearchCV 返回的 BaggingClassifier 适合 891 个数据样本的完整数据集。确实,在 max_sample=1 的情况下,每个基本估计器将从训练集中随机抽取 891 个样本。但是,默认情况下,使用替换抽取样本,因此由于重复,唯一样本的数量将少于样本总数。如果你想不替换地绘制,请将 BaggingClassifier 的 bootstrap 关键字设置为 false。

现在,在不替换的情况下绘制时,我们期望不同样本的数量与数据集的大小到底有多接近?

基于 this question,当从一组 n 个样本中抽取 n 个带有替换的样本时,预期的不同样本数为 n * (1-(n-1)/n) ^ n。 当我们将 891 插入其中时,我们得到

>>> 891 * (1.- (890./891)**891)
563.4034437025824

预期样本数 (563.4) 非常接近您观察到的平均值 (563.8),因此似乎没有发生任何异常情况。

【讨论】:

我有点困惑的原因是因为我希望 max_features 和 max_samples 关键字能够类似地工作。当我使用 estimators_features_ 查看用于训练 100 个基本决策树估计器的所有特征时,我看到所有 100 棵树每个都使用了 9 个特征的子集,并且由于我的数据集有 16 个特征,并且 0.6 * 16 = 9.6,它将 9 个特征作为最大值是有意义的。但是没有少于 9 个特征的树,都有 9 个。现在对于样本,类似地,要么都应该使用 712 个样本的随机子集,要么我希望这个数字更接近 712。 问题在于,默认情况下,样本是用替换绘制的。 好的。我做了一些更多的研究,结果发现 GridSearchCV 正在返回一个在 891 个点的完整数据集上训练的估计器。此外,在进行替换采样时,您会得到很多重复项。有关详细信息,请参阅我重新编写的答案。 感谢您的解释!它完美地回答了我的问题。另外,我尝试了 bootstrap=False,GS 给了我 0.6 作为最佳估计器的 max_samples 值。在重新运行 bincount sn-p 时,我得到的值是 534 +/- 0,表示在 100 个基本估计器中选取的样本数量,这完全符合在 ' 的情况下选取恒定数量的样本的期望无需更换”。 (891 * 0.6 = 534.6)

以上是关于Bagging 分类器的“max_samples”关键字如何影响每个基本估计器使用的样本数量?的主要内容,如果未能解决你的问题,请参考以下文章

分类器组合方法Bootstrap, Boosting, Bagging, 随机森林

Bagging和Boosting的区别

ML中Boosting和Bagging的比較

ML中Boosting和Bagging的比较

分类器组合方法Bootstrap, Boosting, Bagging, 随机森林

随机森林