我很好奇 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_dataX = preprocess(X, X.min(), X.max(), 3)
回答:
决策树会在最能区分两个类别的位置分割连续值。例如,决策树可能会在165厘米处分割男性和女性的身高,因为大多数人在这个界限内会被正确分类。算法会发现大多数女性身高低于165厘米,大多数男性身高高于165厘米。
决策树会为所有属性找到最佳分割点,并且通常会多次重复使用属性。请看这里,一个决策树根据Iris数据集的列中的连续值对其进行分类。
例如,你可以看到 X[3] < 0.8
,其中某列中低于0.8的连续值被分类为类0。你可以看到这个分割点在每个类别中应用到的实例数量:[50, 0, 0]
。
你之所以在使用任意分割点时准确率较低,可能是因为这样做会丢失信息。关于身高的例子,想象一下,如果你的身高数据不是连续的,而是你有高于和低于150厘米的人。你会丢失很多信息。决策树也会像这样分割连续数据,但至少它会1)找到最佳分割点,2)能够对同一个属性进行多次分割。因此,它的表现会比你的任意分割更好。