决策树(离散数据)的python实现

机器学习算法之:决策树 (decision trees) > By joey周琦 概述 线性模型一般variance小,bias大;而树模型一般variance大,bias小 决策树的优点:具有可读性,分类速度快 一般包含三个步骤: 特征选择 决策树生成 剪枝 决策树定义:分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点(node)和有向边(directed edge)组成。结点分为内部结点和叶结点,内部结点表示一个特征(feature), 阅读详情

决策树(离散数据)的python实现

1.计算熵和信息增益率等,来确定按特征进行分类的顺序
2.利用多重字典一层一层建立决策树

熵:Ent(D)=−∑pi*log(pi)
条件熵:条件熵𝐻(X|Y)相当于联合熵𝐻(𝑋,𝑌)减去单独的熵𝐻(Y),即:𝐻(X|Y)=𝐻(𝑋,𝑌)−𝐻(Y)
信息增益率:信息增益/分裂信息度量

1.创建特征和分类数据
## 矩阵、列表皆可
dataSet = [[ 1. ,  2.1],
        [ 2. ,  1.1],
        [ 1.3,  1. ],
        [ 1. ,  1. ],
        [ 2. ,  1. ]]
classSet = ["a", "a", "b", "b", "a"]
# dataSet = mat([[ 1. ,  2.1],[ 2. ,  1.1],[ 1.3,  1. ],[ 1. ,  1. ],[ 2. ,  1. ]])
# classSet = mat(["a", "a", "b", "b", "a"])
2.计算信息熵
from numpy import *
def entropy(dataSet,classSet):
    ## 信息熵
    ## 输入特征和分类 并一律转化为矩阵
    dataSet=mat(dataSet)
    classSet=mat(classSet)
    classSet=asarray(classSet).tolist() ## 分类矩阵转化为列表
    numfeature= len(dataSet)  ## 特征数:5
    classCounts = {}
    for class0 in classSet[0]:
        if  class0  not in classCounts.keys():
            classCounts[class0] = 0
        classCounts[class0] += 1      # 每类个数, {'Y': 4, 'N': 3}
    entropy = 0.0
    for key in classCounts:
        prob = float(classCounts[key])/numfeature
        entropy -= prob * log2(prob)
    return entropy

entropy(dataSet,classSet)
##  -(2/5)*log2(2/5)-(3/5)*log2(3/5)=0.9709505944546686

熵为:0.9709505944546686

3.计算条件熵
def splitDataSet(dataSet,classSet, axis, value):
	## 每类特征分别按特征值进行聚类
    a=asarray(mat(dataSet).T).tolist()
    classSet=asarray(mat(classSet)).tolist()[0]
    a.append(list(classSet))
    a=mat(a).T
    dataSet=asarray(a).tolist()
    retDataSet = []
    for featVec in dataSet:
        ## 按各特征进行聚类,
        ## 如[[1,2,a],[1,3,a],[2,3,c]] 前两列特征,后一列分类
        ## 聚类后[[2,a],[3,a]]和[[3,c]] 
        if str(featVec[axis]) == str(value):
            reduceFeatVec = featVec[:axis]              
            reduceFeatVec.extend(featVec[axis+1:])
            retDataSet.append(reduceFeatVec)   
#         print(retDataSet)
    return retDataSet

def conditional_entropy(dataSet,classSet):
	## 条件熵
    dataSet=asarray(dataSet).tolist()
    dataSet=mat(dataSet);
    numFeatures = len(dataSet[0])                 #特征个数
    conditional_entlist=[]
    entropylist=[]
    for i,features in enumerate(np.asarray(dataSet.T).tolist()):   
        uniqueVals = set(features)                      # 每组特征值去重     
        entropy1 = 0.0
        conditional_entropy = 0.0
        for value in uniqueVals:
            subDataSet = splitDataSet(dataSet,classSet, i, value)  #每个唯一值对应的剩余feature的组成子集
            prob = len(subDataSet)/float(len(dataSet))
            conditional_entropy += prob * entropy(mat(subDataSet)[:,:-1],mat(subDataSet)[:,-1].T)
            entropy1 += -prob * log2(prob)
        conditional_entlist.append(conditional_entropy)
        entropylist.append(entropy1)
    return conditional_entlist,entropylist
    
