机器学习——决策树(Decision Tree)

一、决策树的介绍

决策树是一种模仿人类决策过程的机器学习算法,它通过学习简单的决策规则来预测目标变量的值。决策树模型由节点和边组成,形成一个树状结构。树的每个内部节点表示一个特征上的判断,每个边代表判断的结果,而每个叶子节点代表一个类别或决策结果。今天由我来向大家介绍决策树的相关算法以及如何构造和实现决策树。

在这里插入图片描述

1.决策树的定义

  • 决策树(Decision Tree)是从一组无次序、无规则,但有类别标号的样本集中推导出的、树形表示的分类规则。
  • 一般的,一棵决策树包含一个根结点、若干个内部结点(中间结点)和若干个叶子结点。
  • 树的叶子结点表示类别标号,即分类属性的取值,也可以说是决策结果;树的内部结点为条件属性,每个结点包含的样本集合根据属性测试结果被划分到子结点中;根结点包含样本全集。从树根到叶子结点的一条路径称为一条决策规则,它可以对未知数据进行分类或预测。每条有向边都用其出点的属性值标记。
  • 通常,一个属性有多少种取值,就从该结点引出多少条有向边,每一条边代表属性的一种取值。
  • 树深度是树根到树叶的最大层数,通常作为决策树模型复杂度的一种度量。

2.决策树的优缺点

决策树的优点:

  • 决策树算法中学习简单的决策规则建立决策树模型的过程非常容易理解;
  • 决策树模型可以可视化,非常直观;
  • 应用范围广,可用于分类和回归,而且非常容易做多类别的分类;
  • 能够处理数值型和连续的样本特征

决策树的缺点:

  • 很容易在训练数据中生成复杂的树结构,造成过拟合(overfitting)。剪枝可以缓解过拟合的负作用,常用方法是限制树的高度、叶子节点中的最少样本数量。

二、决策树的构造

使用决策树做预测的每一步骤都很重要,数据收集不到位,将会导致没有足够的特征让我们构建错误率低的决策树。数据特征充足,但是不知道用哪些特征好,将会导致无法构建出分类效果好的决策树模型。从算法方面看,决策树的构建是我们的核心内容。
通常,这一过程可以概括为3个步骤:

  • 特征选择
  • 决策树的生成
  • 决策树的修剪。

1.特征选择

1.1熵

熵(entropy)表示随机变量不确定性的度量,也就是熵越大,变量的不确定性就越大。设是一个有限值的离散随机变量,其概率分布为:

在这里插入图片描述
假设变量X的随机取值为X={x_{1}},x_{2},…,x_{n},每一种取值的概率分别是p_{1},p_{2},p_{3},…p_{n} ,则变量X 的熵为:

在这里插入图片描述
实例分析:

  • 如果有4个球,1个颜色。
    则该颜色的球所占比例为1,可计算该集合的信息熵=−1∗log2​(1)=0
  • 如果有4个球,4个不同颜色。
    则每种颜色的球所占比例为1/4,可计算该集合的信息熵=-41/4log2(1/4)=2
  • 如果有8个球,8个不同颜色。
    则每种颜色的球所占比例为1/8,可计算该集合的信息熵=-81/8log2(1/8)=3
    由上述分析可知,系统的熵最小为0,最大可以无穷。熵越小,说明集合的纯度越高。

1.2信息增益

信息增益指的就是划分可以带来纯度的提高,信息熵的下降。它的计算公式,是信息增益 = 划分前熵 - 划分后熵。在计算的过程中,我们会计算条件下每个分支的归一化信息熵,即用每个分支在该属性中出现的概率,来乘以该分支的信息熵。所以信息增益的公式可以表示为:

在这里插入图片描述
Gain(D,a)中 D 是当前结点包含的所有结果(来自父节点某一分支), a 是为划分这些结果所选的属性,Di 则是属性a下不同的分支所包含的结果 。

1.3基尼指数

基尼指数(Gini不纯度)表示在样本集合中一个随机选中的样本被分错的概率。

在这里插入图片描述
注意:Gini指数越小表示集合中被选中的样本被参错的概率越小,也就是说集合的纯度越高,反之,集合越不纯。当集合中所有样本为一个类时,基尼指数为0。

2.决策树的生成

决策树模型有多种类型,每种类型都有其特点和适用场景。以下是一些教材中常见的决策树模型:

1.1 ID3

  • 经典的决策树算法,使用信息增益作为特征选择的标准,但它倾向于选择具有更多值的特征,比如每个样本的唯一编号。

1.2 C4.5

  • C4.5是ID3的改进版,它使用信息增益率来选择特征,克服了ID3对特征值数量的偏好。

1.3 CART(Classification and Regression Trees)

  • CART既可以用于分类问题,也可以用于回归问题。它使用基尼不纯度作为分类问题的划分标准,对于回归问题则使用均方误差。基尼不纯度(Gini Impurity)是决策树算法中用于衡量一个节点内样本类别多样性的指标。它基于概率理论,用于评估数据集的纯净度或不纯度。基尼不纯度越低,表示数据集的纯净度越高,即数据集中的样本属于同一类别的可能性越大。公式如下:

在这里插入图片描述
其中,m是数据集中不同类别的总数,是数据集中第i个类别的样本所占的比例。基尼不纯度的值范围从0到1,当数据集中的所有样本都属于同一个类别时,基尼不纯度为0,表示纯净度最高;当数据集中的样本均匀分布在所有类别时,基尼不纯度接近1,表示不纯度最高。与信息增益相比,基尼不纯度对样本类别分布的不均匀性不太敏感,因此在某些情况下可能更受欢迎。此外,基尼不纯度的计算不需要对数运算,这在数值稳定性方面可能更有优势。

