决策树算法中篇

news2025/1/11 22:56:44

手动计算实现决策树分类

 

数据整合

X['真实用户'] = y
X

 

计算未划分信息熵  

s = X['真实用户']
p = s.value_counts()/s.size
(p * np.log2(1/p)).sum()

 

按照日志密度进行划分

x = X['日志密度'].unique()
x.sort()
# 如何划分呢,分成两部分
for i in range(len(x) - 1):
    split = x[i:i+2].mean()
    cond = X['日志密度'] <= split
    # 概率分布
    p = cond.value_counts()/cond.size
    # 按照条件划分,两边的概率分布情况
    indexs =p.index
    entropy = 0
    for index in indexs:
        user = X[cond == index]['真实用户']
        p_user = user.value_counts()/user.size
        entropy += (p_user * np.log2(1/p_user)).sum() * p[index]
    print(split,entropy)

 

按照好友密度进行划分

x = X['好友密度'].unique()
x.sort() # 排序,属性值,0,1,2
print(x)
for i in range(len(x) -2):
    split = x[i : i +2].mean() # 裂分值
    cond = X['好友密度'] <= split # 分成两边,每一边分别计算信息熵
    
    # 计算概率分布,左边概率是多少,右边的概率是多少
    p = cond.value_counts()/cond.size
    
    indexs = p.index # True,False
    
    entropy = 0
    for index in indexs:
        user = X[cond == index]['真实用户'] # 取出了目标值y的数据
        
        p_user = user.value_counts()/user.size
        # 每个分支的信息熵
        e = (p_user * np.log2(1/p_user)).sum() * p[index]
        entropy += e
        print('------------',p[index],(p_user * np.log2(1/p_user)).sum())
#     print(split,entropy)

 

 按照是否使用真实头像划分

x = X['真实头像'].unique()
x.sort() # 排序,属性值,0,1,2
print(x)
for i in range(len(x) -1):
    split = x[i : i +2].mean() # 裂分值
    cond = X['真实头像'] <= split # 分成两边,每一边分别计算信息熵
    
    # 计算概率分布,左边概率是多少,右边的概率是多少
    p = cond.value_counts()/cond.size
    
    indexs = p.index # True,False
    
    entropy = 0
    for index in indexs:
        user = X[cond == index]['真实用户'] # 取出了目标值y的数据
        
        p_user = user.value_counts()/user.size
        # 每个分支的信息熵
        entropy += (p_user * np.log2(1/p_user)).sum() * p[index]
    print(split,entropy)

 

筛选最佳划分条件

 

columns = ['日志密度','好友密度','真实头像']
lower_entropy = 1
condition = {}
for col in columns:
    x = X[col].unique()
    x.sort()
    print(x)
    # 如何划分呢,分成两部分
    for i in range(len(x) - 1):
        split = x[i:i+2].mean()
        cond = X[col] <= split
        # 概率分布
        p = cond.value_counts()/cond.size
        # 按照条件划分,两边的概率分布情况
        indexs =p.index
        entropy = 0
        for index in indexs:
            user = X[cond == index]['真实用户']
            p_user = user.value_counts()/user.size
            entropy += (p_user * np.log2(1/p_user)).sum() * p[index]
        print(col,split,entropy)
        if entropy < lower_entropy:
            condition.clear()
            lower_entropy = entropy
            condition[col] = split
print('最佳列分条件是:',condition)

 

进一步列分

cond = X['好友密度'] < 0.5
X_ = X[cond]
columns = ['日志密度','真实头像']
lower_entropy = 1
condition = {}
for col in columns:
    x = X_[col].unique()
    x.sort()
    print(x)
    # 如何划分呢,分成两部分
    for i in range(len(x) - 1):
        split = x[i:i+2].mean()
        cond = X_[col] <= split
        # 概率分布
        p = cond.value_counts()/cond.size
        # 按照条件划分,两边的概率分布情况
        indexs =p.index
        entropy = 0
        for index in indexs:
            user = X_[cond == index]['真实用户']
            p_user = user.value_counts()/user.size
            entropy += (p_user * np.log2(1/p_user)).sum() * p[index]
        print(col,split,entropy)
        if entropy < lower_entropy:
            condition.clear()
            lower_entropy = entropy
            condition[col] = split
