机器学习之决策树
一、决策树概述
1.什么是决策树
决策树是一种常见的机器学习算法,用于分类和回归任务。它通过树状结构模拟人类决策过程,将数据集分割成不同的子集,在每个子集上应用特定的规则来预测目标变量的值。决策树的节点表示数据集中的特征,边表示这些特征的取值,叶子节点表示最终的预测结果。通过构建决策树,我们可以快速而准确地对新的数据进行分类或回归预测。
例如如图,以判断西瓜是否为好瓜为例,我们要对“这是好瓜吗?“这样的问题进行决策时,通常会进行一系列的判断或”子决策“:我们先看”它是什么颜色?”,如果是“青绿色”,则我们再看“它的根蒂是什么形态?”,如果是“蜷缩”,我们再判断“它敲起来是什么声音?”,最后,我们得出最终决策:这是个好瓜。

2.决策树的构建
一般的,一颗决策树包含一个根结点、若干个内部结点和若干个叶结点;叶结点取决于决策结果,其他每个结点则对应于一个属性测试;每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集。从根结点到每个叶结点的路径对应了一个判定测试序列。决策树学习的目的是为了产生一颗泛化能力强,即处理未见示例能力的决策树。
决策树的构建过程是一个递归的过程,通常包括以下步骤:
(1)选择最佳的划分属性
从当前数据集中选择一个属性作为划分标准,将数据集分为不同的子集。通过某种指标(如信息增益、基尼指数等)来评估每个属性的划分效果,选择使得划分后子集更加纯净的属性作为划分标准。
(2)递归构建子树
对每个子集递归地应用步骤1,继续划分子集,直到满足停止条件。停止条件(即递归返回的条件)可以是:
①当前结点包含的样本全属于同一类别,无需划分;
②当前属性集为空,或是所有样本在所有属性上取值相同,无法划分;
③当前结点包含的样本集合为空,不能划分。
(3)剪枝处理:
构建完整的决策树后,可以对树进行剪枝,以防止过拟合。剪枝的目的是通过移除一些分支或叶节点来简化模型,提高泛化能力。 剪枝的方式可以是预剪枝(在构建树时进行剪枝)或后剪枝(在构建完整树后再进行剪枝)。
(4)生成决策树:
最终得到一个完整的决策树,每个内部节点表示一个属性测试,每个分支代表一个测试输出,每个叶节点代表一个类别标签或回归值。
在构建决策树过程中,需要根据具体的算法(如ID3、C4.5、CART等)选择合适的划分属性和停止条件,以及进行剪枝以避免过拟合。决策树的构建过程可以根据不同的数据集和需求进行调整和优化。
二、划分选择
决策树学习的关键是如何选择最优划分属性。一般而言随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”越来越高。一般我们有以下三种指标来进行划分选择。
1.信息增益
“信息熵”(information entropy)是度量样本集合纯度最常用的一种指标,假定当前样本集合D中第k类样本所占的比例为pk(k=1,2,...,|y|),则D的信息熵定义为
Ent(D)的值越小,则 D的纯度越高.
假定离散属性a有V个可能的取值{,
,..,
},若使用a来对样本集D进行划分,则会产生V个分支结点,其中第v个分支结点包含了D中所有在属性 a上取值为
的样本,记为
。我们可根据上式计算出
的信息熵,再考虑到不同的分支结点所包含的样本数不同,给分支结点赋予权重
,即样本数越多的分支结点的影响越大,于是可计算出用属性a对样本集 D进行划分所获得的“信息增益”(information gain)
一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的“纯度提升”越大。因此,我们可用信息增益来进行决策树的划分属性选择。
2.增益率
实际上,信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响,著名的 C4.5决策树算法[Quinlan,1993]不直接使用信息增益,而是使用“增益率”(gainratio)来选择最优划分属性。增益率定义为
其中
称为属性a的固有值。属性a的可能取值数目越多(即V越大),则IV(a)的值通常会越大。需要注意的是,增益率准则对可能值数目较少的属性有所偏好,因此,C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从侯选属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
3.基尼指数
CART决策树使用“基尼指数”来选择划分属性,数据集D的纯度可用基尼值来度量:
直观来说,Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此,Gini(D)越小,则数据集D的纯度越高。属性a的基尼指数可以定义为:
于是,我们在候选属性集合A中,选择那个使得划分后基尼指数最小的属性作为划分属性。
三、具体代码实现
我们选取了一个各种天气因素是否影响出门情况的数据集作为案例。该数据集包含了天气、温度、湿度、是否刮风等特征,以及一个标签表示特定的天气情况下是否出门。我们的目标是根据这些特征构建一个决策树模型,以预测未来的天气因素是否影响出门。
首先,我们需要计算数据集的信息增益和基尼指数。信息增益是基于信息论的概念,它衡量的是在特征给定的条件下,对目标变量进行划分所获得的信息量的变化。信息增益越大,说明使用该特征进行划分能够获得更多的信息,即特征对目标变量的划分能力更强。基尼指数是用来衡量数据的纯度或不纯度的指标,基尼指数越小表示数据的纯度越高。这两种指标都可以用来评估决策树划分结点时的性能。
由于数据集较大,无法直接给出全部数据,但可以通过代码来计算信息增益和基尼指数。以下是具体的数据集表格和Python代码的具体实现:
| 天气 | 温度 | 湿度 | 刮风 | 是否出门 |
|---|---|---|---|---|
| 晴 | 炎热 | 高 | 否 | 否 |
| 晴 | 炎热 | 高 | 是 | 否 |
| 阴 | 炎热 | 高 | 否 | 是 |
| 雨 | 适中 | 高 | 否 | 是 |
| 雨 | 寒冷 | 正常 | 否 | 是 |
| 雨 | 寒冷 | 正常 | 是 | 否 |
| 阴 | 适中 | 正常 | 是 | 是 |
| 晴 | 适中 | 高 | 否 | 否 |
| 晴 | 寒冷 | 正常 | 否 | 是 |
| 雨 | 适中 | 正常 | 否 | 是 |
| 晴 | 炎热 | 正常 | 是 | 是 |
| 雨 | 寒冷 | 高 | 是 | 否 |
| 阴 | 适中 | 正常 | 否 | 是 |
| 雨 | 适中 | 高 | 否 | 否 |
| 阴 | 炎热 | 正常 | 是 | 是 |
| 晴 | 适中 | 高 | 否 | 否 |
| 阴 | 寒冷 | 正常 | 是 | 是 |
| 雨 | 适中 | 高 | 否 | 否 |
| 晴 | 炎热 | 正常 | 是 | 否 |
| 阴 | 适中 | 高 | 是 | 否 |
# 导入所需的库
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 创建一个数据集案例
data = { '天气': ['晴', '晴', '阴', '雨', '雨', '雨', '阴', '晴', '晴', '雨', '晴', '雨', '阴', '雨', '阴', '晴', '阴','雨', '晴', '阴'],
'温度': ['炎热', '炎热', '炎热', '适中', '寒冷', '寒冷', '适中', '适中', '寒冷', '适中', '炎热', '寒冷', '适中','适中', '炎热', '适中', '寒冷', '适中', '炎热', '适中'],
'湿度': ['高', '高', '高', '高', '正常', '正常', '正常', '高', '正常', '正常', '正常', '高', '正常', '高', '正常','高', '正常', '高', '正常', '高'],
'刮风': ['否', '是', '否', '否', '否', '是', '是', '否', '否', '否', '是', '是', '否', '否', '否', '是', '否', '是', '否', '是'],
'是否出门': ['否', '否', '是', '是', '是', '否', '是', '否', '是', '是', '是', '否', '是', '否', '是', '否', '是', '否', '是', '否']
}
df = pd.DataFrame(data)
# 将数据集转换为数值型
df['天气'] = df['天气'].map({'晴': 0, '阴': 1, '雨': 2})
df['温度'] = df['温度'].map({'炎热': 0, '适中': 1, '寒冷': 2})
df['湿度'] = df['湿度'].map({'高': 0, '正常': 1})
df['刮风'] = df['刮风'].map({'否': 0, '是': 1})
df['是否出门'] = df['是否出门'].map({'否': 0, '是': 1})
# 划分特征和标签
X = df.drop(columns=['是否出门'])
y = df['是否出门']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.28, random_state=666)
# 使用信息增益构建决策树
dt_entropy = DecisionTreeClassifier(criterion='entropy')
dt_entropy.fit(X_train, y_train)
# 使用基尼指数构建决策树
dt_gini = DecisionTreeClassifier(criterion='gini')
dt_gini.fit(X_train, y_train)
# 计算信息增益和基尼指数
info_gain = dt_entropy.feature_importances_
gini_index = dt_gini.feature_importances_
# 计算准确率
y_pred_entropy = dt_entropy.predict(X_test)
accuracy_entropy = accuracy_score(y_test, y_pred_entropy)
y_pred_gini = dt_gini.predict(X_test)
accuracy_gini = accuracy_score(y_test, y_pred_gini)
print('信息增益:', info_gain)
print('基尼指数:', gini_index)
print('信息增益构建的决策树准确率:', accuracy_entropy)
print('基尼指数构建的决策树准确率:', accuracy_gini)
以下是计算每种天气因素的信息增益和基尼指数的结果,以及两种不同的衡量标准构建的决策树的准确率:

1.原理分析:
(1)信息增益:信息增益是基于信息熵的概念。信息熵表示数据的混杂程度,信息增益则表示划分一个结点后能够带来多少“信息”或者“纯度”的提升。简单来说,信息增益越大,说明划分后的数据集越纯,这个特征就越有价值。
(2)基尼指数:基尼指数也是衡量数据混杂程度的一个指标,但与信息熵不同的是,它更侧重于从概率分布的角度来衡量。基尼指数越小,说明数据的纯度越高。在决策树中,我们选择能够使基尼指数最小化的特征进行划分。
2.对构建决策树准确率的影响:
在以上示例中,使用信息增益构建的决策树准确率不如基尼指数的准确率,使用基尼指数进行预测的效果显然更好。但是通常情况下,一个决策树的准确率并不能确定哪种度量标准更好,因为它取决于数据的特性和分布。在某些数据集上,信息增益可能会表现得好,而在其他数据集上,基尼指数可能更优。因此在不同的数据集和场景下,选择不同的特征选择指标可能会对决策树的性能产生不同的影响。
3.异同点:
(1)相同点:
两者都是用来衡量数据集的纯度或者混杂程度的指标,帮助决策树在选择最佳划分特征时做出决策。两者的目标都是寻找能够使数据集更“纯”的特征进行划分,从而构建出高效的决策树。
(2)不同点:
①计算方式:信息增益是通过计算特征划分前后的信息熵的差值来衡量;基尼指数是通过计算特征划分前后的基尼系数的差值来衡量。
②目标:信息增益旨在选择能够获得更多信息的特征进行划分;基尼指数旨在选择能够使数据更纯净的特征进行划分。
③计算复杂度:在某些情况下,基尼指数的计算可能比信息增益稍微简单一些,因为它不涉及对数运算。
④效果:信息增益更倾向于选择具有更多取值的特征进行划分,可能会导致过拟合;基尼指数更倾向于选择二分法划分数据,更简洁高效。
总的来说,信息增益和基尼指数在构建决策树时都有其独特的优点和适用性。在实际应用中,我们可以根据数据的特性和问题的需求来选择使用哪种指标。
四、实验总结
决策树是一种常用的机器学习算法,它通过树状结构来表示不同的决策路径,并根据特征属性来进行分类或预测。在实验中,我们可以利用决策树算法来解决分类和回归问题,通过构建决策树模型来对数据进行分析和预测。我们可以通过信息增益、增益率和基尼指数等来对数据进行处理分析,从而获得合适的效果。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)