我正在使用带有深度 1 决策树的 BaggingClassifier 来尝试将我的数据拆分为分类器可能更好的子集。如何查看 Bagging 过程选择的数据子集?这是我正在使用的运行线:
clf = BaggingClassifier(DecisionTreeClassifier(max_depth=1),n_estimators=2000)
我正在使用带有深度 1 决策树的 BaggingClassifier 来尝试将我的数据拆分为分类器可能更好的子集。如何查看 Bagging 过程选择的数据子集?这是我正在使用的运行线:
clf = BaggingClassifier(DecisionTreeClassifier(max_depth=1),n_estimators=2000)
您可能已经知道,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. 的浮点数,是X传输到 base_estimator 的样本和特征的比例(在您的情况下是 DecisitonTreeClassifier)。
后两个参数用作上述前两个参数获得的样本和特征的随机化因子(或丢弃因子)。默认情况下,bootstrap为 True,这意味着它从max_samples中的预定义比例中随机选择样本。我在最后提供了一个例子让你理解这个过程。
因此,默认情况下,您的分类器从您的X中获取每个样本和每个特征,并且仅丢弃样本(因为您没有更改分类器中的参数)。安装好分类器后,您可以通过键入来检查选择了哪些特征clf.estimators_features_
。对我来说,它打印了由 1 个决策树分类器拟合的X数据中的两个特征,而不是像我在n_estimators中为简单起见所说的那样到 2000 年:
[数组([0, 1])]
如您所见,它选择了每个特征,因为 max_features 为 1。而 bootstrap_features 为 False
好的,那么传输到该 DecisionTreeClassifier 的样本是什么?clf.estimators_samples_
您可以通过键入将返回如下内容来验证这一点:
[数组([真,真,假,真,真,真,假,真,真,真,真,假,真,真,真,假,真,真,真,假,假,假,真,真,假,假,假,假,真,真,真,假,真,假,真,真],dtype=bool)]
你看,它是在 BaggingClassifier 中的 DecisionTreeClassifer 拟合期间来自X的传输样本的布尔掩码。如果您的n_estimators等于 2000,那么只要引导程序设置为 True,您就会有 2000 个带有随机样本的数组。
最后,如何实际查看选择了哪些样本?换句话说,如何转换该布尔掩码?代码如下:
mask = np.array(clf.estimators_samples_).ravel()
X[mask, :]
这就对了!请注意,如果您有 2000 个估计器,并且您想检查选择了哪些样本来拟合,例如,第 1000 个决策树分类器,您可以输入如下内容:
mask = np.array(clf.estimators_samples_[999].ravel()
X[mask, :]
代码X[mask, :]
仅选择那些满足掩码变量中的 True 条件的样本(NumPy 数组的行)。如果您先验有 Pandas DataFrame,则更X[mask, :]
改为X.ix[mask, :]
. 我希望你现在清楚了!谢谢!
E.
附言
显示引导程序如何工作的示例
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_
[数组([真,真,假,假,真,真,真,假,真,真,真,真,假,假,假,真,真,假,假,假,真,真,真,假,假,真,真,假,真,真,假,假,假,假,真,真],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_
[数组([真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真,真],dtype=bool)]
他们都被选中了
因此,如您所见,您可以按比例改变样本和特征,也可以删除其中的一些。