python c4.5完整代码_python实现c4.5/Id3自我练习

import numpy as np

class DecisionTree:

"""决策树使用方法:

- 生成实例: clf = DecisionTrees(). 参数mode可选,ID3或C4.5,默认C4.5

- 训练,调用fit方法: clf.fit(X,y).  X,y均为np.ndarray类型

- 预测,调用predict方法: clf.predict(X). X为np.ndarray类型

- 可视化决策树,调用showTree方法

"""

def __init__(self,mode='C4.5'):

self._tree = None

if mode == 'C4.5' or mode == 'ID3':

self._mode = mode

else:

raise Exception('mode should be C4.5 or ID3')

def _calcEntropy(self,y):

"""

函数功能:计算熵

参数y:数据集的标签

"""

num = y.shape[0]

#统计y中不同label值的个数,并用字典labelCounts存储

labelCounts = {}

for label in y:

if label not in labelCounts.keys(): labelCounts[label] = 0

labelCounts[label] += 1

#计算熵

entropy = 0.0

for key in labelCounts:

prob = float(labelCounts[key])/num

entropy -= prob * np.log2(prob)

return entropy

def _splitDataSet(self,X,y,index,value):

"""

函数功能:返回数据集中特征下标为index,特征值等于value的子数据集

"""

ret = []

featVec = X[:,index]

X = X[:,[i for i in range(X.shape[1]) if i!=index]]

for i in range(len(featVec)):

if featVec[i]==value:

ret.append(i)

return X[ret,:],y[ret]

def _chooseBestFeatureToSplit_ID3(self,X,y):

"""ID3

函数功能:对输入的数据集,选择最佳分割特征

参数dataSet:数据集,最后一列为label

主要变量说明:

numFeatures:特征个数

oldEntropy:原始数据集的熵

newEntropy:按某个特征分割数据集后的熵

infoGain:信息增益

bestInfoGain:记录最大的信息增益

bestFeatureIndex:信息增益最大时,所选择的分割特征的下标

"""

numFeatures = X.shape[1]

oldEntropy = self._calcEntropy(y)

bestInfoGain = 0.0

bestFeatureIndex = -1

for i in range(numFeatures):

featList = X[:,i]

uniqueVals = set(featList)

newEntropy = 0.0

for value in uniqueVals:

sub_X,sub_y = self._splitDataSet(X,y,i,value)

prob = len(sub_y)/float(len(y))

newEntropy += prob * self._calcEntropy(sub_y)

#计算信息增益,根据信息增益选择最佳分割特征

infoGain = oldEntropy - newEntropy

if (infoGain > bestInfoGain):

bestInfoGain = infoGain

bestFeatureIndex = i

return bestFeatureIndex

def _chooseBestFeatureToSplit_C45(self,X,y):

"""C4.5

ID3算法计算的是信息增益,C4.5算法计算的是信息增益比

"""

numFeatures = X.shape[1]

oldEntropy = self._calcEntropy(y)

bestGainRatio = 0.0

bestFeatureIndex = -1

#对每个特征都计算一下gainRatio=infoGain/splitInformation

for i in range(numFeatures):

featList = X[:,i]

uniqueVals = set(featList)

newEntropy = 0.0

splitInformation = 0.0

#对第i个特征的各个value,得到各个子数据集,计算各个子数据集的熵,

#进一步地可以计算得到根据第i个特征分割原始数据集后的熵newEntropy

for value in uniqueVals:

sub_X,sub_y = self._splitDataSet(X,y,i,value)

prob = len(sub_y)/float(len(y))

newEntropy += prob * self._calcEntropy(sub_y)

splitInformation -= prob * np.log2(prob)

#计算信息增益比,根据信息增益比选择最佳分割特征

if splitInformation==0.0:

pass

else:

infoGain = oldEntropy - newEntropy

gainRatio = infoGain/splitInformation

if(gainRatio > bestGainRatio):

bestGainRatio = gainRatio

bestFeatureIndex = i

return bestFeatureIndex

def _majorityCnt(self,labelList):

"""

函数功能:返回labelList中出现次数最多的label

"""

labelCount={}

for vote in labelList:

if vote not in labelCount.keys(): labelCount[vote] = 0

labelCount[vote] += 1

sortedClassCount = sorted(labelCount.iteritems(),key=lambda x:x[1], reverse=True)

return sortedClassCount[0][0]

def _createTree(self,X,y,featureIndex):

"""建立决策树

featureIndex,类型是元组,它记录了X中的特征在原始数据中对应的下标。

"""

labelList = list(y)

#所有label都相同的话,则停止分割,返回该label

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

return labelList[0]

#没有特征可分割时,停止分割,返回出现次数最多的label

if len(featureIndex) == 0:

return self._majorityCnt(labelList)

#可以继续分割的话,确定最佳分割特征

if self._mode == 'C4.5':

bestFeatIndex = self._chooseBestFeatureToSplit_C45(X,y)

