关于决策树的一些介绍(二)

news2024/9/27 17:34:02

我之前写过一篇关于决策树的文章,但在那篇文章里没有提及基尼系数,信息熵与信息增益等相关问题,所以我将在这篇文章中进行补充。

一、 决策树的一份python代码

首先,我先给出一份最基础的决策树代码,在这里,由于没有指定criterion系数,所有默认采用基尼系数,不过在之后我还将具体些地讲述基尼系数。

代码如下:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score


# 导入数据
iris = load_iris()
X = iris.data
y = iris.target
# 划分
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=42)
# 决策树实例化
clf = DecisionTreeClassifier(random_state=1024)
# 拟合
clf.fit(X_train,y_train)
# 预测
y_pre = clf.predict(X_test)
# 计算准确率
accuracy =  accuracy_score(y_test,y_pre)
print("The true target: {}".format(y_test))
print("The predict target: {}".format(y_pre))
print(accuracy)

它的输出为:

The true target: [1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 1 2 1 1 2 0 2 0 2 2 2 2 2 0 0 0 0 1 0 0 2 1
 0]
The predict target: [1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 1 2 1 1 2 0 2 0 2 2 2 2 2 0 0 0 0 1 0 0 2 1
 0]
1.0

二、 基尼系数

接下来,我们就详细些地来看下基尼系数。首先,我们要知道基尼系数是来 对于不确定性给出一个值的,也就是说基尼系数的含义就是不确定程度。它可以用符号表示为:

我们以iris数据集来解释下:

2.1 计算分割前的基尼系数

首先我们知道在数据集中有三种类别,每种类别都是50个,一共有150个,那么就有50/150=1/3,也就是:

2.2 计算分割后的基尼系数

假设我们有一阈值t,并且将根据这个阈值来将数据集分割为两个部分,那么我们就需要分别计算左侧和右侧的基尼系数,并加权。

我们假设左边有nL个,右边有nR个,并且总数为n个,那么就会产生两个基尼系数:GL与GR,

我们选择最小的阈值t,来作为最佳的分割点。

2.3 实际代码
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# 导入数据
iris = load_iris()
X = iris.data
y = iris.target
# 划分
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=42)
# 选择花瓣长度作为特征
feature_index = 2  # 花瓣长度
thresholds = np.linspace(X[:, feature_index].min(), X[:, feature_index].max(), num=10)

# 计算
for threshold in thresholds:
    left_indices = X[:, feature_index] < threshold
    right_indices = ~left_indices
    # 左侧子节点的样本
    left_y = y[left_indices]
    left_n = len(left_y)
    # 右侧子节点的样本
    right_y = y[right_indices]
    right_n = len(right_y)
    # 确保子节点中至少有一个样本
    if left_n == 0 or right_n == 0:
        continue
    # 计算每个子节点的基尼系数
    g_left = 1 - sum([(np.sum(left_y == c) / left_n) ** 2 for c in range(3)])
    g_right = 1 - sum([(np.sum(right_y == c) / right_n) ** 2 for c in range(3)])
    # 计算分割后的基尼系数
    g_split = (left_n / (left_n + right_n)) * g_left + (right_n / (left_n + right_n)) * g_right
    print(f"Threshold: {threshold}, Split Gini: {g_split}")
# 分割
clf = DecisionTreeClassifier(criterion='gini', random_state=1234)
clf.fit(X_train, y_train)
# 预测
y_pred = clf.predict(X_test)
# 计算
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: {}".format(accuracy))

结果如下:

Threshold: 1.6555555555555554, Split Gini: 0.389937106918239
Threshold: 2.311111111111111, Split Gini: 0.3333333333333333
Threshold: 2.966666666666667, Split Gini: 0.3333333333333333
Threshold: 3.6222222222222222, Split Gini: 0.383485309017224
Threshold: 4.277777777777778, Split Gini: 0.4438118958666904
Threshold: 4.933333333333334, Split Gini: 0.40858416945373466
Threshold: 5.588888888888889, Split Gini: 0.5333333333333333
Threshold: 6.2444444444444445, Split Gini: 0.638888888888889
Threshold: 6.9, Split Gini: 0.6621923937360179
Accuracy: 1.0

