决策树是一种监督学习算法,可以用于分类和回归任务。它的基本思想是通过一系列的特征测试来将数据集逐步划分成不同的子集,直到这些子集足够“纯”,即其中包含的数据属于同一类或具有相似的值。
一、基本流程
决策树的基本构建流程:
1. 数据预处理
在开始构建决策树之前,通常需要对原始数据进行清洗和整理,包括处理缺失值、异常值,并将类别型数据转换为数值型数据以便于计算。
2. 特征选择
特征选择是决策树的核心步骤之一,其目的是找到最佳的属性来进行当前节点的分裂。常用的度量标准有信息增益(Information Gain)、信息增益率(Gain Ratio)和基尼系数(Gini Index)。对于ID3算法,使用的是信息增益;C4.5则采用信息增益率;而CART使用基尼系数作为划分准则。
信息增益:基于信息熵的概念,信息熵衡量的是数据集的不确定性,而信息增益则是指通过某个属性进行划分后所带来的信息熵减少量。
信息增益率:是对信息增益的一种改进,它考虑了属性取值数量的影响,避免了倾向于选择取值较多的属性。
基尼系数:反映的是从数据集中随机抽取两个样本,它们类别标志不一致的概率。基尼系数越小,表示数据集的纯度越高。3. 决策树生成
一旦选择了最佳属性,就会用它来分割数据集,形成新的分支。这个过程会递归地应用于每个分支,直到满足某些停止条件,如所有样本都属于同一类,或者没有更多的属性可用于进一步分裂。
4.剪枝处理
为了避免过拟合,通常会对生成的决策树进行剪枝。剪枝分为两种类型:预剪枝(Prepruning)和后剪枝(Postpruning)。预剪枝是在树生长的过程中就设定一些限制条件,例如最大深度、最小样本数等,以防止树过度生长。而后剪枝则是先让树完全生长,然后自底向上移除那些对模型泛化能力贡献不大的分支。
5. 模型评估与应用
最后,经过训练得到的决策树模型需要被评估其性能,这可以通过交叉验证等方式完成。如果模型表现良好,则可以将其应用于新数据上进行预测。
整个过程中,决策树通过递归的方式不断地选择最优特征进行分裂,最终形成一棵结构化的树形模型,该模型不仅可以用来对未知数据进行分类或预测,还因为其直观性和可解释性强而在实际应用中受到欢迎。然而,决策树也存在一些缺点,比如容易产生过拟合,尤其是在面对高维数据时。因此,在实践中,常常需要结合其他技术,如集成方法(Ensemble Methods),来提高模型的鲁棒性和准确性。
决策树(decision tree)是一类常见的机器学习方法。以二分类任务为例,我们希望从给定训练数据集学得一个模型用以对新示例进行分类,这个把样本分类的任务,可看作对“当前样本属于正类吗?”这个问题的“决策”或“判定”过程。顾名思义,决策树是基于树结构来进行决策的,这恰是人类在面临决策问题时一种很自然的处理机制。例如,我们要对“这是好瓜吗?”这样的问题进行决策时,通常会进行一系列的判断或“子决策”:我们先看“它是什么颜色?”,如果是“青绿色”,则我们再看“它的根蒂是什么形态?”,如果是“倦缩”,我们再判断“它敲起来是什么声音?”,最后,我们得出最终决策:这是个好瓜。这个决策过程如图4.1所示。
首先要明白决策树在做什么。正如“西瓜书”中图4.1所示的决策过程,决策树就是不断根据某属性进行划分的过程(每次决策时都是在上次决策结果的基础之上进行),即“if⋯⋯elif⋯⋯ else⋯⋯”的决策过程,最终得出一套有效的判断逻辑,便是学到的模型。但是,划分到什么时候就停止划分呢?这就是图4.2中的3个“return”代表的递归返回,下面解释图4.2中的3个递归返回。
首先,应该明白决策树的基本思想是根据某种原则(即图4.2第8行)每次选择一个属性作为划分依据,然后按属性的取值将数据集中的样本进行划分,例如将所有触感为“硬滑”的西瓜的分到一起,将所 有触感为“软粘”的西瓜分到一起,划分完得到若干子集,接着再对各个子集按照以上流程重新选择某个属性继续递归划分,然而在划分的过程中通常会遇到以下几种特殊情况。
(1)若递归划分过程中某个子集中已经只含有某一类的样本(例如只含好瓜),那么此时划分的目的已经达到了,无需再进行递归划分,此即为递归返回的情形(1),最极端的情况就是初始数据集中的样本全是某一类的样本,那么此时决策树算法到此终止,建议尝试其他算法;
(2)递归划分时每次选择一个属性作为划分依据,并且该属性通常不能重复使用(仅针对离散属性), 原因是划分后产生的各个子集在该属性上的取值相同。例如本次根据触感对西瓜样本进行划分,那么后面 对划分出的子集(及子集的子集⋯⋯)再次进行递归划分时不能再使用“触感”,图4.2第14行的A\{a∗} 表示的便是从候选属性集合A中将当前正在使用的属性a∗排除。由于样本的属性个数是有限的,因此划 分次数通常不超过属性个数。若所有属性均已被用作过划分依据,即A=∅,此时子集中仍含有不同类样 本(例如仍然同时含有好瓜和坏瓜),但是因已无属性可用作划分依据,此时只能少数服从多数,以此子 集中样本数最多的类为标记。由于无法继续划分的直接原因是各个子集中的样本在各个属性上的取值都相 同,所以即使A=∅,但是当子集中的样本在属性集合A上取值都相同时,等价视为A=∅,此即为递归返回的情形(2);
(3)根据某个属性进行划分时,若该属性多个属性值中的某个属性值不包含任何样本(例如未收集到), 例如对当前子集以“纹理”属性来划分,“纹理”共有3种取值:清晰、稍糊、模糊,但发现当前子集中并 无样本“纹理”属性取值为模糊,此时对于取值为清晰的子集和取值为稍糊的子集继续递归,而对于取值 为模糊的分支,因为无样本落入,将其标记为叶结点,其类别标记为训练集D中样本最多的类,即把全体 样本的分布作为当前结点的先验分布。其实就是一种盲猜,既然是盲猜,那么合理的做法就是根据已有数 据用频率近似概率的思想假设出现频率最高的便是概率最大的。注意,此分支必须保留,因为测试时,可 能会有样本落入该分支。此即为递归返回的情形(3)。
二、划分选择
在决策树的构建过程中,划分选择是决定如何分割数据集以形成最优决策树的关键步骤。不同的决策树算法采用了不同的标准来衡量“最优”的划分方式。这里介绍三种划分选择方法,即信息增益、增益率、基尼指数分别对应著名的ID3、C4.5和CART 三种决策树算法。以下是其具体实现:
ID3(Iterative Dichotomiser 3)
ID3算法使用信息增益作为划分属性的选择标准。信息增益是指通过某个特征进行划分后所带来的信息熵减少量。信息熵是一种度量样本集合纯度的指标,定义为:
其中 是样本集合 D 中第 k 类样本所占的比例。
对于一个给定的属性a,其信息增益计算公式为:
这里V是属性a 的取值数,是根据a取值m分割出的数据子集。
C4.5
C4.5算法是对ID3的一种改进,它使用信息增益率(Gain Ratio)作为划分属性的选择标准。信息增益率考虑了每个属性的固有值(Intrinsic Value),即属性取值分布的不均匀性。信息增益率定义为:
其中 表示属性 a的内在价值。
CART(Classification and Regression Trees)
CART算法既可以用于分类也可以用于回归任务。对于分类问题,CART使用基尼系数(Gini Index)作为划分属性的选择标准。基尼系数反映的是从样本集中随机抽取两个样本,它们类别标志不一致的概率。基尼系数越小,表示数据集的纯度越高。基尼系数的计算公式为:
对于一个给定的属性 \( a \),其基于基尼系数的划分质量可以通过如下公式计算:
其中 是子节点
的记录数,而
是父节点的记录数。
实现细节
在实际实现中,无论是ID3、C4.5还是CART,都需要遍历所有可用的属性,并针对每个属性计算相应的划分质量度量(如信息增益、信息增益率或基尼指数)。然后选择具有最高得分的属性作为当前节点的最佳划分属性。这个过程会递归地应用于每个新生成的子节点,直到满足停止条件(例如达到预设的最大深度、最小样本数或纯度要求)为止。
值得注意的是,在处理连续型特征时,通常需要先将连续值离散化,比如通过寻找最佳分裂点来转换成二分问题,这一点在CART算法中尤为常见。
此外,为了防止过拟合,还可以采用剪枝技术,包括预剪枝和后剪枝。预剪枝是在构建树的过程中设定一些限制条件,而后剪枝则是在树完全建成之后再进行简化。
总之,划分选择是构建高效且准确的决策树模型的重要环节,正确选择合适的划分标准能够显著提高模型的性能。
三、剪枝处理
剪枝是决策树算法中用于防止过拟合的重要手段。当构建决策树时,模型可能会因为过于精确地匹配训练数据而变得复杂,导致在新的、未见过的数据上表现不佳——这就是过拟合现象。为了减少这种风险,可以通过剪枝来简化决策树,使其更加泛化。
剪枝的类型
剪枝通常分为两种主要类型:预剪枝(Pre-Pruning)和后剪枝(Post-Pruning)。
预剪枝(Pre-Pruning)
预剪枝是在构建决策树的过程中进行的,它通过提前停止树的增长来避免过拟合。具体来说,在每个节点被分裂之前,都会先评估该分裂是否能带来显著的性能提升。如果不能,则停止分裂,并将当前节点标记为叶节点。常见的预剪枝策略包括:
1.设置最大深度:限制树的最大深度。
2.最小样本分割数:规定一个节点至少需要包含多少个样本才能进行分裂。
3.最小样本叶节点数:规定一个叶节点至少需要包含多少个样本。
4.信息增益阈值:设定一个信息增益的阈值,只有当分裂带来的信息增益超过这个阈值时才允许分裂。
后剪枝(Post-Pruning)
后剪枝则是在决策树完全构建之后进行的,它通过移除那些对模型泛化能力贡献不大的分支来简化树结构。典型的后剪枝方法有:
1.错误率降低剪枝法(Reduced-Error Pruning, REP):使用验证集来评估剪枝前后的性能,若剪枝后的性能更好或相同,则执行剪枝。
2.悲观剪枝法(Pessimistic Error Pruning, PEP):不需要额外的验证集,而是基于训练集本身,加上一定的惩罚因子来决定是否剪枝。
3.代价复杂度剪枝法(Cost-Complexity Pruning, CCP):引入参数α来平衡树的复杂度与误差之间的关系,寻找最优的子树。
剪枝的具体实现
在实际应用中,scikit-learn库提供了`DecisionTreeClassifier`和`DecisionTreeRegressor类,它们支持预剪枝和后剪枝。例如,你可以通过设置`max_depth`、`min_samples_split`、`min_samples_leaf`等参数来进行预剪枝。对于后剪枝,scikit-learn默认采用CCP方法,你可以通过`ccp_alpha`参数控制剪枝的程度。
小结
剪枝处理是提高决策树模型泛化能力的关键步骤。通过合理的剪枝策略,可以在保持模型预测准确性的同时,减少模型的复杂性,从而提高其在新数据上的表现。不同的剪枝方法适用于不同的场景,选择合适的剪枝策略需要根据具体问题和可用资源进行权衡。