目录
一、决策树
1、决策树介绍
决策树是一种基于树状图形模型的分类与回归方法。它通过对输入数据的特征进行逐步划分,从而构建一个树形的决策过程。决策树的每个内部节点代表一个特征属性上的判断,每个分支代表一个判断结果,每个叶节点代表一个类别标签或回归值。决策树的优点包括易于理解和解释、能够处理多类别问题,处理缺失数据。但它也有一些限制,比如对输入数据的噪音敏感,容易产生过拟合。
2、决策树的构建
决策树的构建过程通常包括以下步骤:
-
特征选择:从数据集中选择一个最佳的特征作为当前节点的划分标准。特征选择的目标是使得划分后的子集尽可能地纯净。
-
决策节点生成:根据选择的特征将当前节点划分为多个子节点。每个子节点代表了不同的特征取值。
-
递归构建:对每个子节点,重复1,2,直到满足终止条件,比如子节点中的样本数小于某个阈值或者子节点的纯度达到一定的要求。
-
剪枝:决策树容易过拟合训练集,为了避免过拟合,可以通过剪枝的方式减少决策树的复杂度。剪枝可以是预剪枝或者后剪枝,预剪枝是在构建过程中进行剪枝,而后剪枝是构建完整的决策树后再进行剪枝。
-
预测:预测的过程是根据输入样本的特征值沿着决策树的路径进行遍历,直到达到叶子节点,然后根据叶子节点的类别标签进行分类或回归预测。
3、信息增益(ID3算法)
信息增益是一种常用的划分选择方法,用于决策树算法中的特征选择。ID3算法是一种基于信息增益的决策树算法。信息增益的概念来源于信息论,衡量了一个特征对于分类的贡献程度。在决策树构建过程中,我们希望选择那些能够最大化信息增益的特征作为划分标准。信息增益的计算基于熵的概念。熵是衡量不确定性的度量,熵越大表示不确定性越高。
对于一个特征A,我们可以根据它的取值将数据集划分为多个子集,每个子集对应于特征A的一个取值。划分后的数据集的熵可以通过计算每个子集的熵的加权平均来得到。这个加权平均就是特征A的条件熵,表示了特征A给定的条件下的平均不确定性。条件熵的计算公式如下:
H(D|A) = Σ(|D(v)|/|D| * H(D(v)))
其中,|D(v)|表示特征A取值为v的子集的大小,|D|表示数据集D的大小,H(D(v))表示特征A取值为v的子集的熵。信息增益就是数据集的熵减去特征A的条件熵,即:
Gain(A) = H(D) - H(D|A)
信息增益越大,表示使用该特征划分数据集能够获得更多的信息,因此选择信息增益最大的特征作为划分标准。
4、基尼系数(CART算法)
基尼系数是CART算法中用于划分选择的一种方法。基尼系数衡量了从一个数据集中随机选择两个样本,它们属于不同类别的概率。基尼系数越小,表示数据集的纯度越高,样本的类别分布越集中。在决策树的划分过程中,基尼系数被用来衡量选择某个特征进行划分时的纯度提升程度。
在决策树算法中,通过计算每个特征的基尼系数,选择基尼系数最小的特征作为划分标准。选取基尼系数最小的特征意味着通过该特征划分数据集可以获得最大的纯度提升。基尼系数和信息增益在决策树算法中都可以作为划分选择的依据,不同的方法适用于不同的问题和数据集。
5、增益率(C4.5算法)
增益率(Gain Ratio)是C4.5算法中一种用于特征选择的指标,用于解决信息增益对于具有较多取值的特征的偏向问题。在决策树算法中,我们希望选择能够最大化分类能力的特征作为划分标准。信息增益是衡量一个特征对于分类的贡献程度的指标,但是它倾向于选择具有较多取值的特征,因为这些特征能够提供更多的信息。然而,在某些情况下,具有较多取值的特征可能只是反映了数据的噪音或冗余信息。
为了解决这个问题,C4.5算法引入了增益率作为特征选择的指标。增益率通过将信息增益除以特征的固有信息(Intrinsic Information)来进行归一化,从而消除了特征取值数目对于特征选择的影响。特征的固有信息是指特征本身所携带的信息量,它反映了特征的取值数目对于分类的影响。特征的固有信息越大,表示该特征的取值数目越多,反映的信息越分散,特征本身提供的信息量就越少。因此,增益率会惩罚具有较多取值的特征,使得在特征选择中更加平衡。
计算增益率的公式如下:
GainRatio(D, A) = Gain(D, A) / IV(A)
Gain(D, A)表示特征A对于数据集D的信息增益,IV(A)表示特征A的固有信息。IV(A)的计算方法为:
IV(A) = -Σ (|Dv| / |D|) * log2(|Dv| / |D|)
Dv表示在特征A上取值为v的样本子集,|Dv|表示Dv的样本数量,|D|表示整个数据集D的样本数量。
6、剪枝处理
决策树叶剪枝的基本策略有"预剪枝"(prepruning)和"后剪枝"(postpruning)。预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。
1.预剪枝
预剪枝是在决策树构建过程中,在每个节点划分前进行判断,如果划分后的性能没有明显的提升或者达到了预定的阈值,就停止划分并将当前节点标记为叶子节点。预剪枝的优点是简单快速,但可能会导致欠拟合,因为有时候过早停止划分可能会丢失重要的信息。
举例说明:
上图是西瓜数据集,只不过分为了两部分,上半部分是训练集,下半部分是验证集。
首先,按照脐部对训练集进行划分,分成了三部分:凹陷,稍凹,平坦。对应的训练集样本分别为:{1,2,3,14},{6,7,15,17},{10,16}
观察下图,发现凹陷的训练集样本都划分为了好瓜,但是14号很明显是坏瓜,为什么也划分为好瓜呢?这是因为,只要好瓜的比例大于等于50%,就把该样本集都归类为好瓜。那么凹陷对应的验证集为:{4,5,13}。这几个样本也被分为好瓜,但是13号很明显被分错了。
所以验证集精度为:5/7*100% = 71.4%。
继续对凹陷这一个分支进行划分。基于信息增益准则将挑选出划分属性为:色泽。
如下图所示,按照色泽,将训练集样本{1,2,3,14}划分为了三部分:青绿、乌黑、浅白对应的训练集样本进一步被细分为:{1},{2,3},{14}对应的验证集进一步被细分为:{4,13},{},{5}
其中青绿对应的训练集为好瓜,那么验证集也被分成了好瓜,但是很明显13号被分错了。乌黑对应的训练集为好瓜,那么验证集也被分为了好瓜,但此时验证集为空,没影响。浅白对应的训练集为坏瓜,那么验证集也被分为了坏瓜,但是很明显5号被分错了。用色泽去划分,导致验证集中的13和5号都被分错。所以,综合脐部划分和色泽划分,目前有三个验证集中的样本被分错,分别是:13、5、9。所以,验证集的精度为:4/7*100% = 57.1%。
用色泽进一步划分,竟然导致精度下降。所以,直接把色泽划分去掉,这就是预剪枝。
2.后剪枝
后剪枝是在决策树构建完成后,通过自底向上的方式对树进行修剪。具体做法是对每个非叶子节点进行评估,计算剪枝后的树在验证集上的性能,如果剪枝后的性能没有明显下降,则将该节点剪枝成叶子节点。后剪枝的优点是可以更好地保留决策树的结构,但可能会导致过拟合,因为剪枝时只考虑了当前节点,而没有考虑整体的结构和特征。
举例说明:
验证集中,只有4、11、12三个样本划分正确。所以验证集的精度为:3/7*100%=42.9%。
试着先将结点6剪除,此时,划分正确的样本为:4、8、11、12。所以精度提升至:44/7*100%=57.1%。这就意味着可以将结点6剪除。将结点6剪除后,试着将结点5剪除。同理,发现剪除前后精度都是57.1%。所以不进行剪除。分析结点2,结点2剪除前后,对应的精度分别为:57.1%和71.4%。所以可将结点2进行剪除。分析结点3,剪除前后精度没有变化。所以将结点3保留。所以经过后剪枝,最终的划分图为:
二、决策树的简单实现
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建决策树分类器
clf = DecisionTreeClassifier()
# 在训练集上训练模型
clf.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = clf.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("准确率:", accuracy)
三、总结
决策树是一种常用的机器学习算法,它通过构建一棵树状结构来进行分类和回归任务。决策树的特点包括易于理解、可解释性强、能够处理多类别问题、能够处理连续和离散特征等。决策树的构建过程包括选择最佳的特征进行划分,递归地构建子树,直到满足终止条件。划分特征的选择通常使用信息增益、信息增益率、基尼系数等指标来衡量。常见的决策树算法有ID3、C4.5、CART等。决策树容易产生过拟合问题,为了克服过拟合,可以使用剪枝技术。
剪枝是决策树算法中的一种重要的处理技术,用于防止过拟合和提高模型的泛化能力。剪枝可以分为预剪枝和后剪枝两种。预剪枝是在决策树构建过程中,在每个节点划分前进行判断,如果划分后的性能没有明显的提升或者达到了预定的阈值,就停止划分并将当前节点标记为叶子节点。后剪枝是在决策树构建完成后,通过自底向上的方式对树进行修剪。剪枝的目标是通过减小决策树的复杂度来提高模型的泛化能力。剪枝是决策树算法中一个重要的步骤,可以有效地提高模型的泛化能力和预测性能。