conditional_entropy(dataSet,classSet)
## 条件熵:2/5*(-(1/2)*log2(1/2)-(1/2)*log2(1/2))+2/5*(-(1)*log2(1)-(0)*log2(0))+1/5*(-(1)*log2(1)-(0)*log2(0))=0.4
## 分裂信息度量:-(2/5)*log2(2/5)-(2/5)*log2(2/5)-(1/5)*log2(1/5)=1.5219280948873621

条件熵、分裂信息度量为:([0.4, 0.5509775004326937], [1.5219280948873621, 1.3709505944546687])

4.计算信息增益和信息增益率
def information_gain(dataSet,classSet):
    ### 信息增益和信息增益率 返回信息增益率最大的特征
#     entropy=entropy(dataSet,classSet)
    maxInf_gainRatio=0
    entropy0=entropy(dataSet,classSet)
    conditional_entlist,entropylist=conditional_entropy(dataSet,classSet)
    information_gain=entropy0-conditional_entlist
    print("信息增益:",information_gain)
    print("信息增益率:")
    for i in range(len(entropylist)):
        
        if ( entropylist[i]== 0): # fix the overflow bug
            continue
        Inf_gainRatio = information_gain[i] / entropylist[i]
        print(Inf_gainRatio)
        #这个feature的infoGainRatio      
        if (Inf_gainRatio > maxInf_gainRatio):          #选择最大的gain ratio
            maxInf_gainRatio = Inf_gainRatio
            bestFeature = i
    return(bestFeature)
    
information_gain(dataSet,classSet)

信息增益:[0.57095059 0.41997309]
信息增益率:0.37514952012034747 、 0.30633714717416943
返回的信息增益率最好的特征是第0个

5.创建树(多重字典)
def createTree(dataSet, feat_name):
    dataSet = asarray(mat(dataSet)).tolist() 
    classList = [example[-1] for example in dataSet]    
    if classList.count(classList[0]) == len(classList):       # 类别完全相同,停止划分,返回其类别
        return classList[0]                             
    if len(dataSet[0]) == 0:                                # 遍历完所有特征时返回"End of the classification
        return "End of the classification"
    bestfeat = information_gain(mat(dataSet)[:,:-1],mat(dataSet)[:,-1].T)             # 信息增益率最大的特征位置 0-->1 
  
    bestfeat_name = feat_name[bestfeat]                         # 信息增益率最大的特征名
    dm_tree = {bestfeat_name:{}}                              # 多重字典构建树    {'t1': {'1.0': {'t2': {'1.0': 'b', '2.1': 'a'}}, '1.3': 'b', '2.0': 'a'}}
    del(feat_name[bestfeat])                                      
    feat_data = [featdata[bestfeat] for featdata in dataSet]      ## ['1.0', '2.0', '1.3', '1.0', '2.0']
    feat_set = set(feat_data)                                      ## {'1.0', '1.3', '2.0'}   
    for value in feat_set:
        featname = feat_name[:]                                
        dm_tree[bestfeat_name][value] = createTree(splitDataSet(mat(dataSet)[:,:-1],mat(dataSet)[:,-1].T, bestfeat, value), featname)
    return dm_tree

c = hstack((mat(dataSet),mat(classSet).T))  ## 合并特征和分类矩阵
o=createTree(c,["t1","t2"])                 ## 决策树字典
drawtree.createPlot(o)                      ## 绘制决策树,drawtree:绘制树的自定义模块

决策树如下:

6.利用树进行分类
def treeclass(dm_tree,t_data,feat_name):
    for i in range(len(t_data)):
        try:
            key1=[key1 for key1 in dm_tree[feat_name[i]].keys()]
            print(key1)
        except:
            pass
        else:   
            if str(t_data[i]) in key1:
                tree2=dm_tree[feat_name[i]]
                print(tree2)
                if str(type(tree2[str(t_data[i])])) == "<class 'dict'>":
                    a=t_data.pop(i)
                    feat_name.pop(i)
                    print(t_data,tree2[str(a)],feat_name)
                    treeclass(tree2[str(a)],t_data,feat_name)
                else:
                    print(tree2[str(t_data[i])])
                    return tree2[str(t_data[i])]
机器学习之决策树算法(六)以西瓜数据集的离散特征和连续特征为例编写分类树 以西瓜数据集的离散特征和连续特征为例编写分类树 阅读详情

相关推荐

机器学习笔记(5)——C4.5决策树中的连续值处理和Python实现

