我正在使用scikit-learn创建一个决策树,它的工作方式非常出色。我还想实现一件事:使树在一个属性上只拆分一次。
这背后的原因是因为我非常奇怪的数据集。我使用一个嘈杂的数据集,而且我对噪音也很感兴趣。我的类结果是二进制的,比如说+,-。我有一堆属性,它们的数字大多在(0,1)的范围内。
当scikit-learn创建树时,它会多次拆分属性,以使树“更好”。我知道这样叶子节点会变得更纯粹,但这不是我想要实现的情况。
我做的事情是通过计算不同截止点的信息增益,并选择最大值来为每个属性定义截止点。通过这种方式,使用"leave-one-out“和"1/3-2/3”交叉验证技术,我得到了比原始树更好的结果。
问题是,当我试图自动化这一点时,我遇到了关于下限和上界的问题,例如在0和1左右,因为大多数元素都在/上,我获得了非常高的信息增益,因为其中一个集合是纯的,即使它只包含完整数据的1-2%。
总而言之,我想做一些事情来让scikit-学习只在一个属性上拆分一次。
如果不能做到这一点,你们有什么建议如何以一种好的方式生成这些截止日期吗?
发布于 2021-04-24 12:48:54
为了简短地回答你的问题,没有,在sklearn中没有内置的参数来做到这一点。一年前我也尝试过这样做,所以我打开了一个issue,请求添加此功能。
sklearn通过从训练数据集中随机选择max_features特征并搜索最大限度减少损失函数的截止值来构建节点。这个完全相同的进程会反复运行,直到满足某些停止条件(max_depth、min_samples_leaf等)。
因此,每个特征always都具有相同的被挑选的概率,无论它以前是否被使用过。
如果你准备好了,你可以对分类器进行edit the source code。本质上,您需要做的就是在选择构建节点后删除最小化损失函数的功能。这样,算法在获取新的max_features特征样本时将无法再次选取该特征。
https://stackoverflow.com/questions/33937532
复制相似问题