我使用带有深度为1的决策树的BaggingClassifier尝试将我的数据拆分为分类器可能更好的子集。如何查看Bagging过程选择的数据子集?这是我使用的运行线:
clf = BaggingClassifier(DecisionTreeClassifier(max_depth=1),n_estimators=2000)
答案 0 :(得分:0)
您可能已经知道, BaggingClassifier 可以通过随机化功能和/或随机化列车数据中的样本来随机化子集。
想象一下,我有36个样本和2个特征存储在 X 变量中,36个目标二进制样本存储在 y 变量中。我尝试通过 BaggingClassifier 处理分类问题。
clf = BaggingClassifier(base_estimator=DecisionTreeClassifier(max_depth=1),
n_etimators=1) # for simplicity
clf.fit(X, y)
它将返回以下内容:
BaggingClassifier(base_estimator=DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=1,
max_features=None, max_leaf_nodes=None,
min_impurity_split=1e-07, min_samples_leaf=1,
min_samples_split=2, min_weight_fraction_leaf=0.0,
presort=False, random_state=None, splitter='best'),
bootstrap=True, bootstrap_features=False, max_features=1.0,
max_samples=1.0, n_estimators=1, n_jobs=1, oob_score=False,
random_state=None, verbose=0, warm_start=False)
正如 sklearn 文档所述,数据子集的关键参数是 max_samples 和 max_features ,随机化的参数是 bootstrap 和 bootstrap_features 。
前两个参数(如果定义为浮点数范围为0到1)是传输到base_estimator的样本和 X 的特征的比例(在您的情况下是DecisitonTreeClassifier)。
后两个参数用作上述前两个参数获得的样本和特征的随机化因子(或丢弃因子)。默认情况下, bootstrap 为True,这意味着它会在 max_samples 中随机选择预定义比例的样本。我最后提供了一个例子让你了解这个过程。
因此,默认情况下,您的分类器会从 X 中获取每个样本和每个要素,并仅删除样本(因为您没有更改分类器中的参数)。在安装了分类器之后,您可以通过键入clf.estimators_features_
来检查选择的功能。对我来说,它打印了由1个DecisionTreeClassifier安装的 X 数据的两个特征,而不是2000,因为我在 n_estimators 中已经说明了以简单起见:
[array([0,1])]
如您所见,它选择了每个功能,因为max_features为1.而bootstrap_features为False
好的,那么传递给DecisionTreeClassifier的样本是什么?您可以通过键入clf.estimators_samples_
来验证是否会返回这样的内容:
[array([True,True,False,True,True,True,False,True,True, 真,真,假,真,真,真,假,真,真, 真,假,假,假,真,真,假,假,假, False,True,True,True,False,True,False,True,True],dtype = bool)]
您可以看到,它是BaggingClassifier中DecisionTreeClassifer拟合期间来自 X 的传输样本的布尔掩码。如果 n_estimators 等于2000,只要 bootstrap 设置为True,就会有2000个带随机样本的数组。
最后,如何真正看到选择了哪些样品?换句话说,如何转换该布尔掩码?代码如下:
mask = np.array(clf.estimators_samples_).ravel()
X[mask, :]
就是这样!请注意,如果您有2000个估算器,并且想要检查选择哪些样本,例如1000th DecisionTreeClassifier,那么您可以输入类似的内容:
mask = np.array(clf.estimators_samples_[999].ravel()
X[mask, :]
代码X[mask, :]
仅选择那些满足 mask 变量中的True条件的样本(NumPy数组的行)。如果你apriori有Pandas DataFrame,你可以将X[mask, :]
改为X.ix[mask, :]
。我希望你现在很清楚!谢谢!
电子。
P.S。
显示 bootstrap 如何工作的示例
clf = BaggingClassifier(base_estimator=DecisionTreeClassifier(max_depth=1), n_estimators=1, bootstrap=True)
clf.fit(np.array(x.values),np.array(Y.values))
clf.estimators_samples_
[array([True,True,False,False,True,True,True,False,True, 真,真,真,假,假,假,真,真,假, 假,假,真,真,真,假,假,真,真, False,True,True,False,False,False,False,True,True],dtype = bool)]
其中一些人被淘汰了
clf = BaggingClassifier(base_estimator=DecisionTreeClassifier(max_depth=1), n_estimators=1, bootstrap=False)
clf.fit(np.array(x.values),np.array(Y.values))
clf.estimators_samples_
[array([True,True,True,True,True,True,True,True,True, 真,真,真,真,真,真,真,真,真, 真,真,真,真,真,真,真,真,真, 真,真,真,真,真,真,真,真,真],dtype = bool)]
所有人都被选中
因此,正如您所看到的,您可以按比例更改样本和功能,也可以将其中的一部分删除。