python决策树生成规则_ID3决策树(python实现)

决策树的生成(该函数是一个递归的过程)CreateTree

输入:数据集、特征

输出:字典型数据——决策树

a、判断是否满足停止划分的条件

若当前数据集的属性值为空,则投票表决当前样本中最多的类别

若当前所有的样本类别相同,则返回当前数据的类别。

b、寻找当前数据的最佳划分特征

c、将最佳特征作为关键字,保存到字典中

d、从当前的属性集合中删除该最佳特征

e、遍历该最佳划分特征的所有属性值feat,循环调用函数 CreateTree(输入参数为:最佳特征值为feat的所有数据集,去除最佳特征的属性集合)

代码注意:

1、生成的决策树用字典保存,并且每个关键字的值是一个字典;

2、生成的决策树可以用 pickle 序列化对象保存;

3、ID3 算法适用于标称型数据,在函数的输入、输出中,数据类型为 listlist。

代码:

#-*- coding:utf-8 -*-

import numpy as np

from numpy import *

import pandas as pd

from math import *

import operator

import pickle # 使用该模块实现对决策树的保存

# 数据导入

def loadData(fileName):

dataSet = []

fr = open(fileName)

for featVector in fr.readlines():

lineVector = featVector.strip().split('\t')

dataSet.append(lineVector)

return dataSet

def calcuEntropy(myData): # 计算信息熵

numSample = len(myData)

myClassCount = {}

for featVector in myData:

theKey = featVector[-1]

if theKey not in myClassCount:

myClassCount[theKey] = 0

myClassCount[theKey] += 1

myEntropy = 0

for Keys in myClassCount.keys():

Px = float(myClassCount[Keys])/numSample

myEntropy -= Px*log(Px,2) # 需要导入 math 库

return myEntropy

# 划分数据集:返回划分好的数据集

def splitDataSet(dataX,FeatureNumber,value): # 输入:数据集、第i 个特征、该属性的值

retMat = []

for featVect in dataX:

if featVect[FeatureNumber] == value:

x1 = featVect[:FeatureNumber]

x2 = featVect[FeatureNumber+1:]

x1.extend(x2)

retMat.append(x1)

#print"retMat", retMat

return retMat

# 计算最优特征:计算每个特征下的信息熵,信息熵最大的既是最优特征,返回的数字 i 代表第 i 个特征

def GetBestFeature(dataM):

BestFeat = -1; LargestInformGain = -1 # 最佳特征、最大信息增益

theEntropy = calcuEntropy(dataM)

FeatNumber = len(dataM[0])-1

for i in range(FeatNumber):

FeatList = [example[i] for example in dataM] # 统计每个特征有几个特征值

FeatUnique = set(FeatList) # 每个特征中的特征值,计算每个特征值下的信息增益

NewEntropy = 0.0

for j in FeatUnique:

retMat = splitDataSet(dataM,i,j) # 得到满足条件的数据

Prob = len(retMat)/float(len(dataM))

NewEntropy -= Prob*calcuEntropy(retMat) # 注意:这里是子数据集的概率x 该数据集的熵

informGain = theEntropy + NewEntropy

if informGain > LargestInformGain:

LargestInformGain = informGain

BestFeat = i

return BestFeat

def RoleOfVote(dataM): # 投票规则:少数服从多数

lables = [example[-1] for example in dataM]

lablesCount = {}

for i in lables:

if i not in lablesCount.keys():

lablesCount[i] = 0

lablesCount[i] += 1

theSort = sorted(lablesCount.iteritems(),key =operator.itemgetter(1),reverse=True)

return theSort[0][0] # 返回出现次数最多的类别标签

# 决策树生成: 首先,判断是否满足停止划分的条件:1、所有的类别标签相同 2、属性值为空

def CreateTree(dataSet,label):

allLabels = [example[-1] for example in dataSet]

#print "调用几次"

if allLabels.count(allLabels[0])==len(allLabels):

return allLabels[0]

if(len(dataSet[0])==1): # 没有属性可以划分时,采用投票规则

return RoleOfVote(dataSet)

featNumber = GetBestFeature(dataSet) # 返回最佳划分的编号

#print featNumber

bestFeature = label[featNumber]

myTree = {bestFeature:{}}

del(label[featNumber])

featValue = [example[featNumber] for example in dataSet]

uniqueFeatValues = set(featValue)

for i in uniqueFeatValues:

subLabels = label[:]

