决策树原理实例(python代码实现)_决策树实例

决策树原理实例(python代码实现)_决策树实例决策树算法决策树算法是一种逼近离散函数值的方法。它是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。决策树算法构造决策树来发现数据中蕴涵的分类规则.如何构造精度高、规模小的决策树是决策树算法的核心内容。决策树构造可以分两步进行。第一步,决策树的生成:由训练样本集生成决策树的过程。一般…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

决策树算法

决策树算法是一种逼近离散函数值的方法。它是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。

决策树算法构造决策树来发现数据中蕴涵的分类规则.如何构造精度高、规模小的决策树是决策树算法的核心内容。决策树构造可以分两步进行。第一步,决策树的生成:由训练样本集生成决策树的过程。一般情况下,训练样本数据集是根据实际需要有历史的、有一定综合程度的,用于数据分析处理的数据集。第二步,决策树的剪技:决策树的剪枝是对上一阶段生成的决策树进行检验、校正和修下的过程,主要是用新的样本数据集(称为测试数据集)中的数据校验决策树生成过程中产生的初步规则,将那些影响预衡准确性的分枝剪除。

 

基本思想

序号

是否大学生

是否常去图书馆

是否经常参加竞赛

是否优秀

1

2

3

4

5

6

7

8

9

10

 

 

 

 

 

 

 

 

 

 

 

 

步骤一、先计算数据集D的信息熵H(x),数据集D的信息熵,即在仅仅只知道类别属性的基础上的信息熵。数据记录有10条,是否优秀属性值为“是”的有5条,为“否”的5条。

总信息熵H(x)=-5/10*log2(5/10)-5/10*log2(5/10)=1

这个数值就是告诉我们,是否优秀这个不确定性为1,那么假设有人可以告诉你说:如果我告诉你一列属性值(和目标分类属性相关的属性值),那么你的这种不确定性又是多少呢?

 

步骤二、计算知道各个属性的前提下,数据集D的信息熵

比如知道了年龄是否大学生属性:在是大学生的特征下,有优秀的,也有不优秀的,那么总共有5个优秀,2个不优秀的;

而在不是大学生的特征下,有优秀的,也有不优秀的,那么总共有0个优秀,3个不优秀的;

H(x|大学生)=-7/10(5/7*log2(5/7)+2/7*log2(2/7))

-3/10(0/3*log2(0/3)+3/3*log2(3/3))=0.604

同理,会算出:

H(x|图书馆),H(x|经常参加竞赛)

H(x|图书馆)=-7/10(3/7*log2(3/7)+4/7*log2(4/7))

-3/10(2/3*log2(2/3)+1/3*log2(1/3))=0.965

H(x|经常参加竞赛)=-6/10(2/6*log2(2/6)+4/6*log2(4/6))

-4/10(1/4*log2(1/4)+3/4*log2(3/4))=0.875

 

步骤三、计算哪个的信息增益大

Gain(大学生)=H(x)-H(x|大学生)=value1=0.396

Gain(图书馆)=H(x)-H(x|图书馆)=value2=0.035

Gain(经常参加竞赛)=H(x)-H(x|经常参加竞赛)=value3=0.125

value1>value3>value2,然后根据这个结果选取“大学生”属性最为最先分类的属性。

根据大学生属性值分类之后,那么接下来数据集重新进行了划分,由重复上述步骤进行下一个分裂属性的查找。

直到到所有的特征都用完了,二是划分后额信息增益足够小,那么决策树的生长就可以停止了,最终构成一颗决策树!

 

具体代码:

import numpy as np

import xlrd


#设置数据读取路径

path='C://Users//xiaoxiannv//Desktop//tree.xlsx'


#xlrd打开数据

data=xlrd.open_workbook(path)



#读取excel的sheet

sheet1=data.sheet_by_name('Sheet1')



#原始数据放入二维数组中去

nrows=sheet1.nrows

