在python中的scikit学习决策树中只使用一个属性一次



我正在使用scikit-learn创建一个决策树,它的工作方式很有魅力。我还想实现一件事:使树只对一个属性进行一次拆分。

这背后的原因是因为我的数据集非常奇怪。我使用的是一个有噪声的数据集,我对噪声也很感兴趣。我的课堂成绩是二元的,比如说[+,-]。我有一堆数字大多在(0,1)范围内的属性。

当scikit learn创建树时,它会多次在属性上进行拆分,以使树";"更好";。我理解通过这种方式叶节点变得更加纯净,但这不是我想要实现的情况。

我所做的是通过计算不同截断中的信息增益并选择最大值来定义每个属性的截断。以这种方式;省略一个";以及";1/3-2/3";交叉验证技术我得到了比原始树更好的结果。

问题是,当我试图将其自动化时,我在下界和上界附近遇到了一个问题,例如在0和1附近,因为大多数元素都在该下界/上界之下,并且我获得了非常高的信息增益,因为其中一个集合是纯的,即使它只包含完整数据的1-2%。

总而言之,我想做点什么,让scikit学会只在一个属性上分裂一次。

如果做不到,你们有什么建议吗?

为了简单地回答您的问题,不,sklearn中没有内置的参数。一年前我也尝试过这样做,所以我打开了一个问题,请求添加此功能。

sklearn通过从训练数据集中随机选取max_features特征并搜索最大程度地减少损失函数的截止点来构建节点。这个完全相同的过程反复运行,直到满足一些停止标准(max_depthmin_samples_leaf等)

因此,无论以前是否使用过,的每个特征都具有相同的被拾取概率。

如果你愿意,你可以编辑分类器的源代码。从本质上讲,您所需要做的就是在选择构建节点后,放弃将损失函数最小化的功能。这样,当获取max_features特征的新样本时,算法将无法再次拾取该特征。

我没有给出一个方法来直接处理多次阻止分类器使用某个功能。(尽管您可以通过定义自己的拆分器并将其布线来完成,但这是一项艰巨的工作。)

我建议您首先要确保平衡您的类,查看class_weight参数以了解详细信息。这对你的问题应该有很大帮助。但如果这不起作用,你仍然可以使用min_weight_fraction_leaf或maxymoo建议的类似参数来强制要求其中没有重量太小的叶子。

最新更新