print('最佳列分条件是:',condition)

 

决策树分裂指标

        常用的分裂条件时:

  •                         信息增益
  •                         Gini系数
  •                         MSE(回归问题)
  •                         信息增益率

 

3.1、信息熵(ID3)

在信息论里熵叫作信息量,即熵是对不确定性的度量。从控制论的角度来看,应叫不确定性。信息论的创始人香农在其著作《通信的数学理论》中提出了建立在概率统计模型上的信息度量。他把信息定义为“用来消除不确定性的东西”。在信息世界,熵越高,则能传输越多的信息,熵越低,则意味着传输的信息越少。还是举例说明,假设 Dammi 在买衣服的时候有颜色,尺寸,款式以及设计年份四种要求,而 Sara 只有颜色和尺寸的要求,那么在购买衣服这个层面上 Dammi 由于选择更多因而不确定性因素更大,最终 Dammi所获取的信息更多,也就是熵更大。所以信息量=熵=不确定性,通俗易懂。在叙述决策树时我们用熵表示不纯度(Impurity)。

对应公式如下:

 

 

熵的变化越大,说明划分越纯,信息增益越大~

 

3.2、Gini系数(CART)

基尼系数是指国际上通用的、用以衡量一个国家或地区居民收入差距的常用指标。

基尼系数最大为“1”,最小等于“0”。基尼系数越接近 0 表明收入分配越是趋向平等。国际惯例把 0.2 以下视为收入绝对平均,0.2-0.3 视为收入比较平均;0.3-0.4 视为收入相对合理;0.4-0.5 视为收入差距较大,当基尼系数达到 0.5 以上时,则表示收入悬殊。

基尼系数的实际数值只能介于 0~1 之间,基尼系数越小收入分配越平均,基尼系数越大收入分配越不平均。国际上通常把 0.4 作为贫富差距的警戒线,大于这一数值容易出现社会动荡。

Gini 系数越小,代表集合中的数据越纯,所有我们可以计算分裂前的值在按照某个维度对数据集进行划分,然后可以去计算多个节点的 Gini 系数。

对应公式如下:

 

在对数据进行分类是gini系数的变化越大,说明划分越纯,效果越好~

3.3、信息增益率

大学期末的数学考试只有单选题。对于一个完全没有学习过的学生。该如何过关呢?

4个选项是正确选项的概率都是1/4。那么单项选择题的答案的熵就是:

在学霸圈做单项选择题有一个秘籍:三长一短选最短,三短一长选最长。姑且假设学霸的秘籍一般都是正确的。

如果在某场考试中,有10%的单项选题是三长一短,10%的选题是三短一长。计算该考试单项选题的关于长短题的条件熵:

计算条件熵(条件就是:题目不同类型)

 

 那么信息增益是:

 

信息增益率在信息增益的基础上增加了惩罚项,惩罚项是特征的固有值。

写作 gr(X,Y)。定义为信息增益除以特征的固有值,如下:

 

计算上面单选题题目长短案例的信息增益率:  

 对于取值多的属性,尤其一些连续型数值,这个单独的属性就可以划分所有的样本,使得所有分支下的样本集合都是“纯的”(最极端的情况是每个叶子节点只有一个样本)。 一个属性的信息增益越大,表明属性对样本的熵减少的能力更强,这个属性使得数据由不确定性变成确定性的能力越强。 所以如果是取值更多的属性,更容易使得数据更“纯”(尤其是连续型数值),其信息增益更大,决策树会首先挑选这个属性作为树的顶点。结果训练出来的形状是一棵庞大且深度很浅的树,这样的划分是极为不合理的。 

