DecisionTreeClassifier父节点样本数与子节点不匹配的原因是什么?
决策树父子节点样本数不符的原因
该现象属于scikit-learn决策树的正常运行逻辑,常见原因有以下4类:
- 拆分逻辑优先优化不纯度下降幅度,不要求样本均衡
决策树选择拆分特征和阈值的核心规则是最大化信息增益/基尼系数降低幅度,不会刻意平衡两个子节点的样本量。如果某个特征的拆分规则能最大程度区分类别,哪怕拆分后两个子节点的样本量差异极大,也会被优先采用。你观测到的根节点右子节点仅828个样本,只要该拆分的不纯度下降幅度是所有可选方案中最高的,就属于正常结果。 - 预剪枝参数拦截了无效拆分
你代码中配置的两个预剪枝参数会过滤不符合要求的拆分:min_samples_split=0.03:节点样本量小于总训练样本的3%(你的总训练样本为4267+6669=10936,对应阈值约为328)时,该节点不再拆分min_samples_leaf=0.01:任意拆分的子节点样本量小于总训练样本的1%(对应阈值约为109)时,该拆分方案会被直接舍弃
如果某个节点的拆分不符合上述规则,你将看不到对应的子节点,自然会出现父子节点样本计数对不上的观感,这是预剪枝的正常效果。
- 样本/类别加权导致统计口径不一致
如果你训练时传入了sample_weight参数,或者配置了class_weight参数,那么plot_tree输出的value是加权后的类样本计数,而samples是实际样本条数,两者总和会出现不匹配,属于加权统计的正常逻辑。 - 缺失值自动分配规则
如果训练数据存在缺失值,scikit-learn决策树会自动将所有缺失值样本分配到能最大化不纯度下降的分支,不会均分到两个子节点,也会导致子节点样本量差异极大。
注:如果是两个子节点的
samples相加不等于父节点的samples才属于异常,若仅为样本量大小差异,无需特殊处理。
内容的提问来源于stack exchange,提问作者Wojtek Wencel
相关产品推荐
相关产品推荐