myTree[bestFeature][i] = CreateTree(splitDataSet(dataSet, featNumber, i), subLabels)

return myTree

# 对输入样本进行分类

def SampleClassify(inputTree, featLabels, testVec): # 输入树、属性标签、测试向量

firstStr = inputTree.keys()[0] # 决策树的第一个关键词(第一个划分的属性)

secondDict = inputTree[firstStr] # 决策树每个关键字对应的值也是字典

featIndex = featLabels.index(firstStr) # 得到该特征在属性标签中的编号 K

key = testVec[featIndex] # 得到当前测试向量中第 K 号特征值

valueOfFeat = secondDict[key]

if isinstance(valueOfFeat, dict): # 判断变量是否为字典类型

classLabel = SampleClassify(valueOfFeat, featLabels, testVec)

else:

classLabel = valueOfFeat

return classLabel

# 将生成的树保存

def storeTree(inputTree, filename):

fw = open(filename, 'w')

pickle.dump(inputTree, fw)

fw.close()

# 加载保存的树

def loadTree(filename):

fr = open(filename)

return pickle.load(fr)

if __name__=="__main__":

print "hello world"

dataSet = loadData('lenses.txt')

labels = ['age','prescript','astigmatic','tearRate']

slabels = labels[:] # pyhton 函数中的参数是按照引用方式传递的,为防止labels 改变,复制类标签带入

myTree = CreateTree(dataSet,slabels)

print labels

#storeTree(myTree,"xu") # 保存决策树

test = dataSet[0]

#print test[:-1]

print"预测结果是:", SampleClassify(myTree,labels,test[:-1])

print"真是标签是:",test[-1]

注:

ID3决策树在选择属性时,会找到信息增益最大的划分属性

ID3决策树如果对连续变化的属性进行划分,则需要先将连续值离散化(分区间)

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

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

相关文章

while循环python的范围_python-无法在while循环中从列表中排除一定范围内的项目

所以我发布了一个问题before,但是它过于简化了,正确地被标记为重复.我现在将更详细地发布我的问题,以便希望可以解决我的问题.简而言之如下:我有两个列表:a [10.0,20.0,25.0,40.0]和b [1.0,10.0,15.0,20.0,30.0,100.0]使用列表推导,我想从b中排除a中指…

怎么使用mysql打表_MySQL的表使用

-- 创建表CREATE TABLE teacher(id INT,NAME VARCHAR(20))-- 查看所有表SHOW TABLES;DESC student;DROP TABLE student;CREATE TABLE student(id INT,NAME VARCHAR(20),gender VARCHAR(2),age INT)-- ********一、增删改数据********* ----- 1.1 增加数据-- 插入所有字段。一定…

表级锁的mysql读写_Mysql的表级锁

我们首先需要知道的一个大前提是:mysql的锁是由具体的存储引擎实现的。所以像Mysql的默认引擎MyISAM和第三方插件引擎 InnoDB的锁实现机制是有区别的。可根据不同的场景选用不同的锁定机制。Mysql有三种级别的锁定:表级锁定、页级锁定、行级锁定一、定义…

account表里有什么 银行_模拟一个银行账户类Account,账户类中包括所有者、账号、余额、账户总数、存款、取款等信息。_学小易找答案...

【单选题】廉价磁盘冗余阵列RAID利用冗余技术实现高可靠性,其中RAID1的磁盘利用率为() 。【简答题】与直流调速相比,交流调速有何优点?【论述题】方法【单选题】以《老子注》一书驰名汉学界的学者是下列哪一位 ______【填空题】本任务中,所需的实训设备有:( )、( )、( )【单选…

创建mysql视图语法正确的是_MySQL创建视图的语法格式

视图,具有简化查询语句、安全性和保证逻辑数据独立性等作用创建视图的语法格式视图中,包含SELECT查询的结果,因此,视图的创建基于SELECT语句,和已经存在的数据表,视图可以建立在一张表上,也可以…

爬空气质量MySQL_爬虫:利用selenium采集某某环境网站的空气质量数据

前言:在上一篇文章中,我们介绍了在http://PM2.5.in这个网站采集空气质量的数据,本篇文章是对其产生的一些问题的另一种解决方案,提供更加权威的数据采集。技术框架:selenium、json、etree这里的selenium是一种自动化测…

mysql导出数据意义_11、mysql导出数据

1、使用select... into outfile语句导出数据(1)txt格式select *from runoob.tb1 into outfile /tmp/runoob.txt;(2)CSV格式select * from passwd into outfile /tmp/runoob.txt fields terminated by , enclosed by " lines terminated by \r\n;(3)生成一种文件&#xff0…