elif self._mode == 'ID3':

bestFeatIndex = self._chooseBestFeatureToSplit_ID3(X,y)

bestFeatStr = featureIndex[bestFeatIndex]

featureIndex = list(featureIndex)

featureIndex.remove(bestFeatStr)

featureIndex = tuple(featureIndex)

#用字典存储决策树。最佳分割特征作为key,而对应的键值仍然是一棵树

myTree = {bestFeatStr:{}}

featValues = X[:,bestFeatIndex]

uniqueVals = set(featValues)

for value in uniqueVals:

#对每个value递归地创建树

sub_X,sub_y = self._splitDataSet(X,y, bestFeatIndex, value)

myTree[bestFeatStr][value] = self._createTree(sub_X,sub_y,featureIndex)

return myTree

def fit(self,X,y):

#类型检查

if isinstance(X,np.ndarray) and isinstance(y,np.ndarray):

pass

else:

try:

X = np.array(X)

y = np.array(y)

except:

raise TypeError("numpy.ndarray required for X,y")

featureIndex = tuple(['x'+str(i) for i in range(X.shape[1])])

self._tree = self._createTree(X,y,featureIndex)

return self  #allow chaining: clf.fit().predict()

def predict(self,X):

if self._tree==None:

raise NotFittedError("Estimator not fitted, call `fit` first")

if isinstance(X,np.ndarray):

pass

else:

try:

X = np.array(X)

except:

raise TypeError("numpy.ndarray required for X")

def _classify(tree,sample):

"""

用训练好的决策树对输入数据分类

决策树的构建是一个递归的过程,用决策树分类也是一个递归的过程

_classify()一次只能对一个样本(sample)分类

To Do: 多个sample的预测怎样并行化?

"""

featIndex = tree.keys()[0]

secondDict = tree[featIndex]

key = sample[int(featIndex[1:])]

valueOfkey = secondDict[key]

if isinstance(valueOfkey, dict):

label = _classify(valueOfkey,sample)

else: label = valueOfkey

return label

if len(X.shape)==1:

return _classify(self._tree,X)

else:

results = []

for i in range(X.shape[0]):

results.append(_classify(self._tree,X[i]))

return np.array(results)

def show(self):

if self._tree==None:

raise NotFittedError("Estimator not fitted, call `fit` first")

#plot the tree using matplotlib

import treePlotter

treePlotter.createPlot(self._tree)

class NotFittedError(Exception):

"""

Exception class to raise if estimator is used before fitting

"""

pass

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

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

相关文章

jdeveloper_适用于JDeveloper 11gR2的Glassfish插件

jdeveloper众所周知, ADF Essentials是使用Java构建Web应用程序的绝佳框架,它可以自由开发和部署。 您在Glassfish(3.1)服务器上部署ADF Essentials应用程序。 但是,JDeveloper并不带有嵌入式Glassfish服务器&#xff…

php接收get数组数据,来自HTTP的PHP注入GET数据用作PHP数组键值

我想知道在以下场景中是否存在可能的代码注入(或任何其他安全风险,如读取您不应该使用的内存块等等),其中来自HTTP GET的未经过处理的数据用于代码中PHP作为数组的键.这应该将字母转换为字母顺序. a到1,b到2,c到3 …. HTTP GET“字母”变量应该有值字母,但是你可以理解任何东西…

python绘制横向堆积柱状图_Python 堆叠柱状图绘制方法

本文介绍了Python 堆叠柱状图绘制方法,分享给大家,具体如下:>>文件: 堆叠直方图.py>>作者: liu yang>>邮箱: liuyang0001outlook.com>>博客: www.cnblogs.com/liu66blog#!/usr/bin/env python# -*- coding: utf-8 -*…

Spring Cloud教程– Spring Cloud Config Server简介

问题 SpringBoot在通过属性或YAML文件外部化配置属性方面提供了很大的灵活性。 我们还可以使用特定于配置文件的配置文件(例如application.properties , application-dev.properties , application-prod.properties等)分别为每个环…

数字孪生体技术白皮书_基于Flownex的数字孪生体解决方案 系列介绍之二:数据中心应用实例...

致力于数字孪生体技术的研究与发展通过解决方案和工程化应用造福人类来源:数字孪生体实验室原创作者:王永康转载请注明来源和出处导 读《基于Flownex的数字孪生体解决方案》是我们最近完成的系列落地方案之一。该方案适用于热力系统、冷却系统、通风空调…

node php聊天室,最简单的Nodejs聊天室示例

今天群里一个同学找我要一个nodejs聊天室的demo。给他了一个简单的例子,顺便记录下:准备工作(前提是已经装好了nodejs):mkdir nodejs-democd nodejs-demo安装express : npm install express安装socket.io : npm install socket.io安装foreve…

neo4j安装_neo4j 社区版win10 下安装

准备工作:Neo4j下载网址:https://neo4j.com/download-center/#releasesava jdk官网下载:https://www.oracle.com/technetwork/java/javase/downloads/index.html安装 查看是否有用旧版本的java jdk ,如果有请在设置“应用和功能”卸载 旧的ja…

