【问题标题】:How to handle categorical independent variables in sklearn decision trees如何处理 sklearn 决策树中的分类自变量
【发布时间】:2020-05-19 23:26:46
【问题描述】:

我使用 onehotencoder 将所有分类自变量从字符串转换为数字(二进制​​ 1 和 0),但是当我运行决策树时,算法将二进制分类变量视为连续变量。

例如如果性别是我的自变量之一,则将男性转换为 1,将女性转换为 0。当我在决策树中使用它时,节点在 0.5 处分裂,这是没有意义的。

如何将此数字连续转换为数字分类?

【问题讨论】:

  • one hot encode 使用sklearn.preprocessing.OneHotEncoder 或pandas.get_dummies 的所有分类变量
  • 做到了,但它仍然被认为是连续的而不是分类的,因为节点在 0.5 处分裂。如何解释这个 0.5?在 R 中,节点分裂为 1 或 0。我们是否也可以在 sklearn 中获得类似的输出

标签: python scikit-learn decision-tree


【解决方案1】:

如何将此数字连续转换为数字分类?

如果结果相同,你需要吗?

例如如果性别是我的自变量之一,则将男性转换为 1,将女性转换为 0。当我在决策树中使用它时,节点在 0.5 处分裂,这是没有意义的。

也许我错了,但这种分裂对我来说是有意义的。

假设我们有一个带有分类规则的决策树。 除法将是二进制除法,这意味着“0”在左边,“1”在右边(在这种情况下)。

现在,我们如何优化这个划分规则?我们可以使用一个操作来替换这两个检查,而不是搜索值是“0”还是“1”。左边是“0”,其他一切都是正确的。现在,我们可以将相同的检查从类别替换为浮点数,

在代码中,它会很简单:

案例一:

if value == "0":
    tree.left()
elif value == "1":
    tree.right()
else:
    pass # if you work with binary, this will never happen, so its useless

案例 2:

 if value == "0":
     tree.left()
 else:
     tree.right()

案例3:

if value < 0.5:
    tree.left()
else:
    tree.right()

【讨论】:

    【解决方案2】:

    基本上有两种方法可以解决这个问题。你可以使用

    1. 整数编码(如果分类变量本质上是序数,如大小等)
    2. One-hot 编码(如果分类变量本质上是序数 比如性别等)

    您似乎为这个问题错误地实现了单热编码。您使用的是简单的整数编码(或二进制编码,更具体地说)。正确实现的 one-hot 编码可确保转换后的值没有偏差,并且执行机器学习算法的结果不会因为变量的绝对值而偏向于有利于变量。你可以阅读更多关于它的信息here。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-02
      • 2015-07-30
      • 2018-09-15
      • 2019-03-04
      • 2020-10-17
      • 2017-01-27
      • 2021-08-20
      • 2016-09-11
      相关资源
      最近更新 更多