不过,我们在使用时可以直接使用sklearn的基尼系数分类器,而不需要手动设置,并且效果也并不会差。sklearn使用基尼系数分类器的代码如下:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# 导入数据
iris = load_iris()
X = iris.data
y = iris.target
# 划分
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=42)
# 使用决策树分类器进行分割
clf = DecisionTreeClassifier(criterion='gini', random_state=1024)
clf.fit(X_train, y_train)
# 预测
y_pred = clf.predict(X_test)
# 计算
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: {}".format(accuracy))

我们将这个代码与开头所给出的代码进行比较,不难发现唯一的不同之处就是在分割上有所不同,即:

# 使用决策树分类器进行分割
clf = DecisionTreeClassifier(criterion='gini', random_state=1234)

这一行代码中多了参数criterion。 

我们还可以将基尼系数对于iris数据集的划分进行可视化,结果为:

三、 信息熵与信息增益

接下来,我们就要认识下信息熵与信息增益。

3.1 信息熵

信息熵是统计学的一个定义,用于表示一组数据的混乱程度与不确定性,在决策树中,其则用于展示一棵树的纯度。对于一个具有k个类别的数据集D,其信息熵H(D)为:

3.2 信息增益

信息增益是用于衡量某个数据集在分割后其不确定性与混乱程度减少了多少。它是决策树中选择分割特征的重要依据之一。对于特征A来说,其信息增益可以表示为:

3.3 举例

假如我们有一数据集如下,其有两个类比0与1。

我们计算信息熵会有:

计算信息增益会有:

3.4 实际代码

同样的,我们用实际的python代码来展示,代码如下:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=42)
# 使用决策树分类器进行分割
clf = DecisionTreeClassifier(criterion='entropy', random_state=1234)
clf.fit(X_train, y_train)
# 预测测试集的结果
y_pred = clf.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: {}".format(accuracy))

在决策树中,我往往只使用基尼系数与信息熵和信息增益之一来作为分类依据,而不会都使用。也同样的,我们要使用什么作为分类依据,我们就在criterion后填写什么,而不自行编写代码计算。

四、 多变量决策树

如果我们将每个属性看作坐标空间中的一个坐标轴,那么d个属性描述的样本就对应了d维空间的一个数据点,而对于样本的分类也就意味着在坐标空间中寻找不同类样本间的分类边界。在决策树中形成的分类边界会有一个明显的特征,就是轴平行,即它的分类边界由若干个与坐标轴平行的分段组成。但这样虽然对于最终的结果会有优秀的解释性,但复杂性也会很高,故而考虑采用斜的划分边界来对其进行简化。标题所说的“多变量决策树”就能实现。在这个多变量决策树中,我们不为每个非叶节点去寻找一个最优划分属性,而是试图建立一个合适的线性分类器。

还是用iris数据集来举例,首先是多变量的:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 加载数据集
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.3, random_state=42)
# 实例化
clf = DecisionTreeClassifier(criterion='gini', random_state=1234)
clf.fit(X_train, y_train)
# 预测
y_pred = clf.predict(X_test)
# 计算
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

# 生成分类报告
print("\nClassification Report:")
print(classification_report(y_test, y_pred))
# 生成混淆矩阵
print("\nConfusion Matrix:")
print(confusion_matrix(y_test, y_pred))

然后是单个特征的:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 加载数据集
iris = load_iris()
X = iris.data[:, [2]]  # 使用花瓣长度作为唯一特征
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', random_state=1234)
clf.fit(X_train, y_train)
# 预测
y_pred = clf.predict(X_test)
# 计算
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

# 生成分类报告
print("\nClassification Report:")
print(classification_report(y_test, y_pred))
# 生成混淆矩阵
print("\nConfusion Matrix:")
print(confusion_matrix(y_test, y_pred))

 其输出将分别是:

Accuracy: 1.00

Classification Report:
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        19
           1       1.00      1.00      1.00        13
           2       1.00      1.00      1.00        13

    accuracy                           1.00        45
   macro avg       1.00      1.00      1.00        45
weighted avg       1.00      1.00      1.00        45


