目录
一、决策树的定义
决策树是一种基本的分类与回归方法。它是一种树形结构,其中每个内部节点表示一个特征属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别标签。决策树可以用来提取最有用的特征,并通过树的结构来模拟任何类型的决策过程。
二、构建决策树
构建决策树主要分为三个步骤:特征选择、决策树的生成和剪枝。
2.1 特征选择
选择哪些特征作为分类的标准是决策树算法的关键,因为特征选择的好坏直接决定了分类的效果是否理想。因此,在众多特征(属性中,如何找到与分类最相关、次相关的特征是核心。
一般地,决策树算法选择划分数据集的特征,常用的准则有信息增益、信息增益率和基尼指数。
2.1.1 信息理论
信息理论是基于数学的理论框架,用于量化信息的传输、存储和处理的特性。它是由克劳德·香农(Claude Shannon)在1948年提出的,主要应用于通信领域,但后来也被广泛应用于其他领域,包括机器学习。
2.1.2 信息的定义
基于信息理论的背景下,信息的定义如下:
信息(Information)可以理解为能够减少不确定性的数据。在信息理论中,信息被量化为一个事件发生的概率的负对数。如果一个事件的发生概率很高,那么它提供的信息就很少;相反,如果一个事件的发生概率很低,那么它提供的信息就很多。
信息的计算公式如下:
其中表示可能发生的某一事件,表示事件xi发生的概率,是事件xi的信息量。
信息熵(Entropy)是信息理论中的一个核心概念,它量化了一个随机变量不确定性的大小。在机器学习中,信息熵经常被用来衡量数据集的纯度,或者在构建决策树时选择最优的特征。信息熵可以用来评估当从数据集中随机选取一个样本时,我们能够获得多少信息,或者需要多少位来编码这个样本的类别。
信息熵的计算公式
其中是随机变量xi的信息熵,是随机变量x取值为的概率,n表示随机变量x的所有可能取值个数。
信息熵的特性
当一个随机变量的取值概率分布越均匀,其熵越大,不确定性越高;相反,当其取值概率分布越不均匀(即某个取值的概率接近1)时,其熵越小,不确定性越低。
此外,信息熵是非负的,即 。
信息熵可以用来评估特征对分类结果的影响。与之相关的,是在决策树算法中用于特征选择的信息增益这个关键指标。
下面就带大家了解何为信息增益!
2.1.4 信息增益
划分数据集的大原则是将无序的数据变得更加有序。通过计算每个特征划分前后的信息熵变化,我们可以选择最优的特征来最大程度地减少数据集的不确定性,这个变化量被称为信息增益(Information Gain)。
信息增益越大,表示使用该特征进行划分后,数据集的纯度提升越明显,即不确定性减少得越多。
信息增益的计算公式如下:
其中Ent()的计算公式如下:
其中Gain(D,a)是特征 a 给数据集D带来的信息增益;Ent(D)表示数据集D的信息熵;Ent(D|a)表示数据集D基于特征a划分后的信息熵,表示数据子集的信息熵。
V 是特征 a 的所有可能取值;是数据集D中特征a取值为v的子集。∣∣ 是子集的大小,|D|是数据集 D的大小。
2.1.5 信息增益率
信息增益率(Information Gain Ratio)是机器学习中用于特征选择的一种指标,它是C4.5决策树算法的核心概念之一。信息增益比是对信息增益(Information Gain)的改进,旨在减少信息增益对具有大量值的特征的偏好。
信息增益率的计算公式如下:
其中,IV(a)称为特征a的“固有值”,且其计算公式如下:
2.1.6 基尼指数
基尼值的定义
基尼值是衡量一个集合中随机选取的两个样本属于不同类别的概率。如果一个集合中的所有样本都属于同一个类别,那么基尼值为0,表示这个集合是纯的;如果集合中的样本均匀分布在多个类别上,基尼值会达到最大,表示这个集合是最不纯的。
在分类问题中,假设数据集D有k个类别,样本属于第k个类别的概率为,则基尼值的计算公式如下:
其中Gini(D)是数据集D的基尼指数,n是数据集中所有类别的数目;
基尼指数(Gini Index)也是一种衡量数据集纯度或不确定性的一种度量。它是CART(Classification And Regression Tree)决策树算法中用于特征选择的一种指标。
基尼指数越小,数据集的纯度越高。并且在划分数据集时,一般选取使基尼指数达到最小的特征进行划分。
对于给定的特征a和数据集D,基尼指数可以表示为:
其中𝐺𝑖𝑛𝑖(𝐷,a) 是特征a给定数据集D的基尼指数;V是特征a的取值个数,是数据集D中特征a取值为 v 的子集。
2.2 构建决策树
基于上述介绍的划分数据集的准则有:信息增益、信息增益率和基尼指数,构建决策树的常用算法也有“以信息增益为选取最优特征的准则”的ID3算法(Iterative Dichotomiser 3)、“以信息增益率为选取最优特征的准则”的C4.5算法和“以基尼指数为选取最优特征的准则”的CART算法(Classification And Regression Tree)。
2.2.1 ID3算法
ID3算法通过计算每个属性的信息增益来选择最佳属性作为节点。
ID3算法的核心步骤:
(1)计算整个数据集的香农熵,作为数据不确定性的度量。
(2)对于每个属性,计算其信息增益,即父节点的香农熵减去所有子节点的加权平均香农熵。
(3)选择具有最大信息增益的属性作为节点,并根据该属性的不同值将数据集划分为子集。
(4)对每个子集重复上述步骤,直到所有数据都属于同一类别或没有更多属性可供划分。
ID3算法生成的决策树是对数据进行分类的树形结构,每个非叶子节点代表一个属性,每个分支代表一个属性值,每个叶节点代表一个类别。该算法适用于数据集属性较少、数据类型为离散型的分类问题,常用于文本分类、垃圾邮件过滤、医学诊断、金融风险评估等领域。
当然,ID3算法也存在一些缺点,例如它倾向于选择属性较多的特征,可能存在偏向问题,并且没有考虑缺失值的情况。此外,所有属性必须为离散量,且训练例的所有属性必须有一个明确的值。
2.2.2 C4.5算法
C4.5算法是决策树算法的一种,由Ross Quinlan在1993年提出,它是ID3算法的改进版。C4.5算法不仅用于分类任务,还可以用于回归任务,通过构建一棵决策树来对数据进行分类或预测。
C4.5算法使用增益率(Gain Ratio)作为特征选择的度量,以减少ID3算法对具有大量值的属性的偏好。它可以用于处理连续属性,对于连续属性,C4.5会先将其离散化,然后再计算信息增益率。
C4.5算法还可以应用后剪枝来减少过拟合。后剪枝包括替换子树为叶节点,或者将多个叶节点合并为一个叶节点。
C4.5算法的步骤
(1)计算数据集的熵:评估当前数据集D的纯度,即熵值。
(2)计算每个特征的信息增益:对于数据集D中的每个特征A,计算在该特征条件下数据集的熵减少量,即信息增益。
(3)计算每个特征的增益率:对于数据集D中的每个特征A,计算增益率。
(4)选择增益率最大的特征:选择增益率最大的特征作为当前节点的分裂特征。
(5)重复以上步骤:对于每个子集,重复步骤1-4,直到所有子集都是纯的或者达到停止条件。
2.2.3 CART算法
对于分类任务,CART决策树算法使用基尼指数(Gini Index)作为特征选择的度量。而对于回归任务,CART算法使用最小二乘回归(Least Squares Regression)作为特征选择的度量。
与前两个决策树生成算法不同的是,CART生成的是二叉树,每个节点根据最优的分裂点进行分裂,无论是分类还是回归。
CART算法在处理连续属性时,会寻找最优的分裂点,而不是将连续属性离散化。此外,它使用代价复杂度剪枝(Cost-Complexity Pruning)来剪枝,这是一种后剪枝方法,通过最小化树的复杂度和错误率来找到最佳的子树。
CART算法的步骤
(1)计算数据集的基尼指数或最小二乘回归:评估当前数据集D的纯度或不纯度。
(2)对于每个特征,找到最优的分裂点:对于数据集D中的每个特征A,找到能够最大程度减少基尼指数或最小二乘回归的分裂点。
(3)选择最优的特征和分裂点:选择能够最大程度减少数据集不纯度的特征和分裂点作为当前节点的分裂特征和分裂点。
(4)重复以上步骤:对于每个子集,重复步骤1-3,直到所有子集都是纯的或者达到停止条件。
2.3 剪枝
在机器学习中的决策树算法中,为了防止过拟合,需要对决策树进行剪枝。剪枝(Pruning)是一种防止过拟合的策略,它通过移除某些树枝或叶节点来简化决策树,从而提高模型的泛化能力。剪枝策略可以分为预剪枝(Pre-pruning)和后剪枝(Post-pruning)两种。
2.3.1 预剪枝(Pre-pruning)
预剪枝是在决策树生成过程中就停止树的增长,避免构建过大的树。
预剪枝的方法有:
(1)限制树的最大深度:在构建树的过程中,设置一个最大深度,当节点分裂后的子节点数量小于某个阈值或者子节点的大小小于某个阈值时,停止分裂。
(2)最小样本分裂:如果一个节点的样本数量小于某个阈值,则不再对该节点进行分裂。
(3)最大叶子节点数:限制树中叶节点的最大数量,当达到这个数量时,停止树的生长。
预剪枝可以减少过拟合的风险,但可能会导致模型性能的下降。
2.3.2 后剪枝(Post-pruning)
后剪枝是在决策树完全生长之后,通过剪除某些树枝或叶节点来简化树。
后剪枝的方法有:
(1)代价复杂度剪枝:在决策树完全生长后,通过评估每个叶节点的代价复杂度(Cost Complexity)来决定是否剪枝。代价复杂度是错误率与树的大小(叶子节点数)的乘积。如果剪去某个叶节点可以减少总的代价复杂度,则剪去该叶节点。
(2)最小错误剪枝:在决策树完全生长后,评估剪去每个叶节点后树的总错误率。如果剪去某个叶节点可以减少总的错误率,则剪去该叶节点。
后剪枝可以提高模型的泛化能力,同时保留模型的预测能力。但后剪枝需要计算每个叶节点的代价复杂度或错误率,这会增加算法的计算复杂度。
2.3.2 剪枝策略的比较
预剪枝在决策树生长过程中就停止增长,可以减少过拟合的风险,但可能会导致模型性能的下降。后剪枝在决策树完全生长后进行剪枝,可以提高模型的泛化能力,但计算复杂度较高。
三、决策树的简单案例(以鸢尾花数据集为背景)
1. 实验过程分析
3.1.1 导入库模块
# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
import matplotlib.pyplot as plt
3.1.2 获取数据集
# 加载鸢尾花数据集
iris = load_iris()
X, y = iris.data, iris.target
3.1.3 创建决策树分类器
# 创建决策树分类器实例
clf = DecisionTreeClassifier()
3.1.4 训练模型
# 训练决策树分类器
clf.fit(X_train, y_train)
3.1.5 模型评估
# 评估模型
accuracy = clf.score(X_test, y_test)
print(f"模型准确率: {accuracy:.2f}")
3.1.6 决策树可视化
# 可视化决策树
plt.figure(figsize=(12, 12))
tree.plot_tree(clf, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.show()
3.2 代码汇总
# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
import matplotlib.pyplot as plt
# 加载数据集
iris = load_iris()
X, y = iris.data, 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)
# 评估模型
accuracy = clf.score(X_test, y_test)
print(f"模型准确率: {accuracy:.2f}")
# 可视化决策树
plt.figure(figsize=(12, 12))
tree.plot_tree(clf, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.show()
3.3 运行结果
基于上述实验的决策树可视化图形如下:
四、实验总结
通过构建决策树模型并对鸢尾花数据集进行分类,我们能够观察到决策树在实际应用中的表现。实验结果表明,决策树是一种有效的分类方法,特别是在数据集的特征具有很好的区分度时。
通过这个案例,我体会到决策树模型的简洁性和解释性,它的结构非常直观,易于理解,这也使得它在很多领域都有广泛的应用。同时,也需要注意在实验中是否会出现过拟合的问题,适当进行剪枝以提高模型的泛化能力。