C4.5使用了信息增益率,在信息增益的基础上除了一项split information,来惩罚值更多的属性。从而使划分更加合理!

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

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

相关文章

【目标检测论文必备】通俗易懂地讲解用绿色、蓝色、红色框可视化描述YOLO模型权重对于单个图片的训练效果(TP、FP、FN)

可视化步骤 一、生成自定义权重对图片的预测类别坐标信息二、创建需要预测的文件夹三、可视化运行 一、生成自定义权重对图片的预测类别坐标信息 新建脚本文件/path/to/your/ultralytics/savetxt.py放入对应参数运行会得到一个个独立的/path/to/your/runs/detect/output/outpu…

移动技术开发:简单计算器界面

1 实验名称 简单计算器界面 2实验目的 掌握基本布局管理器的使用方法和基本控件的使用方法&#xff0c;以及事件监听处理的使用方法 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:and…

2024年港澳台华侨生联考分数线继续更新来啦

导读 在最近的一系列分享中&#xff0c;我们和大家一同分享了2024年港澳台华侨生联考的分数线。今天我们继续和大家一起分享一些2024年港澳台联考的高校录取分数线吧&#xff01; 首都师范大学 首都师范大学和首都医科大学作为被低估的两所高校&#xff0c;这两年的分数线也是…

web基础—dvwa靶场(十)XSS

XSS(DOM) 跨站点脚本&#xff08;XSS&#xff09;攻击是一种注入攻击&#xff0c;恶意脚本会被注入到可信的网站中。当攻击者使用 web 应用程序将恶意代码&#xff08;通常以浏览器端脚本的形式&#xff09;发送给其他最终用户时&#xff0c;就会发生 XSS 攻击。允许这些攻击成…

Linux ubuntu debian系统安装UFW防火墙图形化工具GUFW

GUFW是UFW的图形化前端&#xff0c;可以通过以下命令安装&#xff1a; sudo apt install gufw安装成功后&#xff0c;可以通过应用程序菜单启动GUFW&#xff0c;在图形界面中&#xff0c;可以方便地添加、修改和删除规则&#xff0c;查看状态和日志。

【数据结构取经之路】图解红黑树

目录 前言 红黑树的概念 红黑树的性质 红黑树结点的定义 左右旋动图 红黑树的插入分析 红黑树的插入代码 红黑树与AVL-tree比较 红黑树的应用场景 前言 AVL-tree之外&#xff0c;另一个颇具历史且被广泛使用的平衡二叉搜索树是红黑树(RB-tree)&#xff0c;这名字听起来…

码头童话,“丈量”行业数智化转型

作者 | 曾响铃 文 | 响铃说 一箱车厘子从地球正对的另一边远渡重洋来到中国&#xff0c;而一旦到达&#xff0c;5个小时内它就能变成北京、天津、河北、河南等区域老百姓果盘里的美味。 这一幕&#xff0c;来自央视联合华为制作发布的《新智中国说-谈智一会间》第一期“码头…

PHP邮件发送教程:如何用PHP发送电子邮件?

php邮件怎么实现发送电子邮件&#xff1f;php怎么给邮箱发邮件&#xff1f; PHP作为一种广泛使用的服务器端脚本语言&#xff0c;提供了多种方法来实现电子邮件的发送。AokSend将详细介绍如何使用PHP邮件功能来发送电子邮件&#xff0c;帮助开发者轻松实现这一重要功能。 PHP…

30道常见的软件测试面试题(含答案+文档)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、什么项目适合做自动化测试&#xff1f; 关键字&#xff1a;不变的、重复的、规范的 1&#xff09;任务测试明确&#xff0c;需求不会频繁变动 2&#xff09;项…

vulnhub靶场 DC-3