Confusion Matrix:
[[19  0  0]
 [ 0 13  0]
 [ 0  0 13]]

Accuracy: 0.96

Classification Report:
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        19
           1       0.92      0.92      0.92        13
           2       0.92      0.92      0.92        13

    accuracy                           0.96        45
   macro avg       0.95      0.95      0.95        45
weighted avg       0.96      0.96      0.96        45


Confusion Matrix:
[[19  0  0]
 [ 0 12  1]
 [ 0  1 12]]

此上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2137661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Python 画图中同时设置中英文字体

前言 在使用matplotlib.pyplot画图时&#xff0c;默认情况下都是黑体字&#xff0c;很不美观。如果含有中文&#xff0c;可能无法显示&#xff1b;显示了中文之后英文字体就不能使用。本文针对这些问题逐一给出解决方案。 同时设置中英文字体 我们都知道&#xff0c;按照下面的…

00898 互联网软件应用与开发自考复习

资料来自互联网软件应用与开发大纲 南京航空航天大学 高纲4295和JSP 应用与开发技术(第 3 版) 马建红、李学相 清华大学出版社2019年 识记:要求考生能够识别和记忆本课程中有关互联网软件开发与应用的概念性内容,并能够根据考核的不同要求,做出正确的表述、选择和判断。领会…

合资油车断崖式崩盘,买车的千万慎重了

文 | AUTO芯球 作者 | 雷慢 合资车&#xff0c;燃油车全体大逃亡的时候来了&#xff0c; 你敢信吗&#xff0c;8月份&#xff0c;国内新能源汽车零售渗透率达到54%&#xff0c; 我给大家讲个冷笑话&#xff0c; 几个月前还有车企老总说什么&#xff0c; “只要传统车企一发…

linux 操作系统下的curl 命令介绍和使用案例

linux 操作系统下的curl 命令介绍和使用案例 1. curl 命令简介 curl 是一个利用 URL 规则在命令行下工作的文件传输工具。它支持文件的上传和下载&#xff0c;是综合传输工具&#xff0c;但传输的协议主要是 HTTP/HTTPS 和 FTP。curl 还支持很多种类型的服务器认证方式&#…

网络(三)——协议是什么???

文章目录 协议的概念结构化数据网络计算机服务端定制协议客户端代码 协议的概念 计算机之间的传输媒介是光信号和电信号。通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息。要想传递各种不同的信息&#xff0c;就需要约定好双方的数据格式。 结构化数据 我们知道TCP是面向…

Linux基础---07文件传输(网络和Win文件)

Linux文件传输地图如下&#xff0c;先选取你所需的场景&#xff0c;若你是需要Linux和Linux之间传输文件就查看SCP工具即可。 一.下载网站文件 前提是有网&#xff1a; 检查网络是否畅通命令&#xff1a;ping www.baidu.com&#xff0c;若有持续的返回值就说明网络畅通。Ctr…

请查收《网安问答秘籍》

在数字化日益普及的今天&#xff0c;网络安全威胁层出不穷&#xff0c;保护个人隐私和数据安全成为每个人的必修课。秘籍精选了最实用的网络安全问答&#xff0c;广大群众及时了解网络安全知识&#xff0c;提升网络安全意识&#xff0c;有效防范网络诈骗&#xff0c;确保个人信…

获取无人机经纬度是否在指定禁飞区内

1. 计算公式: (AB X AE ) * (CD X CE) >= 0 && (DA X DE ) * (BC X BE) >= 0 参考: 判断点是否在矩形框(多边形)内_qt opencv 判断一点是否在矩形内-CSDN博客 2.测试结果: 3.实现完整代码: #include<cstd

【系统规划与管理师】【案例分析】【考点】【答案篇】第7章 IT服务持续改进

【问题篇】☞【系统规划与管理师】【案例分析】【考点】【问题篇】第7章 IT服务持续改进 【移动端浏览】☞【系统规划与管理师】【案例分析】【模拟考题】章节考题汇总&#xff08;第7章&#xff09;&#xff08;答案篇&#xff09;&#xff08;共11个知识点&#xff09; 第7章…

在服务器上开Juypter Lab教程(远程访问)

