机器学习(10)-决策树

决策树

决策树(Decision Tree),是一种以树形数据结构来展示决策规则和分类结果的模型。决策树通过一系列的决策节点,将数据分类到不同的类别中,或者预测一个连续的数值。决策树模仿了人类的决策过程,通过树形结构进行决策,其中每个内部节点代表一个特征属性上的判断,每个分支代表判断的结果,而每个叶节点则代表最终的决策结果。

决策树的构建过程从根节点开始,根节点代表整个数据集,然后基于数据集中某个特征的最佳分割点,递归地将数据集分割成越来越小的子集,直到满足特定的停止条件,如达到预设的最大深度、所有数据点属于同一类别或分类误差低于某个阈值。

划分选择

在数据划分时,将遇到以下问题

  • 如何将数据集最好地划分为不同的类别?
  • 如何设定数据集的划分准则,即先以哪个特征属性来划分,后以哪个特征属性来划分?

决策树学习的关键是选择最优划分特征,一般而言,随着划分过程的不断进行,我们希望决策树的分支节点所包含的样本尽可能属于同一类别,即节点的“纯度”越来越高。对此主要有三种划分选择方法,即信息增益增益率基尼指数,分别对应著名的 ID3、C4.5 和 CART 三种决策树算法。

信息增益

信息熵

1948年,香农提出了信息熵的概念,解决了对信息的量化度量问题,也称香农熵,简称熵。一条信息的信息量大小和它的不确定性有直接的关系。比如说,我们要搞清楚一件非常非常不确定的事,或是我们一无所知的事情,就需要了解大量的信息。相反,如果我们对某件事已经有了较多的了解,我们不需要太多的信息就能把它搞清楚。因此可以认为,信息量的度量就是信息的不确定性多少。

对于集合D,其信息熵的定义为

信息熵Ent(D)的值越小,则D的纯度越高。

条件熵

条件熵表示的是在已知一 个随机变量的条件下,另一个随机变量的不确定性。具体地,假设有随机变量 X 和 Y ,且它们服从以下 联合概率分布

在已知 X 的条件下,随机变量 Y 的条件熵为

信息增益

信息增益也称为“互信息”,表示已知一个随机变量的信息后另 一个随机变量的不确定性减少的程度,信息增益的定义为信息熵和条件熵的差。

假设有随机变量 X 和 Y ,那么在已知 X 的信息后,Y 的不确定性减少的程度为

若根据某个属性计算得到的信息增益越大,则说明在知道其取值后样本集的不确定性减小的程度越大,即 前文的“纯度提升”越大。

增益率

信息增益方法更偏好于可选择数目较多的属性,为减小这种偏好对于决策树构建的干扰,基于信息增益,提出了增益率方法来选择最优属性。

增益率定义如下

IV(a)称为属性a的固有值,对于属性a,a的可能取值越多,IV(a)就越大。增益率准则更偏好于选择可选择数目较少的属性,因此C4.5算法并没有直接采用增益率方法,而是使用一个启发式算法,先查找出信息增益高于平均值的属性,再从中找出增益率最高的属性。

基尼指数

假设数据集 D 中的样例标记种类共有三类,每类样本所占比例分别为 p1、p2、p3。现从数据集中随 机抽取两个样本,两个样本类别标记正好一致的概率为

两个样本类别标记不一致的概率(即“基尼值”)为

上两式之和为1,则

对于数据集D,从中任取两个样本,类别标记一致的概率越大表示其纯度越高(即大部分样本属于同一类), 类别标记不一致的概率(即基尼值)越大表示纯度越低。

属性a的基尼指数可定义为

该式表示在属性 a 的取值已知的条件下,数据集 D 按照属 性 a 的所有可能取值划分后的纯度。

决策树剪枝

过拟合

过拟合(over-fitting)是指模型在训练集上表现很好,而到了验证和测试阶段表现很差,即指模型的泛化能力很差。

欠拟合

欠拟合(under-fitting)是指模型不能在训练集上获得足够低的误差,即模型复杂度低,在训练集上表现很差,没有学习到数据背后的规律。

在决策树模型建立过程中,为了更正确地分类样本,将不断重复节点划分过程,有时会使得决策树中的节点划分过多,导致模型过拟合。因此需要主动地去除一些节点,降低模型的过拟合风险,这个过程称为剪枝。

  • 预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。
  • 后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。

给定如下数据集,其中已划分训练集和验证集

可以生成如下的决策树模型

预剪枝

可以看出,预剪枝使得决策树的很多节点都没有展开,降低了过拟合的风险,也减少了决策树的训练时间开销和测试时间开销。但是也带来了欠拟合的风险。

后剪枝

后剪枝的欠拟合风险很小,同时泛化性能往往优于预剪枝决策树。但是后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。

Python实践-决策树

1.基于信息增益

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

# 加载示例数据集
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.3, random_state=42)

# 创建决策树分类器,基于信息增益(默认情况下'splitter'参数为'best')
# 不填默认为基尼不纯度;填写"gini"使用基尼系数; 填写“entropy”使用信息增益
clf = DecisionTreeClassifier(criterion='entropy')

# 训练模型
clf.fit(X_train, y_train)

# 进行预测
y_pred = clf.predict(X_test)

# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Classification Report:")
print(classification_report(y_test, y_pred))
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))

# 可视化决策树
plt.figure(figsize=(12,8))
plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.show()

2.基于基尼指数

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

# 加载示例数据集
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.3, random_state=42)

# 创建决策树分类器,基于基尼指数
clf = DecisionTreeClassifier(criterion='gini')

# 训练模型
clf.fit(X_train, y_train)

# 进行预测
y_pred = clf.predict(X_test)

# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Classification Report:")
print(classification_report(y_test, y_pred))
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))

# 可视化决策树
plt.figure(figsize=(12,8))
plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.show()

Reference

机器学习(西瓜书)

机器学习公式详解(南瓜书)

10.【机器学习】十大算法之一决策树(Decision tree)算法原理讲解_the decision tree algorithm-CSDN博客

【机器学习基础】第十三课:决策树的剪枝处理 - welcome to x-jeff blog (shichaoxin.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值