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?
我想了解装袋分类器的 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,891 * 0.8 = 712.8应该进入每个Bagging分类器评估,并且由于max_samples是1.0,891 * 0.5 * 1.0 = 712.8应该是每个基本估计量的样本数,还是接近它的东西?
那么,为什么数字在 564 +/- 10 范围内,最大值为 587,而按照计算,它应该接近 712?谢谢
在做了更多研究之后,我想我已经弄明白是怎么回事了。 GridSearchCV 使用训练数据的交叉验证来 确定 最佳参数,但估计器 returns 适合 整个 训练集,不是 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_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,891 * 0.8 = 712.8应该进入每个Bagging分类器评估,并且由于max_samples是1.0,891 * 0.5 * 1.0 = 712.8应该是每个基本估计量的样本数,还是接近它的东西?
那么,为什么数字在 564 +/- 10 范围内,最大值为 587,而按照计算,它应该接近 712?谢谢
在做了更多研究之后,我想我已经弄明白是怎么回事了。 GridSearchCV 使用训练数据的交叉验证来 确定 最佳参数,但估计器 returns 适合 整个 训练集,不是 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) 非常接近,因此看起来没有任何异常发生。