操作失败10秒内未完成启动服务mysql_01-MySQL 命令行-cmd用法-未完成

01.png02.png03.png04.png05.png06.png07.png08.png09.png一、mysql服务的启动和停止net stop mysqlnet start mysql二、登陆mysql语法如下: mysql -u用户名 -p用户密码键入命令mysql -uroot -p, 回车后提示你输入密码,输入12345,…

java时间聚类_mongodb 按照时间聚类 java

当存储到mongodb中的是string类型的时间,小tips:1. 那么在对此域按照时间聚类(每周,每月)时就不能直接使用mongodb的time关键字了,因为mongodb有自己的时间类型,且目前它只认可自己的时间类型。2. 假如对于时间进行简单的聚类&…

selenium python实例录制运行_WEB自动化测试工具selenium录制器使用笔记

简介selenium录制器是最近刚流行起来的一个WEB自动化测试工具,由多测测团队开发。Selenium录制器采用关键字驱动的理念,简化测试用例的创建和维护,可以直接运行在浏览器中,就像真正的用户在操作一样。自动化脚本录制、一键回放、报…

cass坡度土方计算案例_60度斜坡怎么计算_南方CASS土方计算方法—方格网法

01概述在我们的日常工作中,遇到大量的土方修正算的相关咨询,为什么CASS的方格网土方修正算,方格设定为10米和20米,修正算结果有很大差异呢?从软件计算原理、数据质量等方面进行分析,读了这篇文章&#xff0…

java ssh cpu_初学Java ssh之Spring 第四篇

今天我来学习学习Spring中Bean。在Spring中原来还有标签啊,它相当于标签的老爸,老爸可以有很多个儿子,但是老爸只有一个哦。也就是说一个标签内可以有多个标签,每个标签代表一个java实例。定义时,需要注意两个属性&…

java中servlet知识_jsp_Servlet常用知识总结

Servlet三个要素[java] view plain copy print?1.必须继承自HttpServlet2.必须实现doGet()或者doPost()3.必须在web.xml中配置ServletHttpServeltRrequest:请求对象getParameter():获得表单元素的值getAttribute():获得request范围中的属性值setAttribute():设置reqeust范围中…

java语言执行模式,使用java.exe执行静默模式

I would like to know if there is a way to execute the "java.exe" as a background process (silent mode execution)Ex: java -cp . MyClass arg1I want to run the above statement as a background process , without opening command window解决方案Under Win…

linux下tomcat部署java web项目_求助帖 linux服务器 tomcat部署javaweb项目问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼03-Sep-2018 17:42:07.330 SEVERE [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start:org.apache.catalina.LifecycleException: Failed to start component [Stan…

rabbitmq+topic+java_译:5.RabbitMQ Java Client 之 Topics (主题)

我们使用的是direct(直接交换),而不是使用只能进行虚拟广播的 fanout(扇出交换),并且有可能选择性地接收日志。虽然使用direct(直接交换)改进了我们的系统,但它仍然有局限性 - 它不能基于多个标准进行路由。在我们的日志系统中,我…

java某个时间推迟60天_java计算两个时间相差(天、小时、分钟、秒)

public static long dateDiff(String startTime, String endTime,String format, String str) {// 按照传入的格式生成一个simpledateformate对象SimpleDateFormat sd new SimpleDateFormat(format);long nd 1000 * 24 * 60 * 60;// 一天的毫秒数long nh 1000 * 60 * 60;// …

java影碟租赁系统_java影碟管理系统

在学习基于javaweb的影碟管理系统项目的时候,方便日后能及时查阅,在本平台中记录一下基于javaweb的影碟管理系统的开发流程。在学习时候的选用了SSM(MYECLIPSE),这个框架不论是学习还是使用都非常方便,简单易上手。基于javaweb的影碟管理系统…

hasp 加密 java_加密软件HASP的使用说明

加密软件hasp使用说明1.hasp环境的搭建hasp环境的搭建要根据机器的环境来安装,①windows系统的就安装windows版本,安装步骤可以参考<录像>文件下里的hasp5.0系统安装.exe;②linux版本的需要安装linux版本,安…

java明文发送_使用java MD5加密网络明文

1.[代码][Java]代码import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/*** Created by liuhj on 2015/11/27.*/public class MD5 {public static void main(String args[]){StringMD5("123456");}public static String StringMD5(…