机器学习之决策树

本文详细介绍了决策树的基本原理,包括条件分支结构、熵的概念以及信息增益、信息增益率和基尼指数作为划分依据的方法。还讨论了如何通过信息增益率克服信息增益的偏好问题,并提出了决策树中预防过拟合的策略。最后展示了使用Pythonsklearn库构建决策树的代码示例。
摘要由CSDN通过智能技术生成

目录

决策树的基本思想

熵的概念

决策树的划分依据

信息增益法划分决策树

信息增益率

基尼指数

在决策树中如何预防过拟合

决策树的代码、API


决策树的基本思想

最早的思想来源就是程序设计中的条件分支结构就是if-else结构。决策树本质是一颗有多个判断节点组成的树,每个内部节点表示一个属性上的判断(规则条件),每个分支代表一个判断结果的输出,每个叶节点代表一种分类结果。

熵的概念

系统越有序,熵值越低;系统越混乱或者分散,熵值越高

熵的计算公式:

决策树的划分依据

决策树的划分有三种方法:信息增益法、信息增益率法、基尼指数法。

首先介绍第一种

信息增益法划分决策树

信息增益法又称ID3算法,信息增益是以某特征划分数据集前后的熵的差值来计算的,公式为:

信息增益=H(前)-H(后)。

意思就是:划分前的熵减去条件a确定下的条件熵。

通过不断地重复上述步骤,决策树递归地构建,每个节点都选择信息增益最大的特征进行划分。

例题:

计算信息增益前,需要做两件事情:一个是要计算总体的熵,一个是要选定计算哪个属性的信息增益。步骤如下:

计算总体的熵:

计算选定性别属性之后的信息增益:

计算选定活跃度属性之后的信息增益:

结论:活跃度的信息增益比性别的增益大,也就是说,活跃度对用户流失的影响更大。

信息增益率

在介绍信息增益率之前,解释一下为什么有了信息增益还需要有信息增益率(也称C4.5)这个算法?

信息增益准则对可取值数目较多的属性偏好,为减少折中偏好带来的不利影响,著名的C4.5决策树算法使用“增益率”来选择最优划分属性。也就是说:信息增益法对于某个属性来说,如果这个属性的取值非常多,那么ID3算法就偏好于这个属性,这是不合理的,C4.5算法就是升级版的ID3,是为了消除这个不合理。

增益率:用信息增益Gain(D,a)和属性a对应的固有值的比值来共同定义。

信息增益率用信息增益/内在信息:也就是说,如果这个属性本身不确定性就很大,那我就越不倾向于选取它

可以看到,在计算信息增益率之前,首先要计算信息增益。

例题:
由于分子:信息增益在前面已经计算过了,所以这里只需要计算分母,即每个属性的内在信息:
信息增益率的选择也是同信息增益一样的,哪个属性的大就选择哪个。 活跃度的信息增益率更高一些,所以在构建决策树的时候,优先选择

基尼指数

基尼指数就是要计算不同属性的基尼值。

基尼值:

从数据集D中随机抽取两个样本,其类别标记不一致的概率。故,Gini(D)值越小,数据集D的纯度越高。
基尼指数Gini_index(D):
一般选择使划分后基尼系数最小的属性最为最优划分属性。
例题:
首先计算总体的gini值:
分属性计算基尼指数:这里需要注意一点,基尼指数的计算只针对于有两个取值的属性,如果某个属性他的取值不止两个,那么我们不能直接算计基尼指数,要对这个属性进行的取值进行“一对其余”。
计算婚姻状况的基尼指数:由于在表中婚姻状况的取值有三种,故要进行三次一对其余:
第一次:已婚作为一类,离婚和单身作为一类;第二次:单身作为一类,已婚和离婚作为一类;第三次:离婚作为一类了,单身和已婚作为一类。
在上述的三种情况中选最小的那一个基尼指数作为婚姻的基尼指数。
计算是否有房属性的基尼指数:
计算年收入的基尼指数:这个比较特殊,因为年收入是一个连续型的数值输出属性,他的取值有很多种,而且都是数字。
对于年收入属性为数值型属性,首先需要对数据按升序排序,然后从小到大依次用相邻值的中间值作为 分隔将样本划分为两组。例如当面对年收入为60 70 这两个值时,我们算得其中间值为 65 。以中间值 65 作为分割点求出Gini 指数。即计算每一个相邻值中点,选取最小的那一个作为属性的基尼指数。
对比是否有房,婚姻状况和年收入这三个属性,选取基尼指数小的作为有限划分结点的属性。

在决策树中如何预防过拟合

在决策树中,随着树的增长,测试集的预测效果会先升后降,导致过拟合的出现。在决策树中,采用剪枝的技术预防过拟合。
两种剪枝方法
预剪枝:
限制每个节点所包含的最小样本数目,如 10 ,如果该节点总样本小于 10 ,则不再分
指定树的高度或者深度
指定节点的熵小于某个值,不再划分
后剪枝
  在已生成过拟合决策树上进行剪枝,可以得到简化版的剪枝决策树  

决策树的代码、API

from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
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)

# 创建ID3决策树模型
id3_model = DecisionTreeClassifier(criterion='entropy')
c45_model = DecisionTreeClassifier(criterion='entropy', splitter='best')
gini_model = DecisionTreeClassifier(criterion='gini')
id3_model.fit(X_train, y_train)

# 预测
id3_predictions = id3_model.predict(X_test)

# 评估准确性
id3_accuracy = accuracy_score(y_test, id3_predictions)
print(f'ID3 Accuracy: {id3_accuracy}')

  • 27
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值