ncols=sheet1.ncols



#初始化得到与data set相同行,列的二维数组

dataMatrix=np.zeros((nrows-1,ncols),dtype=str)



#数据放入初始化的二维数组中

for i in range(1,nrows):

    dataMatrix[i-1,:]=sheet1.row_values(i)



#数值化

for  i in range(nrows-1):

    temp=dataMatrix[i,:]

    temp[temp=='是']=1

    temp[temp=='否']=0

    dataMatrix[i,:]=temp

#强制转换矩阵为int

dataMatrix=dataMatrix.astype('int')



#算法 第一步

targetAtr=dataMatrix[:,-1]



#计算原始数据集的信息熵

def calcuEntropy(ta):

    zeros=sum(ta==0)

    ones=sum(ta==1)

    sm=zeros+ones

    p0=zeros/sm

    p1=ones/sm

    if(p0==0):

        p0=1

    elif(p1==0):

        p1=1

    return -p0*np.log2(p0)-p1*np.log2(p1)



#计算加入某先验特征属性后的信息熵(也就是加入某一个知识后的信息不确定性)

entropy2=dataMatrix[:,-1]#是否优秀

entropy1=dataMatrix[:,1]#大学生

entropy3=dataMatrix[:,2]#图书馆

entropy4=dataMatrix[:,3]#竞赛



newMt=np.array([entropy1,entropy2])

newMt=np.transpose(newMt)

newMt1=np.array([entropy3,entropy2])

newMt1=np.transpose(newMt1)

newMt2=np.array([entropy4,entropy2])

newMt2=np.transpose(newMt2)

#print(newMt)



def lastEntropy(data):

    #数据传进来,根据引入属性值的多少来进行数据划分

    #比如引入第一列属性,总共有“是”“否”两类值,也就是根据“是”“否”把数据集划分为两类

    nrows,ncols=data.shape;

    yesList=[]

    noList=[]

    for i in range(nrows):

        if(data[i,0]==1):

            yesList.append(data[i,:])

        else:

            noList.append(data[i,:])

    #根据“是”“否”把数据集划分为两类yesMatrix,noMatrix

    yesMatrix=np.array(yesList)

    noMatrix=np.array(noList)

   

    #统计“是”的数据集有多少个

    yM=yesMatrix.shape[0]

    #统计“否”的数据集有多少个

    nM=noMatrix.shape[0]

   

    #计算各个数据集的占比,比如“是”数据集占总数据百分比,“否”数据集占总数据百分比

    sM=yM+nM

    yPercent=yM/sM

    nPercent=nM/sM

   

    #print(yesMatrix[:,-1])

    #print(noMatrix[:,-1])

    #计算在引入属性知识之后,“是”数据集下是信息熵(也就是引入新知识后的不确定性)

    yEntropy=calcuEntropy(yesMatrix[:,-1])

    nEntropy=calcuEntropy(noMatrix[:,-1])

   

    print("\nyEntropy "+str(yEntropy))

    print("nEntropy "+str(nEntropy))

  

    #计算总的信息熵

    return yPercent*yEntropy+nPercent*nEntropy



values=calcuEntropy(targetAtr)-lastEntropy(newMt)

values1=calcuEntropy(targetAtr)-lastEntropy(newMt1)

values2=calcuEntropy(targetAtr)-lastEntropy(newMt2)



print('大学生的信息熵为:',lastEntropy(newMt))  

print('图书馆的信息熵为:',lastEntropy(newMt1))

print('竞赛的信息熵为:',lastEntropy(newMt2),'\n')



#print(calcuEntropy(targetAtr))

#print(dataMatrix)



#比较信息熵大小

if values>values1:

    if values1>values2:

        print('values>values1>values2,选取“大学生”属性最为最先分类的属性')

    else:

        if values>values2:

            print('values>values2>values1,选取“大学生”属性最为最先分类的属性')

        else:

            print('values2>values>values1,选取“竞赛”属性最为最先分类的属性')