在ID3决策树算法中,我们实现了基于离散属性的决策树构造。C4.5决策树在划分属性选择、连续值、缺失值、剪枝等几方面做了改进,内容较多,今天我们专门讨论连续值的处理和Python实现。 1. 连续属性离散化 C4.5算法中策略是采用二分法将连续属性离散化处理:假定样本集D的连续属性有n个不同的取值,对这些值从小到大排序,得到属性值的集合。把区间的中位点作为候选划分点,于是得到包含n-1个...

小赵的博客 2万+

python绘制决策树

【代码】python绘制决策树。

123 1605

CART决策树算法的Python实现(注释详细)

一、CART决策树算法简介 CART(Classification And Regression Trees 分类回归树)算法是一种树构建算法,既可以用于分类任务,又可以用于回归。相比于 ID3 和 C4.5 只能用于离散型数据且只能用于分类任务,CART 算法的适用面要广得多,既可用于离散型数据,又可以处理连续型数据,并且分类和回归任务都能处理。 本文仅讨论基本的CART分类决策树构建,不讨论回归树和剪枝等问题。 首先,我们要明确以下几点: 1. CART算法是二分类常用的方法,由CART算法生成的决策树

Polaris的博客 1万+

决策树算法python实现

初学者在学习决策树过程中的记录,本文为代码编写内容,相关理论知识可见我的西瓜书决策树学习

qq_46033892的博客 9114

Python库 | dm_tree-0.1.5-cp35-cp35m-win_amd64.whl

python库,解压后可用。 资源全名:dm_tree-0.1.5-cp35-cp35m-win_amd64.whl

论文学习:Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline

title: “Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline” tags: [“论文评述”, “报告”] date: 2019-08-22 author: 叶慧 mathjax: true 论文:Towards Automated Infograph...

xiaoyehahaha的博客 731

机器学习 决策树篇——解决离散变量的分类问题

