假设我的数据集中有 2 个(或更多)确定链接的特征(例如:特征 B 表示特征 A 的相关性),有没有办法设计一个决策树将两个特征联系在一起(明显的分裂是如果特征 B 足够大被 A 分割,如果不忽略 A)? 换句话说:我正在寻找一种方法来"帮助"我的决策树在测试功能B之前不测试特征A.另外,不是单独查看每个功能的改进,而是查看"B和后记A"的改进。任何帮助将不胜感激!
您可以使用splitter
参数在DecisionTreeClassifier
中执行此操作。
为此,请创建自己的实现。
并使用:
my_decision_tree = sklearn.tree.DecisionTreeClassifier(splitter=mySplitter)
你有几种可能性,
添加新功能,对您想说的内容进行编码
您可以给出第三个特征,即特征 A 和 B 的线性、极性或逻辑组合,并希望系统能够自行计算出所有特征。为此,sklearn提出了Polinomial Features类和numpy的所有制作模块。
例如,如果特征 B 对特征 A 的相关性量进行编码。假设 B 从 0 到 10,则对相关性量进行编码。您可以创建新功能A_0、A_2、A_i、...A_9,如果B> i和-10000在其他任何地方都是 A 的值。
您还可以创建第三个特征,即 A+B或 A B 或 AB^2。这些问题的问题是,在拟合决策树后,它们更难对结果给出良好的解释。
事先对数据进行分区
您可以使用所需的条件对数据进行分区,然后为每个子数据集拟合不同的树。例如,您可以将数据分为两组,B> 5 和 B <= 5
制作不同的树
您只能对 B 中的特征拟合主树,然后,对于决策树的每个叶子,您现在可以考虑来自 A 和 B 的特征拟合新树。 这在代码方面可能很混乱,因为您需要处理多个分类器并确保每个叶子有足够的样本,以便可以容纳更多的树。
制作自己的分路器功能
如果你真的想掌握树在每一步的决定,你必须按照Aditya的建议去做,在这种情况下,你需要创建自己的拆分器函数。
sklearn 中的默认拆分器在这里实现
您需要修改它以考虑问题的所有变量