在python中的scikit-learn决策树中只​​使用一个属性

时间:2015-11-26 11:30:19

标签: python scikit-learn decision-tree

我正在使用scikit-learn python模块创建一个决策树,它的工作就像一个魅力。我想再做一件事。使树仅在属性上拆分一次。

这背后的原因是因为我非常奇怪的数据集。我使用嘈杂的数据集,我对噪音也很感兴趣。我的课程结果是二进制的,比如[+, - ]。我有一堆属性,数字大多在(0,1)范围内。

当scikit-learn创建树时,它会多次分割属性,以使树更好"。我知道通过这种方式叶子节点变得更纯净,但事实并非如此。

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

问题在于,当我尝试自动化这个时,我遇到了一个问题,包括下限和下限,例如:大约0和1,因为大多数元素将在/上面,并且我得到非常高的信息增益,因为其中一个集合是纯的,即使它只包含1-2%的完整数据。

总而言之,我想做些什么来制作scikit-学习只拆分属性一次。

如果无法做到,你们有什么建议如何以一种好的方式产生这些截止值?

非常感谢!

2 个答案:

答案 0 :(得分:1)

简要回答您的问题,不,sklearn 中没有内置参数来执行此操作。一年前我也尝试这样做,所以我打开了一个 issue 请求添加此功能。

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

因此,每个特征总是被选中的概率相同,无论之前是否使用过。

如果您愿意,您可以使用分类器的 edit the source code。本质上,您需要做的就是在选择构建节点后删除最小化损失函数的特征。这样一来,算法在获取 max_features 特征的新样本时将无法再次选择该特征。

答案 1 :(得分:0)

我没有提供直接处理阻止分类器多次使用功能的方法。 (尽管您可以通过定义自己的splitter并将其连接起来来完成此工作,但这是很多工作。)

我建议您首先确保平衡类,并查看class_weight参数以了解详细信息。那应该对您的问题有很大帮助。但是,如果那行不通,您仍然可以使用min_weight_fraction_leafmaxymoo建议的类似参数来强制选择没有太小权重的叶子。