24/8/7算法笔记 决策树分类

news2024/9/21 2:37:37

决策树是一种常用的机器学习算法,用于分类和回归任务。它通过学习简单的决策规则从数据特征中推断出目标值。以下是决策树的一些关键特点:

  1. 树形结构:决策树由一系列的问题组成,每个问题对应一个特征和可能的取值。这些问题按照树状结构组织,从根节点到叶节点,形成决策路径。

  2. 特征选择:在每个节点上,决策树算法会选择一个特征和阈值,将数据集分割成尽可能纯净的子集。这通常基于某种标准,如信息增益、基尼不纯度或均方误差。

  3. 递归分割:决策树通过递归地分割数据集来构建。在每个节点上,算法选择最佳特征进行分割,然后对每个子集重复这个过程,直到满足停止条件。

  4. 停止条件:决策树的构建过程会在满足特定条件时停止,例如:

    • 达到预设的最大深度。
    • 所有数据点都属于同一类别。
    • 子集中的数据点数量小于某个阈值。
    • 没有更多的特征可以用来进一步分割数据。
  5. 分类和回归:决策树可以用于分类任务(预测离散标签)和回归任务(预测连续值)。

  6. 可解释性:决策树模型易于理解和解释,因为它们可以被可视化为一系列的问题和答案。

  7. 过拟合风险:决策树容易过拟合,特别是当树很深或训练数据中的噪声较多时。为了防止过拟合,可以采用剪枝技术,如预剪枝(设置最大深度或最小分割样本数)或后剪枝(构建完整的树然后回溯删除不必要的节点)。

  8. 集成方法:为了提高性能和鲁棒性,可以使用集成方法,如随机森林或梯度提升决策树,这些方法通过结合多个决策树的预测来提高整体性能。

  9. 处理缺失值:决策树算法可以处理具有缺失值的特征,因为它们可以在每个节点上为缺失值选择不同的分支。

  10. 特征重要性:决策树可以评估特征对预测结果的重要性,这有助于特征选择和数据理解。

import numpy as np
from sklearn.tree import DecisionTreeClassifier
加载数据
import pandas as pd
y = np.array(list('NYYYYYNYYN'))
print(y)
X = pd.DataFrame({'日志密度':list('sslmlmmlms'),
                  '好友密度':list('slmmmlsmss'),
                  '真实头像':list('NYYYYNYYYY')})
X

可以看见如果直接使用模型的化会报错

数据转换

#代码只执行一次
X['日志密度'] = X['日志密度'].map({'s': 0, 'm': 1, 'l': 2})
X['好友密度'] = X['好友密度'].map({'s':0,'m':1,'l':2})
X['真实头像'] = X['真实头像'].map({'N':0,'Y':1})
X

建模和预测
model = DecisionTreeClassifier(criterion = 'entropy')
model.fit(X,y)
model.score(X,y)

对上面的决策树进行可视化

from sklearn import tree
import matplotlib.pyplot as plt

plt.rcParams['font.family'] ='FangSong'#字体
plt.figure(figsize=(12,16))            #图像大小
fn = X.columns                         #将DataFrame X 的列名赋值给变量 fn。

_=tree.plot_tree(model,filled=True,feature_names=fn)          
plt.savefig('./决策树.png',dpi = 200)

手动计算决策树到底是如何实现分类的

p1 = (y =='N').mean()
p2 = (y =='Y').mean()
print(p1,p2)

p1 * np.log2(1/p1) +p2*np.log2(1/p2)

按照日志密度进行划分
X['真实用户'] = y
X

x = X['日志密度'].unique()
x.sort()#排序
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
    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)

#信息增益
0.881 - 0.6897

按照好友密度划分
x = X['好友密度'].unique()
x.sort()#排序
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)

#信息增益
0.881-0.324

按照是否使用真实头像划分
x = X['真实头像'].unique()
x.sort()#排序
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)

#信息增益
0.881-0.849

所以总结下来,看好友密度最能判断一个账户是否是真人

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

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

相关文章