php网站 qq登陆,php写的插件网站接入QQ登录,QQ互联

qq按钮这里的链接是入口,调用你的apiapi_qq.php前端直接链接到此/*** 这个QQ登录简单实用,只要大家看我写的注释会一目了然,请注意看哦。* 带有"todo"这样注释的地方都是要你去改成你自己的逻辑* 这个php怎么进来呢?这是…

spring不自动下载_Spring:自动接线或不自动接线

spring不自动下载自从使用Spring 2.5以来,我从基于XML的应用程序上下文切换到了注释。 尽管我发现那些非常有用且节省大量时间的人,但我始终觉得在灵活性方面我失去了一些东西。 特别是Autowired批注-或标准Inject-在我看来就像新的“新”,增…

php faker 中文,使用faker 生成中文测试数据

https://github.com/fzaninotto/Faker/blob/master/src/Faker/Provider/zh_CN/Address.php常用的类型都在里面。下面是一个实例。使用了laravel 框架的工厂模式向数据库填充测试数据。$factory->define(App\Models\Customer::class, function ($faker) {$faker Faker\Facto…

python课设总结_Python技术分享课总结:用Python模拟知乎自动登录

原标题:Python技术分享课总结:用Python模拟知乎自动登录Python语言是由Guido van Rossum大牛在1989年发明,它是当今世界最受欢迎的计算机编程语言之一,也是一门“学了有用、学了能用、学会能久用”的计算生态语言。为此&#xff0…

Spring MVC中@RequestParam和@PathVariable批注之间的区别?

Spring MVC框架是在Java世界中开发Web应用程序最流行的框架之一,它还提供了一些有用的注释,可以从传入的请求中提取数据并将请求映射到控制器,例如 RequestMapping, RequestParam和PathVariable。 即使将RequestParam和ParthVari…

php 随机钱数,PHP 仿微信红包金额随机

博主寒冰最近闲来无事。就想研究一下微信红包的金额随机算法。早在微信红包刚出来的时候就研究过。始终不得要领。后来,通过查阅诸多资料。听说要实现“正态分布”。这个理论的东西不想深挖。恰好在网上一篇博客找到一个相对完整的算法。我经过试用确实不错。经过我…

excel 两列模糊匹配给出结果_北大硕士给大脑植入Excel病毒,工作效率提升了好几倍...

在工作中,我们经常会碰到这样的同事,他们是这样完成工作的:先用计算器算好结果,甚者动用手指头在电脑屏幕上数数,然后把数据填写到Excel表格中。结果可以预见,原本可以在上班时间完成的工作,愣是…

5 在java等于多少,java基础面试题之Java中的Math. round(-1. 5)等于多少

Java 中的 Math. round(-1. 5) 等于多少?答案:-1/*** Returns the closest {code long} to the argument, with ties* rounding to positive infinity.** Special cases:* If the argument is NaN, the result is 0.* If the argument is negative infin…

java ee cdi_Java EE CDI Producer方法教程

java ee cdi这是CDI Producer方法的教程。 在CDI中,生产者方法生成一个对象,然后可以将其注入。 当我们要注入本身不是bean的对象,要注入的对象的具体类型在运行时可能有所不同,或者当对象需要一些bean构造函数不执行的自定义初始…

qnap nas web php,如何在QNAP NAS上建立并使用 iSCSI Target

本帖最后由 小Q 于 2015-2-5 13:30 编辑在QNAP Turbo NAS上建立并使用iSCSI Target,快速、便利且便宜建置网络储存系统之方式内容:l 在Windows中使用Microsoft iSCSI启动器来连接iSCSI装置什么是iSCSI且它有什么好处?iSCSI(Internet Small Computer Sy…

python坐标轴刻度设置对数_Python中的对数刻度

我试图以对数比例(Y轴)绘制一个图形,但我需要在Y轴上显示原始值。我用了密码:# -*- coding: utf-8 -*-import mathimport matplotlib.pyplot as pltimport matplotlib.dates as datesfrom datetime import datetime, timedeltaimport numpy as npx []y …

openssl php api,PHP7使用openssl解密易班API中的用户数据

PHP7使用openssl解密易班API中的用户数据一、mcrypt扩展解密自从PHP版本更新到了7.1以上以后,mcrypt扩展被废弃,使用mcrypt扩展会出现如下图的报错。只能使用openssl来代替。然而易班轻应用提供的还是旧版本的mcrypt扩展,这将导致php版本升级…

Spring MVC的DispatcherServlet – Java开发人员应该知道的10件事

如果您使用过Spring MVC,那么您应该知道什么是DispatcherServlet? 它实际上是Spring MVC的心脏,确切地说是MVC设计模式或控制器的C语言。 应该由Spring MVC处理的每个Web请求都通过DispatcherServlet处理。 通常,它是Front Contro…