一、决策树的原理
1.1决策树的定义
决策树是一种用于分类和回归任务的非参数监督学习算法。它是一种分层树形结构,由根节点、分支、内部节点和叶节点组成。决策树从根节点开始,根节点没有任何传入分支。然后,根节点的传出分支为内部节点(也称为决策节点)提供信息。两种节点都基于可用功能执行评估以形成同类子集,这些子集由叶节点或终端节点表示。叶节点表示数据集内所有可能的结果。决策树学习采用"一一击破"的策略,执行贪心搜索 (greedy search) 来识别决策树内的最佳分割点。
举个例子来说,假设您尝试评估自己是否应该去冲浪,您可以使用以下决策规则帮助做出选择:
1.2如何在每个节点上选择最佳属性
虽然可以使用许多方法在每个节点上选择最佳属性,但信息增益和基尼不纯度这两种方法是最常用的决策树模型拆分标准。 它们有助于评估每个测试条件的质量以及样本分类能力。
1.2.1 信息熵和信息增益
信息熵:信息熵是信息论的基本概念,用于描述信息源各可能事件发生的不确定性。可以用来衡量随机变量的不确定性或者信息量。信息熵的定义是一个数学期望,单位是比特,它的值越大,表示随机变量的不确定性越高,信息量也就越大。信息熵的计算公式为:
其中:
- S 代表计算信息熵的数据集
- c 表示集合中的类,
- p(c) 表示属于类别 c 的数据点占数据集中总数据点数的比例
熵值介于 0 和 1 之间。 如果数据集 S 中的所有样本都属于一类,则熵值为零。 如果一半样本属于一类,而另一半属于另一类,则熵值为最高值 1。 为了选择要拆分的最佳特征并确定最佳决策树,必须使用熵值最小的属性。
信息增益: 信息增益表示拆分给定属性之前和之后的熵值差异。 具有最大信息增益的属性的拆分效果最佳,因为它在根据训练数据的目标类别进行分类的效果最佳。 信息增益通常用以下公式表示:
其中
- a 表示特定的属性或类标签
- 信息熵 (S) 是数据集的熵
- |Sv|/ |S| 表示 Sv 值与数据集的值的比例
- 信息熵 (Sv) 是数据集的熵值
让我们举一个例子来进行信息熵和信息增益的计算:
假设想要预测一位人士是否会购买一辆新车。有以下数据集,其中包含 14 个样本,其中 9 个是正样本,5 个是负样本。你想要使用年龄和收入这两个特征来预测结果。以下是数据集:
年龄 | 收入 | 购买新车 |
---|---|---|
25 | 45,000 | 否 |
30 | 52,000 | 否 |
35 | 70,000 | 是 |
40 | 80,000 | 是 |
45 | 90,000 | 是 |
50 | 100,000 | 是 |
55 | 120,000 | 是 |
60 | 150,000 | 是 |
65 | 200,000 | 是 |
70 | 220,000 | 是 |
75 | 250,000 | 是 |
80 | 300,000 | 是 |
85 | 350,000 | 是 |
90 | 400,000 | 否 |
现在,我们可以使用信息熵和信息增益来选择最佳的特征。以下是计算信息增益的步骤:
1、计算整个数据集的信息熵:
2、计算使用年龄作为拆分标准时的信息增益:
- 对于年龄小于等于 50 的样本,有 5 个正样本和 2 个负样本。
- 对于年龄大于 50 的样本,有 4 个正样本和 3 个负样本
- 计算年龄作为拆分标准时的信息增益
3、计算使用收入作为拆分标准时的信息增益
- 对于收入小于等于 100,000 的样本,有 5 个正样本和 2 个负样本
- 对于收入大于 100,000 的样本,有 4 个正样本和 3 个负样本。
- 计算收入作为拆分标准时的信息增益
由于年龄和收入的信息增益相同,因此我们可以选择任何一个特征作为拆分标准。
1.2.2基尼值和基尼指数
基尼不纯度是一种用于衡量分类算法中的不纯度的指标。在决策树算法中,我们使用基尼不纯度来选择最佳的特征,以便将数据集拆分为最具分类能力的子集。基尼不纯度越小,说明特征对分类的影响越大,因此越有可能被选为拆分标准。
基尼值的计算公式为:
其中
- pk 表示第 k 个类别在数据集中出现的概率
- K 表示类别的总数
基尼指数:
Gini指数越小表示集合中被选中的样本被分错的概率越小,也就是说集合的纯度越高,反之,集合越不纯。 即 基尼指数(基尼不纯度)= 样本被选中的概率 * 样本被分错的概率。
案例:假设你是一个动物园的管理员,你正在决定如何将动物园的动物分成两个区域。你有两个属性可以考虑:动物的种类(哺乳动物或爬行动物)和动物的食性(食肉或食草)。你的动物园有30种动物,其中10种是哺乳动物,20种是爬行动物;15种动物是食肉动物,15种动物是食草动物。你的目标是尽可能地使得每个区域的哺乳动物和爬行动物数量均衡。
种类/食性 | 哺乳动物 | 爬行动物 | 总计 |
---|---|---|---|
食肉动物 | 7 | 8 | 15 |
食草动物 | 3 | 12 | 15 |
总计 | 10 | 20 | 30 |
现在,我们可以计算每个属性的基尼指数。首先,我们计算种类属性的基尼指数:
其中,Gini(哺乳动物)和Gini(爬行动物)可以通过以下公式计算:
所以,种类属性的基尼指数为:
接下来,我们计算食性属性的基尼指数:
其中,Gini(食肉动物)和Gini(食草动物)可以通过以下公式计算:
所以,食性属性的基尼指数为:
因此,我们可以看到,食性属性的基尼指数小于种类属性的基尼指数,所以我们应该选择食性作为划分标准。这是因为基尼指数越小,数据集的纯度越高,也就是说,使用该属性进行划分可以得到更纯的子集。
1.3 剪枝处理
剪枝处理(pruning)是决策树学习算法中对付“过拟合”的主要手段。在决策树学习中,为了尽可能正确分类训练样本,节点划分过程不断重复,有时候会造成决策树分支过多,以至于将训练样本集自身特点当作泛化特点,而导致过拟合。
剪枝处理可以分为预剪枝和后剪枝两类:
- 预剪枝是在每个结点划分前就进行估计,考虑结点对于整体划分效果是否有提升。如果当前结点的划分不能对决策树泛化性能有提高,则停止划分并将当前结点标记为叶结点。
- 后剪枝则是先从训练集中生成一棵完整的决策树,然后自底向上的考察每一个非叶结点,如果将该结点对应的子树替换为叶结点能给决策树带来性能上的提升,则将该子树替换为叶结点。
剪枝处理是一种可以提高搜索算法时间和空间效率的技巧,经过剪枝和其他优化策略优化过的算法在执行效率上远超一般未经剪枝的算法。甚至有些暴力搜索过不了时限的算法,也可以通过各种剪枝+优化大大缩短算法运行时间,成功通过时效限制。由此可见剪枝对于搜索算法的重要性。
二、决策树的代码实现:
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
# 导入数据集
iris = 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(criterion='gini')
# 使用训练集训练模型
clf.fit(X_train, y_train)
# 输出决策树
print(clf)
# 创建一个新的图形
plt.figure(figsize=(15, 10))
# 使用plot_tree函数绘制决策树
plot_tree(clf, filled=True, feature_names=iris.feature_names, class_names=iris.target_names.tolist())
# 显示图形
plt.show()
运行结果:
这段代码的主要目的是使用决策树模型对鸢尾花数据集进行分类,并将训练好的决策树进行可视化。下面是这段代码的详细解释:
-
导入必要的库:这段代码首先导入了几个Python库,包括
matplotlib.pyplot
(用于绘图),sklearn.tree
(包含决策树相关的函数),sklearn.datasets
(包含一些内置的数据集),sklearn.model_selection
(包含一些模型选择和评估的工具)。 -
加载数据集:然后,代码使用
load_iris
函数加载了鸢尾花数据集。这个数据集包含了150个样本,每个样本有4个特征(花萼长度、花萼宽度、花瓣长度和花瓣宽度)和一个标签(鸢尾花的种类)。 -
划分训练集和测试集:接着,代码使用
train_test_split
函数将数据集划分为训练集和测试集。训练集用于训练模型,而测试集用于评估模型的性能。 -
创建决策树分类器:然后,代码创建了一个决策树分类器对象。这个对象的
criterion
参数被设置为'gini'
,意味着分类器将使用基尼指数作为选择特征的标准。 -
训练模型:接着,代码使用训练集对决策树分类器进行训练。训练过程中,分类器会尝试找出最佳的特征和阈值来划分数据,以便使得各个子集的基尼指数最小。
-
输出决策树:然后,代码打印了训练好的决策树的信息。
-
绘制决策树:最后,代码使用
plot_tree
函数将训练好的决策树进行了可视化。这个函数会生成一个图形,其中每个节点代表一个决策规则,每个叶子节点代表一个预测的类别。
三、实验小结
决策树是一种监督学习算法,主要用于分类问题。它通过创建一棵树来对数据进行分类,每个内部节点表示一个特征,每个分支代表一个决策规则,每个叶节点代表一个预测的类别。决策树的构建过程是一个递归的过程:首先选择一个最佳的特征来划分数据,然后在每个子集上重复这个过程,直到所有的特征都已经被使用或者所有的子集都属于同一类别。在选择最佳特征时,决策树算法会考虑每个特征的信息增益或者基尼指数,选择信息增益最大或者基尼指数最小的特征。基尼指数是一种衡量数据不纯度的指标,基尼指数越小,数据的不纯度越低。