在sklearn中使用决策树桩进行装袋:如何查看结果?

时间:2017-06-21 18:05:37

标签: scikit-learn ensemble-learning

我使用带有深度为1的决策树的BaggingClassifier尝试将我的数据拆分为分类器可能更好的子集。如何查看Bagging过程选择的数据子集?这是我使用的运行线:

clf = BaggingClassifier(DecisionTreeClassifier(max_depth=1),n_estimators=2000)

1 个答案:

答案 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)]

     

所有人都被选中

因此,正如您所看到的,您可以按比例更改样本和功能,也可以将其中的一部分删除。