关于scikit-learn决策树重复用同一准则及Start_flow节点划分的疑问
scikit-learn默认的决策树实现(CART算法)是贪心算法,它的核心逻辑是每一步只选择对当前节点样本子集来说最优的划分方式,而非全局最优,这就是你看到同一划分准则重复出现、且满足条件的样本没在初始阶段被划分的根本原因,具体拆解如下:
初始阶段没选Start_flow ≤0.611的原因
决策树在根节点选择划分规则时,会遍历所有特征的所有可能阈值,计算每个划分能带来的不纯度下降(比如基尼系数、信息增益),最终选下降幅度最大的那个。如果根节点时,其他特征的某个阈值能让整个数据集的不纯度降低更多,算法就会优先选择那个划分,而非Start_flow ≤0.611。哪怕全局有不少样本满足Start_flow ≤0.611,只要这个划分不是当前根节点的最优选择,就不会被优先使用。同一划分准则重复出现的原因
当决策树进入子节点后,处理的是父节点划分后的样本子集,这个子集的特征分布和全局数据集可能完全不同。在这个子节点里,Start_flow ≤0.611可能恰好是能最大程度降低该子集不纯度的划分方式,所以算法会再次选择它。
举个简单例子:假设根节点用特征A划分后,某个子节点里的样本,虽然大部分都满足Start_flow ≤0.611,但这部分样本的标签依然混杂;此时用Start_flow ≤0.611再次划分,能把这个子节点里的样本进一步分成更纯净的两组,那算法就会重复使用这个划分准则。
另外要明确:决策树的划分是针对当前节点的样本子集,而非全局所有样本,所以同一特征的同一阈值在不同节点被选中是完全正常的,和数据集是否有重复属性无关。
内容的提问来源于stack exchange,提问作者mortalhuman123