在服务器上开Juypter Lab教程&#xff08;远程访问&#xff09; 文章目录 在服务器上开Juypter Lab教程&#xff08;远程访问&#xff09;一、安装anaconda1、安装anaconda2、提权限3、运行4、同意协议5、安装6、是否要自动初始化 conda7、结束8、检查 二、Anaconda安装Pytorch…

使用Docker挂载部署JAVA项目

用于需要使用Docker容器部署项目&#xff0c;但可能部署包需多次调整的场景&#xff0c;这种部署方式可以减少镜像制作的过程&#xff1b; 推荐几个使用Docker安装环境的文章&#xff1a; 1.Nocas: https://blog.csdn.net/weixin_44700323/article/details/140995859 2.Mysql: …

学习大数据DAY57 新的接口配置

作业  完成 API 接口和文件的接入, 并部署到生产调度平台, 每个任务最后至少 要有两条 不报错 的日志, 报错就驳回作业  作业不需要复制日志 API Appliation Program Interface 应用程序接口 > JSON 的地址 客户需求: 把 https://zhiyun.pub:9099/site/c-class…

从“看”到“管”:EasyCVR安防监控平台如何推动城市管理模式的转型升级

在21世纪的今天&#xff0c;随着城市化进程的加速推进&#xff0c;城市规模不断扩大&#xff0c;人口密集度显著增加&#xff0c;城市管理面临着前所未有的挑战。从公共安全、交通管理到环境保护、应急响应&#xff0c;每一个领域都对城市的治理能力和效率提出了更高要求。在这…

PowerShell install 一键部署Oracle23ai

Oracle23ai前言 Oracle Database 23ai Free 让您可以充分体验 Oracle Database 的能力,世界各地的企业都依赖它来处理关键任务工作负载。 Oracle Database Free 的资源限制为 2 个 CPU(前台进程)、2 GB 的 RAM 和 12 GB 的磁盘用户数据。该软件包不仅易于使用,还可轻松下载…

【LLM多模态】CogVideoX文生视频模型结构和训练过程

note 通过两阶段训练3D VAE&#xff0c;对视频进行压缩编码 第一阶段&#xff1a;在较低分辨率和较少帧数的视频上进行训练&#xff0c;学习压缩和重建视频的基本能力第二阶段&#xff1a;在更长的视频上训练&#xff0c;提高模型处理长视频的能力&#xff0c;同时保持帧与帧之…

JavaEE:文件内容操作练习(三)

文章目录 文件内容操作练习练习1练习2练习3 文件内容操作练习 练习1 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件. package javaEE.fileIO;import java.io.File; import java.util.Scanner;public class O {private…

数据结构基础讲解(八)——树和二叉树专项练习(上)

本文数据结构讲解参考书目&#xff1a; 通过网盘分享的文件&#xff1a;数据结构 C语言版.pdf 链接: https://pan.baidu.com/s/159y_QTbXqpMhNCNP_Fls9g?pwdze8e 提取码: ze8e 数据结构基础讲解&#xff08;七&#xff09;——数组和广义表专项练习-CSDN博客 个人主页&#x…

【初阶数据结构】详解树和二叉树(一) - 预备知识(我真的很想进步)

文章目录 前言1. 树1.1 树的概念1.2 树的相关概念1.3 树的表示1.4 树在实际中的运用 2. 二叉树2.1 二叉树的概念2.2 现实中的二叉树2.3 特殊的二叉树2.4 二叉树的性质2.5 二叉树概念和性质的一些习题 前言 初阶数据结构篇马上要迎来了一个新的成员&#xff0c;那就是"二叉…

这才是导师认可的论文 / 开题技术路线图

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 1. 技术路线图的常见框架结构 技术路线图根据研究内容和实验设计的不同&#xff0c;可以采用多种结构。以下是三种常见的技术路线图框架&#xff1a; 1.1 顺序式框架 适用领…

第十一周:机器学习笔记

第十一周周报 摘要Abstract机器学习1. 注意力机制&#xff08;下&#xff09;1.1 multi-head self-attention&#xff08;多头注意力机制&#xff09;1.2 Positional Encoding&#xff08;位置编码&#xff09;1.3 truncated self attention&#xff08;截断式注意力机制&#…