orcad和allegro无法交互的解决方案

当Orcad和Allegro无法交互时&#xff0c;可能是由于多种原因导致的。以下是一些常见的解决方案&#xff0c;旨在帮助用户解决这一问题&#xff1a; 1. 检查并设置Enable Intertool Communication选项 首先&#xff0c;确保在Orcad Capture CIS中启用了“Enable Intertool Com…

ORM工具之SQLAlchemy

SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射&#xff08;ORM&#xff09;工具&#xff0c;使用MIT许可证发行。 SQLAlchemy“采用简单的Python语言&#xff0c;为高效和高性能的数据库访问设计&#xff0c;实现了完整的企业级持久模型”。SQL…

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection

这段代码中出现的异常 javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection 通常是因为客户端尝试通过非加密连接发起 HTTPS 请求&#xff0c;而服务器期望的是加密的 SSL/TLS 连接。 这个异常可能是因为以下几种情况之一&#xff1a; HTTPS 服务配置…

Element-Plus组件Tree树形控件时,传输失去父节点和回显父节点下的子节点全选问题解决

使用环境 Vue 3 in Vite Element-Plus JS语法&#xff08;非TS&#xff09; 问题描述&#xff1a; 在使用Element-Plus组件Tree树形控件时&#xff0c;会出现如下问题&#xff1a; 1、子节点未全选时&#xff0c;往后端传输的选中节点没有包含父节点。 如下图&#xff0c;…

学习大数据DAY33 Flask 库 API 开发介绍,OS 库,pandas 库和简单爬虫

目录 Python API 接口开发用法介绍 Postman 调试接口 OS 库 pandas Pandas 数据结构 - Series Pandas 处理数据方法 Pandas CSV 文件 Pandas JSON Pandas excel 文件 上机练习 11 爬虫 爬取所有数据 pandas 分析处理数据 导入到 mysql 上机练习 12---使用爬虫pan…

Ubuntu 24.04 LTS安装elasticsearch-8.14.3+Kibana

1.安装Elasticsearch 1.1 下载Elasticsearch # 1. 更新包索引 sudo apt update# 2. 升级已安装的软件包 sudo apt upgrade -y# 3. 进入 /opt 目录 cd /opt# 4. 下载Elasticsearch压缩包 sudo wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.…

国产化飞腾D2000独显可插拔式OPS电脑主板,应用于信创教育、信创会议、信创办公等领域

国产化飞腾D2000 主板规格书 产品概述 XM-F611是我司自主研发设计的一款独显可插拔式OPS电脑主板&#xff0c;符合Intel OPS(Open Pluggable Specification)标准规范。采用飞腾腾锐D2000八核处理器加国产独立显卡&#xff0c;搭配国产银河麒麟或统信操作系统&#xff0c;能够…

sparkhive--练习2

需求&#xff1a; 在hive中创建对应表&#xff0c;并且导入数据&#xff0c;使用spark完成对应的查询 stu_name course score 张三 语文 98 张三 数学 95 张三 英语 89 李四 语文 97 李四 数学…

【天数计算】输入某年某月某日,判断这一天是这一年的第几天

要求&#xff1a;输入某年某月某日&#xff0c;判断这一天是这一年的第几天&#xff0c;使用C语言实现 #include<stdio.h>int dayYear(int year,int month,int day){int days_in_month[] {0,31,28,31,30,31,30,31,31,30,31,30,31};int i,days0;for(i1;i<month;i){da…

分类预测|基于粒子群优化核极限学习机的Adaboost集成模型数据分类预测Matlab程序 PSO-KELM-Adaboost

分类预测|基于粒子群优化核极限学习机的Adaboost集成模型数据分类预测Matlab程序 PSO-KELM-Adaboost 文章目录 前言分类预测|基于粒子群优化核极限学习机的Adaboost集成模型数据分类预测Matlab程序 PSO-KELM-Adaboost 一、PSO-KELM-Adaboost模型1. 核化极限学习机 (KELM)2. 粒子…

5G边缘计算网关应用