elif values<values1:

    if values1<values2:

        print('values2>values1>values,选取“竞赛”属性最为最先分类的属性')

    else:

        if values2>values:

            print('values1>values2>values,选取“图书馆”属性最为最先分类的属性')

        else:

            print('values1>values>values2,选取“图书馆”属性最为最先分类的属性')

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197554.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CE教程步骤8操作指南

    CE教程步骤8操作指南CE 教程步骤 8 操作指南 CE 全称 CheatEngine 是一款专注于游戏的修改器 教程的步骤 8 特别难 这是一个四级指针 比较绕 下面分步解析 其他详细说明请参考别人的博客第一个指针 1 精确数值搜索多次搜索后得到唯一一条数据结论 001A1268 gt VALUE 地址 001A1268 存放数值 2 找出改写这个地址的指针结论 rsi 18 gt 001A1268 rsi 001A1250 指针数值 001A1250 偏移 18 一起改写地址 001A12683 以

    2025年10月18日
    4
  • oracle数据库学习总结在(一)

    oracle数据库学习总结在(一)对oracle已经学习三个多月了,看了不少东西,oracle数据库很复杂,光概念就很多,为了对oracle有更好的认识我打算把我这段时间的学习做下总结,为结下来的学习打下好的基础。  总结目录:1.设计数据库,设计出结构优化的数据库,可扩展性好。2.数据库的备份和恢复,权限的分配3.优化数据库,数据库性能调优。4.数据库开发,存储过程,触发器,函数等后端数据库程序,给系

    2022年10月21日
    6
  • Android–SQLite数据库实现增删改查

    Android–SQLite数据库实现增删改查SQLite–轻量级数据库一般常见于安卓客户端。用于存储一些重要数据,因其操作容易、使用简单的好处博得一大批迷妹。今天就来说一说sqlite一些简单的使用方法。一步一步开始做吧,我先创建个项目,主要是使用sqlite的代码。首先,我需要在项目初次运行时创建数据库并新建一张user表,用来存储username和password两个字段;…

    2022年6月26日
    27
  • 什么是NoSQL,为什么要使用NoSQL?

    什么是NoSQL,为什么要使用NoSQL?1 为什么用 NoSQL 1 1 单机 MySQL 的美好时代在 90 年代 一个网站的访问量一般都不大 用单个数据库完全可以轻松应付 在那个时候 更多的都是静态网页 动态交互类型的网站不多 上述架构下 我们来看看数据存储的瓶颈是什么 DAL DataAccessLa 数据访问层 Hibernate MyBatis 数据量的总大小一个机器放不下时 数据

    2025年7月24日
    3
  • 龙芯架构是自己的吗_debian重装系统

    龙芯架构是自己的吗_debian重装系统龙芯灵珑一体机,型号9s2a,pmon版本LM9103-1.5.9原机硬盘250g,装有debian5和debian6双系统由于在debian6系统下不小心误删除了部分文件,导致系统不能关机,不能重启,故重装。此次安装采用usb安装方式前期准备:(在linux系统下,下载安装文件,解压文件,拷贝到u盘)1,将debian6的安装文件拷贝到u盘(一体机挑u盘,没有u盘可以采用硬盘…

    2022年10月18日
    3
  • directshow是什么_showpoint

    directshow是什么_showpoint1.DirectShow介绍DirectShow是一个windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。它支持多种多样的媒体文件格式,包括ASF、MPEG、AVI、MP3和WAV文件,同时支持使用WDM驱动或早期的VFW驱动来进行多媒体流的采集。DirectShow整合了其它的DirectX技术,能自动地侦测并使用可利用的音视频硬件加速,也能支持没有硬件加速的系统。DirectShow大大简化了媒体回放、格式转换和采集工作。但与此同时,它也为用户自定义的解决方…

    2022年10月12日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号