地址: https://download.vulnhub.com/dc/DC-3-2.zip 开启NAT模式 namp只扫到了一个端口 打开网页有一个登录的页面 目录扫描一下,可以找到一个 后台登录界面 看一下指纹信息 joomla cms 网上搜一下可以发现存在一个JoomScan工具 在kali上面安装一下 apt install joomscan …

4. 密码协议

4. 密码协议 (1) 协议的基本概念 协议是一种在两个或多个参与者之间进行通信的规范,它定义了参与者之间的交互方式、消息格式和通信过程。协议的目的是确保通信的可靠性和安全性,防止信息被篡改、伪造或泄露。 (2) 密码协议分类及基本密码协议 密码协议是用于加密和解密数…

【Python报错已解决】ModuleNotFoundError: No module named ‘tensorflow‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

浅谈“流量回放”

一、流量回放定义 “流量回放”通常指的是将之前记录的网络请求和响应数据重新发送到系统中&#xff0c;以模拟真实用户的操作。这种技术主要用于测试和调试目的&#xff0c;帮助开发人员和测试人员更好地理解系统在特定条件下的行为。 二、流量回放的技术原理&#xff1a; 数…

前端动画库大比拼:为何选择Velocity.js

前端动画库大比拼&#xff1a;为何选择Velocity.js 前言 在现代网页设计中&#xff0c;动画效果是提升用户体验的重要手段。 Velocity.js: 一个与 jQuery 动画 API 兼容的动画引擎&#xff0c;以其卓越的性能和丰富的功能&#xff0c;成为了开发者的好工具。 本文将详细介绍…

大数据Flink(一百二十二):阿里云Flink MySQL连接器介绍

文章目录 阿里云Flink MySQL连接器介绍 一、特色功能 二、​​​​​​​语法结构 三、​​​​​​​​​​​​​​WITH参数 阿里云Flink MySQL连接器介绍 阿里云提供了MySQL连接器&#xff0c;其作为源表时&#xff0c;扮演的就是flink cdc的角色。 一、特色功能 MySQ…

【Qt笔记】QToolBox控件详解

目录 引言 一、QToolBox的基本功能 1.1 分页布局 1.2 可点击标签 1.3 图标支持 1.4 信号与槽 二、 QToolBox的属性设置 2.1 设置指定索引位置可用性 2.2 设置指定索引位置图标 2.3 设置标题 2.4 设置提示信息 2.5 获取信息 三、QToolBox的常用API 3.1 构造函数…

前端vue-单选按钮的实现

要把name“sex”和value"男" 和 要把name“sex”和value"女"写上&#xff0c;然后在各自的标签内部写上v-model绑定属性。data中定义v-model的绑定值&#xff0c;后面的值是默认选中的男或者女性。

Google Play金融类应用上了又被下,怎么搞定设备短信权限问题?

不久前谷歌对金融类产品应用更新了政策要求&#xff0c;即8月31日起新注册的开发者账号必须得注册为企业账号才可以上架金融类产品应用&#xff0c;这对原本就是用企业号的开发团队或公司没什么影响&#xff0c;但如果用的是个人号得做点准备了。 可以看出&#xff0c;谷歌对金…

剑灵服务端源码(c#版本+数据库+配套客户端+服务端)

剑灵服务端源码&#xff0c;喜欢的下载研究研究。谁技术牛B的话&#xff0c;能把最新版本的客户端接上&#xff0c;就好了。 剑灵服务端源码&#xff08;c#版本数据库配套客户端服务端&#xff09; 下载地址&#xff1a; 通过网盘分享的文件&#xff1a;【源码】剑灵服务端源码…

利士策分享,自我和解:通往赚钱与内心富足的和谐之道

利士策分享&#xff0c;自我和解&#xff1a;通往赚钱与内心富足的和谐之道 在这个快节奏、高压力的时代&#xff0c;我们往往在追求物质财富的同时&#xff0c;忽略了内心世界的和谐与平衡。 赚钱&#xff0c;作为现代生活中不可或缺的一部分&#xff0c;它不仅仅是生存的手段…