【问题标题】:Use one attribute only once in scikit-learn decision tree in python在 python 的 scikit-learn 决策树中只​​使用一个属性一次
【发布时间】:2016-02-29 11:37:01
【问题描述】:

我正在使用 scikit-learn 创建一个决策树,它的工作原理就像一个魅力。我还想实现一件事:让树只在一个属性上拆分一次。

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

当 scikit-learn 创建树时,它会根据属性多次拆分,以使树“更好”。我知道这样叶子节点会变得更加纯净,但我想实现的不是这种情况。

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

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

总而言之,我想做一些事情来让 scikit-learn 只在一个属性上拆分一次。

如果无法完成,你们有什么建议可以很好地生成这些截止值吗?

【问题讨论】:

  • 我想知道你是否可以通过调整min_samples_leafmin_samples_splitmin_weight_fraction_leaf来实现你想要的。
  • 真的有可能像OP描述的那样吗?
  • 我已经找到了一种使用 sckit 的方法,我编写了自己的方法
  • 您真的希望每个属性只使用一次吗?如果在左右子树中都使用相同的特征 x_i 会有什么问题?如果你想避免过度拟合,你可以对非常小的树而不是一棵树使用梯度提升。
  • 您是否尝试过仅使用逻辑回归?根据定义,它只会使用每个属性一次。

标签: python scikit-learn decision-tree


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    我没有给出直接处理阻止分类器多次使用某个功能的方法。 (虽然您可以通过定义自己的 splitter 并将其连接到其中来做到这一点,但工作量很大。)

    我建议您首先确保平衡您的课程,查看class_weight 参数了解详细信息。这应该对您的问题有很大帮助。但是,如果这不起作用,您仍然可以使用min_weight_fraction_leafmaxymoo 建议的类似参数来强制不存在重量过小的叶子。

    【讨论】:

      猜你喜欢
      • 2017-02-23
      • 2020-04-05
      • 1970-01-01
      • 2015-03-05
      • 2017-03-26
      • 2020-08-29
      • 2016-12-31
      • 2017-01-21
      相关资源
      最近更新 更多