处理 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 中的连续变量的主要内容,如果未能解决你的问题,请参考以下文章