一、基本概念
CART(Classification and Regression Trees)决策树是一种典型的分类和回归的树形结构模型,由于其简单、易于理解和实现,在实际应用中得到广泛应用。 CART决策树包含两种类型:分类树和回归树,其中分类树用于分类问题,回归树用于回归问题。
CART决策树构建过程的核心是在每个节点上寻找最佳的分裂特征和分裂点。节点的分裂是指根据某个特征和对应的分裂点将节点划分为左右两个子节点。划分的目的是尽可能地将同一类别的样本放到同一子节点中,同时尽可能地将不同类别的样本分到不同的子节点中。
在CART决策树的构建过程中,我们需要采用一些指标来衡量节点的“纯度”,这些指标主要有基尼系数和信息增益两种。其中基尼系数是CART决策树使用的默认指标,它的计算很简单,公式如下:
Gini(p) = 1 - ∑(i=1~k) p(i)^2
其中k表示类别的个数,p(i)表示样本属于第i类的概率。当一个节点中的样本全部属于同一个类别时,基尼系数最小为0;当一个节点中的样本属于不同的类别时,基尼系数最大为1。
二、分类树的构建
对于分类问题,CART决策树的构建过程如下:
1、节点的初始状态:
将所有样本看作一个整体,将整个训练数据集看作一个节点,在该节点上找到最佳的分裂特征和分裂点来确定左右子节点,将数据集分为两部分,第一部分样本属于某一个类别,第二部分样本属于其他类别。
2、节点的分裂:
根据某个特征和对应的分裂点将节点划分为左右两个子节点,这个分裂点的选择在回归树和分类树中不同。在分类树中,为了让同一类别的样本尽量分到同一节点中,我们需要找到最优的分裂特征和分裂点。 在这个过程中,我们需要设计一个评价指标来衡量节点的纯度。常用的指标有基尼系数和信息熵。
3、递归构建树:
对于当前节点的左右两个子节点,重复执行步骤2和步骤3,直到达到预设的停止条件,例如节点中的样本数量达到了预设的最小值,或者节点的深度达到了预设的最大值。当无法再分裂时,节点变为叶节点。
三、回归树的构建
对于回归问题,CART决策树的构建过程如下:
1、节点的初始状态:
将所有样本看作一个整体,将整个训练数据集看作一个节点,在该节点上找到最佳的分裂特征和分裂点来确定左右子节点,将数据集分为两部分,第一部分样本拟合出的回归函数与真实值的误差尽可能小,第二部分样本拟合出的回归函数与真实值的误差尽可能小。
2、节点的分裂:
根据某个特征和对应的分裂点将节点划分为左右两个子节点,这个分裂点的选择需要最小化误差平方和,即:
min∑(y-y_hat)^2
其中y表示真实值,y_hat表示预测值。回归树采用的是一种自顶向下、贪心的策略,即每次选择最优的特征进行分裂,因此得到的树是不稳定的,容易受到噪声的影响。
3、递归构建树:
对于当前节点的左右两个子节点,重复执行步骤2和步骤3,直到达到预设的停止条件,例如节点中的样本数量达到了预设的最小值,或者节点的深度达到了预设的最大值。当无法再分裂时,节点变为叶节点。
四、代码示例
以下示例代码展示了如何使用CART决策树进行分类:
import numpy as np from sklearn.tree import DecisionTreeClassifier # 构造示例数据集 X = np.array([ [5.1, 3.5, 1.4, 0.2], [4.9, 3.0, 1.4, 0.2], [6.2, 3.4, 5.4, 2.3], [5.9, 3.0, 5.1, 1.8]]) y = np.array([0, 0, 1, 1]) # 构建分类树模型 clf = DecisionTreeClassifier() clf.fit(X, y) # 预测新样本类别 x_test = np.array([5.8, 2.8, 5.1, 2.4]) y_pred = clf.predict([x_test]) print("预测类别为:", y_pred) # 输出预测结果