假设我在数据集中有 3 个分类属性和 2 个连续属性。如何使用这 5 个变量构建决策树?
编辑:
对于分类变量,很容易说我们将它们分开{yes/no}
并计算总基尼增益,但我的怀疑往往主要与连续属性有关。假设我有一个连续属性的值,例如{1,2,3,4,5}
. 我的分裂点选择是什么?是否会在每个数据点上检查它们,{<1,>=1......& so on till}
或者拆分点是否类似于列的平均值?
假设我在数据集中有 3 个分类属性和 2 个连续属性。如何使用这 5 个变量构建决策树?
编辑:
对于分类变量,很容易说我们将它们分开{yes/no}
并计算总基尼增益,但我的怀疑往往主要与连续属性有关。假设我有一个连续属性的值,例如{1,2,3,4,5}
. 我的分裂点选择是什么?是否会在每个数据点上检查它们,{<1,>=1......& so on till}
或者拆分点是否类似于列的平均值?
决策树可以同时处理分类变量和数值变量作为特征,这样做没有任何问题。
决策树中的每个拆分都基于一个特征。如果特征是分类的,则使用属于特定类的元素完成拆分。如果特征是连续的,则使用高于阈值的元素进行分割。在每次拆分时,决策树都会采用当时最好的变量。这将根据分裂分支的杂质测量来完成。并且用于进行拆分的变量是分类的还是连续的这一事实是无关紧要的(事实上,决策树通过创建具有阈值的二元区域来对连续变量进行分类)。
尽管在理论上,决策树处理分类变量是很自然的,但大多数实现都没有这样做,只接受连续变量:
目前不能。然而,RF 往往对在实践中被滥用编码为整数特征的分类特征非常鲁棒。
这是 lightgbm 如何处理类别的示例:
import pandas as pd
from sklearn.datasets import load_iris
from lightgbm import LGBMRegressor
from category_encoders import OrdinalEncoder
X = load_iris()['data']
y = load_iris()['target']
X = OrdinalEncoder(cols=[3]).fit_transform(X)
dt = LGBMRegressor()
dt.fit(X, y, categorical_feature=[3])
我不确定大多数答案是否考虑到拆分分类变量非常复杂的事实。考虑一个具有“q”个可能值的预测器/特征,那么有~可能的拆分,对于每个拆分,我们可以计算一个基尼指数或任何其他形式的指标。从概念上讲更容易说“每个分割都是基于度量(连续的 MSE,例如分类的基尼指数)贪婪地执行”,但重要的是要补充一个事实,即给定特征的可能分割数量在数量上是指数的的类别。正确的观察是 CART 处理它时没有指数复杂度,但它使用的算法非常重要,应该承认任务的难度。
这取决于。一些算法,例如 ID3 能够处理分类变量。其他的,像 CART 算法都没有。
有两种基本方法可以将分类数据编码为连续的。
One-hot 编码非常简单,并且在大多数软件包中都实现了。缺点是如果你有很多类别,它会遇到问题(因为编码维度的数量等于类别的数量)。
均值编码(有时也称为目标编码)由具有目标均值的编码类别组成(例如,在回归中,如果您有 0 类和 1 类,则 0 类通过响应的平均值进行编码,例如 0 等)。这个网站上有一些提供更多细节的答案。如果您想了解有关它的工作原理以及如何实现它的更多信息,我也鼓励您观看此视频(有几种方法可以进行编码,每种方法都有其优点和缺点)。
在 Python 中,您可以自己编码(我链接的系列视频中显示了一些方法),或者您可以尝试scikit-learn contrib 中的类别编码器。
使用决策树时,决策树的作用是,对于分类属性,它使用基尼指数、信息增益等。但对于连续变量,它使用高斯分布或多项分布等概率分布来区分。第二种方法是将其转换为分类属性并制定如下规则:if a<100 和 if a<100。