处理 sklearn.tree.DecisionTreeClassifier 中的连续变量

Posted

技术标签:

【中文标题】处理 sklearn.tree.DecisionTreeClassifier 中的连续变量【英文标题】:Handle continuous variables in sklearn.tree.DecisionTreeClassifier 【发布时间】:2020-04-01 12:56:22 【问题描述】:

我很好奇sklearn 是如何处理sklearn.tree.DecisionTreeClassifier 中的连续变量的?我尝试使用一些连续变量而不使用 DecisionTreeClassifier 进行预处理,但它得到了可以接受的准确度。

下面是一种将连续变量转化为分类变量的方法,但不能得到同样的准确度。

def preprocess(data, min_d, max_d, bin_size=3):

    norm_data = np.clip((data - min_d) / (max_d - min_d), 0, 1)
    categorical_data = np.floor(bin_size*norm_data).astype(int)
    return categorical_data


X = preprocess(X, X.min(), X.max(), 3)

【问题讨论】:

【参考方案1】:

决策树在最能区分两个类的位置拆分连续值。例如,假设一棵决策树将男性和女性的身高划分为 165 厘米,因为大多数人都可以根据这个边界正确分类。一个算法会发现,大多数女性都在 165cm 以下,而大多数男性则超过 165cm。

决策树会找到所有属性的最佳分裂点,通常会多次重用属性。请参见此处,根据列中的连续值对 Iris 数据集进行分类的决策树。

例如,您可以看到X[3] < 0.8,其中某些列中低于 0.8 的连续值被归类为 0 类。您可以看到这种拆分适用于每个类中的实例数:[50, 0, 0]

您的任意分割点的准确性可能较低,因为这样做会丢失信息。关于身高的例子,想象一下如果你的身高数据不是连续的,但是你有超过 150 厘米和低于 150 厘米的人。你会丢失很多信息。决策树也会像这样拆分连续数据,但至少它会 1)找到最佳拆分点,以及 2)它将能够多次拆分相同的属性。所以它会比你的任意拆分表现更好。

【讨论】:

谢谢!但我这里还有一个问题:决策树如何找到the place?如果值是连续的,则有无数个可能的地方最能区分这两个类。 是的,有。这就是优化算法发挥作用的时候,例如CART algorithm。

以上是关于处理 sklearn.tree.DecisionTreeClassifier 中的连续变量的主要内容,如果未能解决你的问题,请参考以下文章

自然语言处理_一般处理流程

怎么在批处理中加回车命令?

throws关键字_异常处理的第一种方式(交给别人处理)和try_catch_异常处理的第二种方式(自己处理)

PHP异常处理

协处理器,王明学learn

批处理学习笔记第一课:什么是批处理