决策树是一种典型的分类算法,通过属性水平的不断分支来构造一棵层次树,决策树算法的一个关键是判断优先选择哪一个指标进行树的分支,可以使用一些指标的增益来进行判断,下面列出了常用的三种指标:
(1)熵

p( j | t) 是类j在节点t的相对频率
(2)Gini系数

(3)误分率

根据上面三种指数的定义,在DecisionTree.py中补充相关代码,分别使用三种指标对给出的测试数据计算其分类结果,请调试通过并运行获取结果。
(1)按照熵指数的定义,实现熵的计算函数。
(2)按照Gini系数的定义,实现其计算函数。
(3)按照误分率的定义,实现其计算函数。

# -*- coding: utf-8 -*-import numpy as npclass DecisionTree:def __init__(self, chooseMethod):self._tree = Noneself._chooseMethod = chooseMethod# 计算熵的函数def _calcEntropy(self,y):#-------------------请在此处完成熵的计算函数---------------------------------num=y.shape[0]labelCounts={}for label in y:if label not in labelCounts.keys():#分别统计标签的个数,yes,no的个数labelCounts[label]=0labelCounts[label]+=1#计算熵entropy = 0.0prob_list=[]for key in labelCounts:prob = float(labelCounts[key])/numentropy -= prob* np.log2(prob)return entropy# 计算Gini系数的函数def _calcGini(self,y):#-------------------请在此处完成Gini系数的计算函数---------------------------------num=y.shape[0]labelCounts={}for label in y:if label not in labelCounts.keys():#分别统计标签的个数,yes,no的个数labelCounts[label]=0labelCounts[label]+=1#计算Ginip_sum = 0for key in labelCounts:prob = float(labelCounts[key])/nump_sum += prob**2gini = 1-p_sum  #求ginireturn gini# 计算误分率def _calcErrorRate(self,y):#-------------------请在此处完成误分率的计算函数---------------------------------num=y.shape[0]labelCounts={}for label in y:if label not in labelCounts.keys():#分别统计标签的个数,yes,no的个数labelCounts[label]=0labelCounts[label]+=1#计算Errorprob_list=[]for key in labelCounts:prob = float(labelCounts[key])/numprob_list.append(prob)  #求p列表最大值error = 1-max(prob_list) #求误分率return errordef _splitDataSet(self,X,y,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(self,X,y):       numFeatures = X.shape[1]oldIndex = self._chooseMethod(self, y)bestGain = 0.0bestFeatureIndex = -1        for i in range(numFeatures):        featList = X[:,i]uniqueVals = set(featList)newIndex = 0.0for value in uniqueVals:sub_X,sub_y = self._splitDataSet(X,y,i,value)prob = len(sub_y)/float(len(y))newIndex += prob * self._chooseMethod(self, sub_y)              indexGain = oldIndex - newIndexif (indexGain > bestGain):bestGain = indexGainbestFeatureIndex = ireturn bestFeatureIndexdef _majorityCnt(self,labelList):       labelCount={}for vote in labelList:if vote not in labelCount.keys(): labelCount[vote] = 0labelCount[vote] += 1sortedClassCount = sorted(labelCount.iteritems(),key=lambda x:x[1], reverse=True)return sortedClassCount[0][0]    def _createTree(self,X,y,featureIndex):labelList = list(y)        if labelList.count(labelList[0]) == len(labelList): return labelList[0]        if len(featureIndex) == 0:return self._majorityCnt(labelList)        bestFeatIndex = self._chooseBestFeatureToSplit(X,y) bestFeatStr = featureIndex[bestFeatIndex]featureIndex = list(featureIndex)featureIndex.remove(bestFeatStr)featureIndex = tuple(featureIndex)        myTree = {bestFeatStr:{}}featValues = X[:,bestFeatIndex]uniqueVals = set(featValues)for value in uniqueVals:            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):passelse: 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    def predict(self,X):        if isinstance(X,np.ndarray): passelse: try:X = np.array(X)except:raise TypeError("numpy.ndarray required for X")def _classify(tree,sample):featIndex = list(tree.keys())[0]secondDict = tree[featIndex]key = sample[int(featIndex[1:])]valueOfkey = secondDict[key]if isinstance(valueOfkey, dict): label = _classify(valueOfkey,sample)else: label = valueOfkeyreturn labelif 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)X = [[1, 2, 0, 1, 0],[0, 1, 1, 0, 1],[1, 0, 0, 0, 1],[2, 1, 1, 0, 1],[1, 1, 0, 1, 1]]
y = ['yes','yes','no','no','no']clf = DecisionTree(chooseMethod = DecisionTree._calcEntropy)
clf.fit(X,y)
print(clf.predict(X))   clf = DecisionTree(chooseMethod = DecisionTree._calcGini)
clf.fit(X,y)
print(clf.predict(X))   clf = DecisionTree(chooseMethod = DecisionTree._calcErrorRate)
clf.fit(X,y)
print(clf.predict(X))