在信息技术浪潮的推动下&#xff0c;5G网络与边缘计算的结合正快速地推动着人们步入一个前所未有的智能生活新纪元。5G边缘计算网关作为两者融合的重要枢纽&#xff0c;其应用领域的拓展和优势表现越来越受到企业和行业的重视。      5G边缘计算网关的技术背景   5G网络为…

WEB应用(十三)---RCE

什么是RCE&#xff1f; Remote Command/Code Execute&#xff0c;远程命令或代码执行。通过构造特殊的字符串&#xff0c;将数据提交至Web应用程序&#xff0c;并利用该方式执行外部程序或系统命令实施攻击&#xff0c;类似于SQL注入。 Web应用程序使用了一些可以执行系统命令或…

多变量时间序列生成模型GAN介绍与实现

目录 1. 模型介绍2. 问题提出3. 模型具体实现3.1 数据预处理3.2 生成对抗网络&#xff08;GAN&#xff09;结构3.3 模式崩溃解决3.4 合成数据验证 4. 代码实现参考文献 1. 模型介绍 在大数据时代&#xff0c;生成逼真的时间序列数据对于负载平衡、负载预测和智能资源配置等方面…

openwrt 性能工具perf和cpu占用查看工具sysstat编译及使用

代码使用的lean源码&#xff0c;只需要用make menuconfig打开perf对应的编译选项即可 1.第一步选择Global build settings 2.第二步选择Kernel build options 3.第三步选择Enable kernel cgroups 4.第四步选择Enable perf_event per-cpu per-container group (cgroup) monitor…

计算机网络-CSP初赛知识点整理

历年真题 [2016-NOIP-普及-第3题] 以下不属于无线通信技术的是( ) A. 蓝牙 B. Wifi C. GPRS D. 以太网 [2015-NOIP-普及-第10题] FTP 可以用于( )。 A. 远程传输文件 B. 发送电子邮件 C. 浏览网页 D. 网上聊天 [2019-CSP-J-第1题] 中国的国家顶级域名是( ). A. .cn B. .ch C.…

国内自闭症学校指南:了解孩子的康复需求和解决方案

在国内&#xff0c;自闭症儿童的数量逐年增加&#xff0c;为他们提供专业的教育和康复支持变得至关重要。对于家长来说&#xff0c;选择一所合适的自闭症学校是帮助孩子走向康复的关键一步。在众多的选择中&#xff0c;星贝育园以其独特的优势和全面的服务脱颖而出。 当孩子被诊…

android系统中data下的xml乱码无法查看问题剖析及解决方法

背景&#xff1a; Android12高版本以后系统生成的很多data路径下的xml都变成了二进制类型&#xff0c;根本没办法看xml的内容具体如下&#xff1a; 比如想要看当前系统的widget的相关数据 ./system/users/0/appwidgets.xml 以前老版本都是可以直接看的&#xff0c;这些syste…

Cxx primer-chap13-Copy Control

copy控制涉及类的五个成员函数&#xff1a;&#xff0c;这五个成员函数被显式或隐式的被调用&#xff0c;各司其职&#xff1a;我们必须根据类的实际情况来确定是否需要显式定义这些成员函数&#xff1a;什么是拷贝构造函数呢&#xff1f;简单讲就是该函数的第一个形参是refere…

malloc函数与free函数

目录 开头1.怎样把数组初始化时的项数变成变量?malloc函数free函数 2.malloc函数与free函数的实际运用CC6 牛牛的排序随机乱码打印随机数组打印 结尾 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们来学一下如何把数组初始化时的项数变成变量的一些知识。 1.怎…

【书生大模型实战营第三期 | 入门岛第3关-Git 基础知识】

学习Git版本控制系统心得体会 摘要 通过参与InternLM Git教程&#xff0c;我对Git这一开源的分布式版本控制系统有了更深入的理解和实践。Git以其高效的团队协作能力、详尽的代码历史记录以及灵活的分支管理功能&#xff0c;成为软件开发中不可或缺的工具。 文章大纲 Git简介…