Python 决策树计算熵、gini系数、误分率
决策树是一种典型的分类算法,通过属性水平的不断分支来构造一棵层次树,决策树算法的一个关键是判断优先选择哪一个指标进行树的分支,可以使用一些指标的增益来进行判断,下面列出了常用的三种指标:
(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系数、误分率相关推荐
- Python Tricks(三)—— 计算误分率
求均值暗含着 1. 求和 2. 除以长度 两个动作,1n∑ni=1\frac1n\sum_{i=1}^n np.mean(y != y_pred) # 误分 np.mean(y == y_pred) ...
- 树类算法之---决策树Cart树Gini系数就算原理。
1.介绍 ID3树与CART树的区别: ID3算法中,选择的是信息增益来进行特征选择,信息增益大的特征优先选择. 而在C4.5中,选择的是信息增益比来选择特征,以减少信息增益容易选择特征值多的特征的缺 ...
- Python 决策树分类算法分析与实现
决策树分类算法分析与实现 决策树分类算法是最为常见的一种分类算法,通过属性划分来建立一棵决策树,测试对象通过在树上由顶向下搜索确定所属的分类.决策树的构建主要需要解决两个问题: (1)树的每次成长,选 ...
- gini系数 决策树_决策树系列--ID3、C4.5、CART
决策树系列,涉及很好算法,接下来的几天内,我会逐步讲解决策树系列算法 1.基本概念 首先我们理解什么是熵:熵的概念最早源于物理学,用于度量一个热力学系统的无序程度.在信息论里面,信息熵是衡量信息量的大 ...
- 大白话5分钟带你走进人工智能-第二十四节决策树系列之分裂流程和Gini系数评估(3)...
第二十四节决策树系列之分裂流程和Gini系数评估(3) 上一节中我们讲解了决策树的数学表达形式,本节的话我们讲解决策树的分裂流程以及分裂条件的评估.我们基于决策树的递归表达式上: ...
- 一文理清楚:熵,条件熵,KL散度(相对熵),交叉熵,联合熵,信息增益,信息增益比,GINI系数
熵 熵是表示随机变量不确定性的度量. 设 X X X是一个有N个取值有限的随机变量,其概率分布为: P ( X = i ) = p i , i = 1 , 2... N P(X=i)=p_i , i= ...
- 决策树-熵计算-ID3算法(转)
今天,我来讲解的是决策树.对于决策树来说,主要有两种算法:ID3算法和C4.5算法.C4.5算法是 对ID3算法的改进.今天主要先讲ID3算法,之后会讲C4.5算法和随机森林等. Contents ...
- 【Python】近似熵,样本熵,模糊熵计算高效版
文章目录 前言 整体思路 1 近似熵(Approximate Entropy, ApEn) 1.1 理论基础 1.2 python第三方库实现 1.3 基于多线程numpy矩阵运算实现 2 样本熵 ( ...
- 简单python代码实现决策树计算信息增益_python手动计算信息增益
python手动计算信息增益 2019年5月23日 17:49 by wst 算法实践 概念阐述 对于决策树, 以前看了很多遍, 但是总感觉摸不着它. 里面有个很重要的概念: 信息增益. 今天就来手动 ...
- 分类模型的ROC曲线、AUC值、GINI系数、Lift、Gain、KS指标分别是什么?计算公式是什么?有什么意义?
分类模型的ROC曲线.AUC值.GINI系数.Lift.Gain.KS指标分别是什么?计算公式是什么?有什么意义? 目录
最新文章
- 31个Python实战项目带你学会图像处理
- mongodb内存限制初探
- python程序员工作怎样-12个Python程序员面试必备问题与答案(小结)
- centos6.8下安装破解quartus prime16.0以及modelsim ae安装
- Java函数式编程整理
- git快速入门 push/clone/reset/merge/切换分支全都有
- 为什么选用自增量作为主键索引
- Herev Falciani推出新的加密货币和区块链项目
- 如何用prometheus监控k8s集群中业务pod的metrics
- 使用计算机音箱进行音乐播放的过程,插卡音箱音乐播放顺序调整及歌单式1
- Java开发不得不会!java私塾初级模拟银源代码
- Redhat Linux系列(Fedora,CentOS,Redhat enterprise)中一些常用软件
- 干货——常用医药数据库
- 算法复杂度-渐进分析 (Asymptotic Analysis)
- Java:爬取代理ip,并使用代理IP刷uv
- 安卓手机状态栏显示秒_让安卓手机上方状态栏时间显示精确到秒方法
- 图表xAxis文字竖排显示
- Pragma section
- IOS FMDB 使用
- 2021年全球渗膜式空气干燥器收入大约525百万美元,预计2028年达到580百万美元
热门文章
- 手把手教你写电商爬虫-第五课 京东商品评论爬虫 一起来对付反爬虫
- 网卡驱动:传输超时watchdog_timeo/ndo_tx_timeout
- 【新书推荐】Interpretable Machine Learning with Python
- (踩坑日记)Win10下安装Ubuntu18.04(包括NIVIDIA驱动安装)+主题美化+设置多cuda切换+通过anaconda下安装tensorflow1.x-gpu以及pytorch-gpu
- java按顺序生成编号_Java生成有规则的编号
- display属性详解
- 如何消除Permission is only granted to system apps报错
- Linux:进程(二)
- 来自H3C的降维打击:H3C BX54鲸路由评测体验
- dojo调用php,Dojo入门篇