Python 决策树计算熵、gini系数、误分率相关推荐

  1. Python Tricks(三)—— 计算误分率

    求均值暗含着 1. 求和 2. 除以长度 两个动作,1n∑ni=1\frac1n\sum_{i=1}^n np.mean(y != y_pred) # 误分 np.mean(y == y_pred) ...

  2. 树类算法之---决策树Cart树Gini系数就算原理。

    1.介绍 ID3树与CART树的区别: ID3算法中,选择的是信息增益来进行特征选择,信息增益大的特征优先选择. 而在C4.5中,选择的是信息增益比来选择特征,以减少信息增益容易选择特征值多的特征的缺 ...

  3. Python 决策树分类算法分析与实现

    决策树分类算法分析与实现 决策树分类算法是最为常见的一种分类算法,通过属性划分来建立一棵决策树,测试对象通过在树上由顶向下搜索确定所属的分类.决策树的构建主要需要解决两个问题: (1)树的每次成长,选 ...

  4. gini系数 决策树_决策树系列--ID3、C4.5、CART

    决策树系列,涉及很好算法,接下来的几天内,我会逐步讲解决策树系列算法 1.基本概念 首先我们理解什么是熵:熵的概念最早源于物理学,用于度量一个热力学系统的无序程度.在信息论里面,信息熵是衡量信息量的大 ...

  5. 大白话5分钟带你走进人工智能-第二十四节决策树系列之分裂流程和Gini系数评估(3)...

     第二十四节决策树系列之分裂流程和Gini系数评估(3) 上一节中我们讲解了决策树的数学表达形式,本节的话我们讲解决策树的分裂流程以及分裂条件的评估.我们基于决策树的递归表达式上:           ...

  6. 一文理清楚:熵,条件熵,KL散度(相对熵),交叉熵,联合熵,信息增益,信息增益比,GINI系数

    熵 熵是表示随机变量不确定性的度量. 设 X X X是一个有N个取值有限的随机变量,其概率分布为: P ( X = i ) = p i , i = 1 , 2... N P(X=i)=p_i , i= ...

  7. 决策树-熵计算-ID3算法(转)

    今天,我来讲解的是决策树.对于决策树来说,主要有两种算法:ID3算法和C4.5算法.C4.5算法是 对ID3算法的改进.今天主要先讲ID3算法,之后会讲C4.5算法和随机森林等. Contents   ...

  8. 【Python】近似熵,样本熵,模糊熵计算高效版

    文章目录 前言 整体思路 1 近似熵(Approximate Entropy, ApEn) 1.1 理论基础 1.2 python第三方库实现 1.3 基于多线程numpy矩阵运算实现 2 样本熵 ( ...

  9. 简单python代码实现决策树计算信息增益_python手动计算信息增益

    python手动计算信息增益 2019年5月23日 17:49 by wst 算法实践 概念阐述 对于决策树, 以前看了很多遍, 但是总感觉摸不着它. 里面有个很重要的概念: 信息增益. 今天就来手动 ...

  10. 分类模型的ROC曲线、AUC值、GINI系数、Lift、Gain、KS指标分别是什么?计算公式是什么?有什么意义?

    分类模型的ROC曲线.AUC值.GINI系数.Lift.Gain.KS指标分别是什么?计算公式是什么?有什么意义? 目录

最新文章

  1. 31个Python实战项目带你学会图像处理
  2. mongodb内存限制初探
  3. python程序员工作怎样-12个Python程序员面试必备问题与答案(小结)
  4. centos6.8下安装破解quartus prime16.0以及modelsim ae安装
  5. Java函数式编程整理
  6. git快速入门 push/clone/reset/merge/切换分支全都有
  7. 为什么选用自增量作为主键索引
  8. Herev Falciani推出新的加密货币和区块链项目
  9. 如何用prometheus监控k8s集群中业务pod的metrics
  10. 使用计算机音箱进行音乐播放的过程,插卡音箱音乐播放顺序调整及歌单式1
  11. Java开发不得不会!java私塾初级模拟银源代码
  12. Redhat Linux系列(Fedora,CentOS,Redhat enterprise)中一些常用软件
  13. 干货——常用医药数据库
  14. 算法复杂度-渐进分析 (Asymptotic Analysis)
  15. Java:爬取代理ip,并使用代理IP刷uv
  16. 安卓手机状态栏显示秒_让安卓手机上方状态栏时间显示精确到秒方法
  17. 图表xAxis文字竖排显示
  18. Pragma section
  19. IOS FMDB 使用
  20. 2021年全球渗膜式空气干燥器收入大约525百万美元,预计2028年达到580百万美元

热门文章

  1. 手把手教你写电商爬虫-第五课 京东商品评论爬虫 一起来对付反爬虫
  2. 网卡驱动:传输超时watchdog_timeo/ndo_tx_timeout
  3. 【新书推荐】Interpretable Machine Learning with Python
  4. (踩坑日记)Win10下安装Ubuntu18.04(包括NIVIDIA驱动安装)+主题美化+设置多cuda切换+通过anaconda下安装tensorflow1.x-gpu以及pytorch-gpu
  5. java按顺序生成编号_Java生成有规则的编号
  6. display属性详解
  7. 如何消除Permission is only granted to system apps报错
  8. Linux:进程(二)
  9. 来自H3C的降维打击:H3C BX54鲸路由评测体验
  10. dojo调用php,Dojo入门篇