【发布时间】:2019-06-05 15:47:19
【问题描述】:
与 AdaBoostClassifier 一起使用的决策树分类器存根对应的 value 属性的值与预期不符,我无法确定这些值所指示的内容。我想了解有助于分析存根估计器的行为以及存根对 AdaBoostClassifier 的贡献的值。与 Stackoverflow 类似的问题与我的数据无关。
版本信息
- 蟒蛇:3.6.5
- sklearn 版本:0.20.2
DecisionTreeClassifier 存根配置为:
number_estimators = 301
bdt= AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),
algorithm="SAMME.R", n_estimators=number_estimators)
AdaBoostClassifier 是一个二元分类器,输出状态为 Class A 和 Class B(编码为 +1 和 -1)。训练集由 23 个特征组成,分类器执行良好(预测准确率、精度、召回率均约为 79%)。我正在分析错过的预测,以深入了解分类错误。
有 782 个训练样本。 301 个存根估计器通过以下方式从 AdaBoostClassifier 获得:
tree_stubs = bdt.estimators_
对应于第 6 个估计器(基于 0 的列表)的示例存根:
bdt.estimators_[5]
DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=1,
max_features=None, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, presort=False,
random_state=421257592, splitter='best')
此存根的值:
stub_5.tree_.value
array([[[0.5 , 0.5 ]],
[[0.29308331, 0.1861591 ]],
[[0.20691669, 0.3138409 ]]])
对于那些熟悉 graphviz 的人来说,树桩看起来像:
根节点正确显示样本数(782)。 value 属性表示 [0.5, 0.5]。我期望 value 属性是每个类中的样本数而不是百分比。但在根节点中,0.5 值确实反映了我拥有的平衡训练集,两个类的表示相同。
现在解决问题。此存根中的拆分功能根据 delta_win_pct 值小于或等于阈值 -.001 来拆分样本。我的数据集确实有 delta_win_pct 小于此阈值的 385 个样本记录和 delta_win_pct 大于阈值的 397 个样本。所以样本数据在树桩的左右叶节点中是正确的。
但价值数据似乎不正确。在左子节点中,值报告为 value=[0.293, 0.186],在右子节点中,value=[0.207, 0.314]。请注意,这是 sklearn.tree._tee.Tree 类报告的数据,并不表示 graphviz 有任何问题。
这些价值量代表什么?
考虑到左叶节点,我的数据集实际上有 264 个 delta_win_pct
同样,对于右子节点,值数据提供为 [0.207, 0.314],但对于 delta_win_pct 超过阈值的 397 个样本,预期值应为 [.330, .670]。
我注意到提供的值数据中的数字(0.293、0.186、0.207、0.314)加起来是 1.0。但是每个节点的值加起来不等于 1.0。我尝试使用提供的值作为所有样本的百分比,例如0.293 * 782 = 229 与任何东西都没有关系。
有人对所提供的价值数据的含义有任何见解吗?我对这些值的解释和期望是否不正确?
最后,我注意到数据中值的相对大小正确地与每个节点中的多数样本相关。在左侧子节点中,0.293 大于 0.186,表明左侧节点具有大多数 A 类样本。而在右叶节点中,当 delta_win_pct > 阈值时,0.207
无论如何,我想了解这些价值。
【问题讨论】:
标签: python scikit-learn decision-tree adaboost