机器学习 决策树篇——解决离散变量的分类问题摘要熵增益和熵增益率计算熵增益和熵增益率运行结果离散变量的决策树模型决策树模型运行结果 摘要 本文通过python实现了熵增益和熵增益率的计算、实现了离散变量的决策树模型,并将代码进行了封装,方便读者调用。 熵增益和熵增益率计算 此对象用于计算离散变量的熵、条件熵、熵增益(互信息)和熵增益率 .cal_entropy():计算熵的函数 .cal_conditional_entropy():计算条件熵的函数 .cal_entropy_gain():计算熵增益(互信息

Cyrus_May的博客 5287

wsl + vscode 离线配置 ERROR: Faild to download https://update.code.visualstudio.com

很多情况下是没有现成的VS Code Server程序的,需要手动下载。记住上面的Commit ID,可以通过下面的链接下载 vscode-server-linux-x64.tar.gz。然后将vscode-server-linux-x64.tar.gz上传在服务器上的$HOME/.vscode-server/bin文件夹中,解压。在wsl中下载不了 vscode 的核心。运行下面两行命令,建立空的$HOME/.vscode-server/bin文件夹。重新运行 wsl与vs的链接即可。

点云算法工程师 3790

决策树分箱-特征工程之数据离散化处理-基于python实现

公众号「python风控模型」里回复关键字:学习资料,免费领取。 python风控模型 持牌照金融公司模型专家,教学主页 https://ke.qq.com/teacher/231469242?tuin=dcbf0ba

fulk6667g78o8的专栏 3206

从零到一:用MSC Nastran Patran搞定悬臂翼颤振分析(附完整模型文件)

本文详细介绍了使用MSC Nastran和Patran进行悬臂翼颤振分析的完整流程,从几何建模、网格划分到模态分析和颤振求解。通过具体案例讲解关键参数设置和操作技巧,帮助工程师掌握气动弹性分析的核心方法,并附赠完整模型文件供实践参考。

weixin_42563415的博客 440

测站坐标系统 -- 东北天(ENU)坐标系、站心坐标系

测站坐标系统以观测站(或地面上某一个观测点为中心建立坐标系统,将这类坐标系称为测站坐标系统。测站坐标系通常以用户所在的位置点P为坐标原点三个坐标轴分别是相互垂直的东向北向和天向,因而测站坐标系又称为东北天(ENU)坐标系。由于测站坐标系以站心为坐标原点,因此也称为站心坐标系。如图所示,测站坐标系的天向与大地坐标系(LLA经纬度坐标系)在此点的高程方向一致。测站坐标系固定在地球上,本质上是一种地固坐标系。(1)以站心为坐标原点。(2)Z轴与站心点的椭球法线重合,向上为正。

qq_43381998的博客 1万+

Python实现——决策树实例(离散数据/香农熵)

决策树的实现太...繁琐了。 如果只是接受他的原理的话还好说,但是要想用代码去实现比较糟心,目前运用了《机器学习实战》的代码手打了一遍,决定在这里一点点摸索一下该工程。 实例的代码在使用上运用了香农熵,并且都是来处理离散数据的,因此有一些局限性,但是对其进行深层次的解析有利于对于代码的运作,python语言的特点及书写肯定是有帮助的。 我们分别从每个函数开始: 计算香农熵 def c...

dna13798的博客 785

深入解析CycloneDDS跨域通信中的XML配置文件优化策略

本文深入解析了CycloneDDS跨域通信中XML配置文件的优化策略,重点介绍了网络接口配置、多播设置、性能调优参数及复杂场景下的配置案例。通过实战技巧和调试方法,帮助开发者在SoC环境中实现高效稳定的跨域通信,提升系统性能。

soda5的博客 688

机器学习1109:决策树算法

西瓜书P93页习题四试编程实现基于信息熵/基尼指数进行划分选择的决策树算法并为表4.3中数据生成一颗决策树保存至D:\桌面\研0\西瓜书\第四章习题\西瓜数据集3.0.csv文件中数据:编号,色泽,根蒂,敲声,纹理,脐部,触感,密度,含糖率,好瓜1,青绿,蜷缩,浊响,清晰,凹陷,硬滑,0.697,0.46,是2,乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,0.774,0.376,是3,乌黑,蜷缩,浊响,清晰,凹陷,硬滑,0.634,0.264,是。

qq_63908157的博客 632

通信原理期末考试试题及答案

五、(总分12分)设某信道具有均匀的的双边噪声功率谱密度在该信道中传输抑制载波的单边带(上边带)信号,并设调制信号m(t)的频带限制在5K HZ,而载波为100 K HZ,已调信号的功率为10KW。:(1)单边带信号的载频为100kHz,带宽B=5kHz,为使信号顺利通过,理想带通滤波器的中心频率为。8、对最高频率为fH的调制信号m(t)分别进行AM、DSB、SSB调制,相应已调信号的带宽分别为。7、设调制信号为f(t)载波为,则抑制载波双边带调幅信号的时域表达式为,频域表达式为。

qq_67692062的博客 2393

游戏大厂技术护城河:你以为他们靠“美术和买量”,其实背后全是硬家伙

先把效果堆满到快上线了才发现低端机跑不动然后疯狂砍特效、降分辨率,画面崩、口碑崩机型分档(低/中/高)每帧预算(CPU/GPU 各多少 ms)每种资源预算(贴图、网格、粒子数量)性能自动回归(每天跑性能测试,发现波动立刻报警)大白话:小厂像装修到入住前才发现电路不够,临时拉线;大厂从设计图开始就算承重、算电路、算水压。玩家会不会来?活动会不会爆?版本会不会翻车?外挂会不会泛滥?竞品会不会抄?流量不确定 → 可扩容架构版本不确定 → 灰度与回滚。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 104

机器学习---决策树(ID3,C5.0,CART)

决策树学习与总结 (ID3, C4.5, C5.0, CART) 1. 什么是决策树 2. 决策树介绍 3. ID3 算法 信息熵 信息增益 缺点 4. C4.5算法 5. C5.0算法 6. CART算法 基尼指数 Gini指标 7. 连续属性离散化 8. 过拟合的解决方案 9. 例子1 - 脊椎动物分类 10. 例子2 1. 准备数据及读取 2. 决策树的特征向量化 3. 决策树训练 4. 决策树可视化 5 预测结果 ...

weixin_41395763的博客 5803

基于英特尔 RealSense D455 相机实现裂缝尺寸以及深度测量

D455 相机可用于对这些零部件进行高精度的表面检测,快速准确地测量裂缝的尺寸和深度,实现自动化的质量控制和缺陷筛查,提高生产效率和产品质量。D455 相机能够对焊缝表面进行细致扫描,测量焊缝的宽度、深度以及焊缝表面的不规则程度等参数,帮助检测焊缝是否存在缺陷,如未焊透、焊瘤等,为焊接质量的评估和改进提供数据支持。:RGB 传感器采用全局快门,并且其视场与深度视场相匹配,能够提供更出色的 RGB 图像质量,以及深度图像和 RGB 图像之间的更好对应性,从而可提高扫描质量。可以看出宽度和高度都是十分准确的。

qq_53545309的博客 1715

python 分类树_1. 决策树python源码实现--多叉分类树

多叉分类树​下面实现的分类树只限于特征是离散变量,而连续变量不能处理。另外,西瓜书介绍的缺失值的处理、多变量处理均未实现。下面实现的树有一个共同的特点,它的分支依据都是一个具体的特征取值,且每次特征选择之后都要删除特征。一、python实现​我使用python的类实现多分叉决策树,包括决策树的训练和预测两部分。1.1树的结构​使用python的字典(dict)作为树的结点,字典的嵌套形成树,格式如...

weixin_39524439的博客 383

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

python算法的缺陷和不足_决策树基本概念及算法优缺点

1. 什么是决策树分类决策树模型是一种描述对实例进行分类的树形结构. 决策树由结点和有向边组成. 结点有两种类型: 内部结点和叶节点. 内部节点表示一个特征或属性, 叶节点表示一个类.决策树(Decision Tree),又称为判定树, 是一种以树结构(包括二叉树和多叉树)形式表达的预测分析模型.通过把实例从根节点排列到某个叶子节点来分类实例叶子节点为实例所属的分类树上每个节点说明了对实例的某个属...

weixin_39535701的博客 604

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

python实现ID3

python实现ID3 具体的决策树原理在此就不再赘述,可自行百度或者看我之前写的:https://blog.youkuaiyun.com/weixin_38273255/article/details/88752468 在这里主要列出我使用的代码,和一些学习时候的心得。 心得 代码在网上其实都有一大片一大片的,但是自己觉得不太符合自己想要的要求,所以就找了网上的代码,并做了一些修改。很多地方肯定会有毛病,还...

weixin_38273255的博客 3985

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Python编程实现基于信息熵进行划分选择的决策树算法

本篇是周志华老师的《机器学习》第4章 决策树 课后题4.3的实现,原题是: 试编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中数据生成一颗决策树。 这里需要注意的是此数据集中,有的属性是离散的,有的属性是连续的,对于连续的属性,我们可以使用二分法将样本分为两个部分。 这个数据集可以从Dataset.py中粘贴: def watermelon3(): """ ...

仰起脸笑得像满月 1万+

python实现了一个决策树分类器,支持离散和连续特征

Tree类实现了一个决策树分类器,支持离散和连续特征。在构建决策树时,使用基尼不纯度作为分裂准则,并通过信息增益选择最佳分裂特征和阈值。同时,该类支持处理缺失值,并可以根据用户指定的参数进行模型的训练和预测。

max500600的博客 1258

c4.5决策树算法python_Python3实现机器学习经典算法(四)C4.5决策树

一、C4.5决策树概述C4.5决策树是ID3决策树的改进算法,它解决了ID3决策树无法处理连续型数据的问题以及ID3决策树在使用信息增益划分数据集的时候倾向于选择属性分支更多的属性的问题。它的大部分流程和ID3决策树是相同的或者相似的,可以参考我的上一篇博客:https://www.cnblogs.com/DawnSwallow/p/9452586.htmlC4.5决策树和ID3决策树相同,也可以...

weixin_39759918的博客 1820

模块化决策树函数的python实现

模块化决策树函数的python实现 标准的决策树不适合处理连续型数据,CART可以处理连续型数据,但是前提假设决策树是二叉树,也就是说不适合处理特征取值3个及以上的离散数据生成多叉树。本文代码实现的决策树结合两者的优点,既能处理离散型和连续型数据;且生成的决策树可以同时存在二叉和多叉;同时支持基于信息熵的信息增益、信息增益比和基尼指数的特征划分函数的选择。 为了在递归生成决策树时提高代码复用,...

waitingzby的博客 592

Python数据挖掘入门与实践------鸢尾花分类

          import numpy as np  from sklearn.datasets import load_iris   dataset = load_iris() #print(dataset.DESCR)  #查看数据集 X = dataset.data y = dataset.target #print(X)  每个植物的四个特征值 #print(y)  每...

陈赛_7019 2542
上一篇: 图片和二进制流之间的转化
下一篇: 采集数据
长情久伴
博客等级 码龄7年 4粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值