3.决策树的修剪

1.1为什么要剪枝?

  • 决策树的剪枝是为了简化决策树模型,避免过拟合。
  • 同样层数的决策树,叶结点的个数越多就越复杂;同样的叶结点个数的决策树,层数越多越复杂。
  • 剪枝前相比于剪枝后,叶结点个数和层数只能更多或者其中一特征一样多,剪枝前必然更复杂。
  • 层数越多,叶结点越多,分的越细致,对训练数据分的也越深,越容易过拟合,导致对测试数据预测时反而效果差,泛化能力差。

1.2 剪枝的分类

剪枝算法可以分为:预剪枝和后剪枝。

预剪枝

预剪枝就是在决策树生成过程中,在每次划分时,考虑是否能够带来决策树性能的提升。如果可以提升决策树的性能则会进行划分,如果不能则会停止生长。
一般的方法有如下几种:

  • 当树的深度达到一定的规模,则停止生长。
  • 达到当前节点的样本数量小于某个阈值的时候。
  • 计算每次分裂对测试集的准确性提升,当小于某个阈值,或不再提升甚至有所下降时,停止生长。
  • 当信息增益,增益率和基尼指数增益小于某个阈值的时候不在生长。

预剪枝的优缺点

优点:思想简单,算法高效,采用了贪心的思想,适合大规模问题。
缺点:提前停止生长,有可能存在欠拟合的风险。

后剪枝

后剪枝是先从训练集生成一颗完整的决策树,然后自底向上的对决策树进行剪枝。与预剪枝最大的不同就是决策树是否生长完整。决策树的生成是学习局部的模型,后剪枝则是学习整体的模型。

一般的方法有错误率降低剪枝(REP)等。

后剪枝的优缺点

优点:可以最大限度的保留树的各个节点,避免了欠拟合的风险。
缺点:相较于预剪枝的时间开销巨大。

三、决策树的实现

1.导入库

import pandas as pd
import matplotlib.pyplot as plt
  • pandas:用于数据处理和分析。
  • matplotlib.pyplot:用于绘制图形,这里主要用于绘制散点图来直观展示数据之间的关系

2.描绘可视化混淆矩阵

def cm_plot(y,yp):
    from sklearn.metrics import confusion_matrix
    import matplotlib.pyplot as plt
    cm  = confusion_matrix(y,yp)
    plt.matshow(cm,cmap = plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x,y],xy = (y,x),horizontalalignment = 'center',
                         verticalalignment='center')
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
    return plt

3.数据预处理

datas = pd.read_excel("电信客户流失数据.xlsx")

#变量与结果划分开
data = datas.iloc[:,:-1]
target = datas.iloc[:,-1]

#划分数据集
from  sklearn.model_selection import  train_test_split

data_train,data_test,target_train,target_test = \
         train_test_split(data,target,test_size=0.2,random_state=42)
  • 读取数据:使用pandas库读取文件
  • data:删除最后一列
  • target:只保留最后一列
  • train_test_split:对数据集进行划分
  • 将数据划分为这四部分:
    data_train:训练集特征
    data_testt:测试集特征
    target_train:训练集标签
    target_test:测试集标签

4.模型训练

from sklearn import tree

# 定义未训练的决策树模型
dtr = tree.DecisionTreeClassifier(criterion='gini',max_depth=8,random_state=42)
dtr.fit(data_train,target_train)
  • 从sklearn库中导入树模型
  • 使用DecisionTreeClassifier()函数建立决策树模型
  • 使用fit()函数对模型进行训练

5.绘制混淆矩阵并打印评分报告

from  sklearn import metrics

#训练集预测值
train_predicted = dtr.predict(data_train)
#绘制混淆矩阵
print(metrics.classification_report(target_train,train_predicted))
#可视化混淆矩阵
cm_plot(target_train,train_predicted).show()

"""测试集混淆矩阵"""
#测试集预测值
test_predicted = dtr.predict(data_test)
#绘制混淆矩阵
print(metrics.classification_report(target_test,test_predicted))
#可视化混淆矩阵
cm_plot(target_test,test_predicted).show()
#对决策树测试集进行评分
print("Test Set Accuracy:", dtr.score(data_test, target_test))
  • 打印报告:打印分类报告(classification_report),包括精确度、召回率、F1分数等指标。
  • 绘制混淆矩阵:使用自定义的cm_plot函数绘制混淆矩阵,以可视化模型性能。
  • 使用score()函数对模型进行评分

6.绘制决策树

from sklearn.tree import  plot_tree 
fig,ax = plt.subplots(figsize=(16,16)) 
plot_tree(dtr,filled=True,ax=ax)
plt.show()
  • 导入plot_tree来绘制决策树的图
  • subplots()函数是来设置图片大小
  • filled=True: 这个参数表示树的节点将根据类别或值填充颜色,便于区分不同节点。
  • ax=ax: 这个参数指定绘图的坐标轴对象 ax,允许你在已有的图形上绘制决策树。
  • 绘制的决策树如下:
    在这里插入图片描述

四、总结

决策树既可以用于分类问题,也可以用于回归问题,且决策树也是具有极高可解释性(大众基本都能听懂)的模型。目前无论是各大比赛各种大杀器的XGBoost、lightgbm、还是像随机森林、AdaBoost等典型集成学习模型,都是以决策树模型为基础的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值