既能做分类,又能做回归。
分类:基尼值作为节点分类依据。
回归:最小方差作为节点的依据。

节点越不纯,基尼值越大,熵值越大

pi表示在信息熵部分中有介绍,如下图中介绍

方差越小越好。

选择最小的那个0.3

代码:

  1. #整个c4.5决策树的所有算法:
  2. import numpy as np
  3. import operator
  4.  
  5. def creatDataSet():
  6. """
  7. outlook-> 0:sunny | 1:overcast | 2:rain
  8. temperature-> 0:hot | 1:mild | 2:cool
  9. humidity-> 0:high | 1:normal
  10. windy-> 0:false | 1:true
  11. """
  12. dataSet = np.array([[0, 0, 0, 0, 'N'],
  13. [0, 0, 0, 1, 'N'],
  14. [1, 0, 0, 0, 'Y'],
  15. [2, 1, 0, 0, 'Y'],
  16. [2, 2, 1, 0, 'Y'],
  17. [2, 2, 1, 1, 'N'],
  18. [1, 2, 1, 1, 'Y']])
  19. labels = np.array(['outlook', 'temperature', 'humidity', 'windy'])
  20. return dataSet, labels
  21.  
  22. def createTestSet():
  23. """
  24. outlook-> 0:sunny | 1:overcast | 2:rain
  25. temperature-> 0:hot | 1:mild | 2:cool
  26. humidity-> 0:high | 1:normal
  27. windy-> 0:false | 1:true
  28. """
  29. testSet = np.array([[0, 1, 0, 0],
  30. [0, 2, 1, 0],
  31. [2, 1, 1, 0],
  32. [0, 1, 1, 1],
  33. [1, 1, 0, 1],
  34. [1, 0, 1, 0],
  35. [2, 1, 0, 1]])
  36. return testSet
  37.  
  38. def dataset_entropy(dataset):
  39. """
  40. 计算数据集的信息熵
  41. """
  42. classLabel=dataset[:,-1]
  43. labelCount={}
  44. for i in range(classLabel.size):
  45. label=classLabel[i]
  46. labelCount[label]=labelCount.get(label,0)+1 #将所有的类别都计算出来了
  47. #熵值(第一步)
  48. cnt=0
  49. for k,v in labelCount.items():
  50. cnt += -v/classLabel.size*np.log2(v/classLabel.size)
  51.  
  52. return cnt
  53.  
  54. #接下来切分,然后算最优属性
  55. def splitDataSet(dataset,featureIndex,value):
  56. subdataset=[]
  57. #迭代所有的样本
  58. for example in dataset:
  59. if example[featureIndex]==value:
  60. subdataset.append(example)
  61. return np.delete(subdataset,featureIndex,axis=1)
  62.  
  63. def classLabelPi(dataset):
  64. #多叉树
  65. classLabel=dataset[:,-1]
  66. labelCount={}
  67. for i in range(classLabel.size):
  68. label=classLabel[i]
  69. labelCount[label]=labelCount.get(label,0)+1
  70. valueList=list(labelCount.values())
  71. sum=np.sum(valueList)
  72. pi=0
  73. for i in valueList:
  74. pi+=(i/sum)**2
  75. return pi
  76.  
  77. def chooseBestFeature(dataset,labels):
  78. """
  79. 选择最优特征,但是特征是不包括名称的。
  80. 如何选择最优特征:增益率最小
  81. """
  82. #特征的个数
  83. featureNum=labels.size
  84. baseEntropy=dataset_entropy(dataset)
  85. #设置最大增益值
  86. maxRatio,bestFeatureIndex=0,None
  87. #样本总数
  88. n=dataset.shape[0]
  89. #最小基尼值
  90. minGini=1
  91. for i in range(featureNum):
  92. #指定特征的条件熵
  93. featureEntropy=0
  94. gini=0
  95. #返回所有子集
  96. featureList=dataset[:,i]
  97. featureValues=set(featureList)
  98. for value in featureValues:
  99. subDataSet=splitDataSet(dataset,i,value)
  100. pi=subDataSet.shape[0]/n
  101. gini+=pi*(1-classLabelPi(subDataSet))
  102. if minGini > gini:
  103. minGini=gini
  104. bestFeatureIndex=i
  105. return bestFeatureIndex #最佳增益
  106.  
  107. def mayorClass(classList):
  108. labelCount={}
  109. for i in range(classList.size):
  110. label=classList[i]
  111. labelCount[label]=labelCount.get(label,0)+1
  112. sortedLabel=sorted(labelCount.items(),key=operator.itemgetter(1),reverse=True)
  113. return sortedLabel[0][0]
  114.  
  115. def createTree(dataset,labels):
  116. """
  117. 参考hunt算法那张图片
  118. """
  119. classList=dataset[:,-1]
  120. if len(set(dataset[:,-1]))==1:
  121. return dataset[:,-1][0] #返回类别
  122. if labels.size==0 or len(dataset[0])==1: #条件熵最少的一定是类别最多的
  123. #条件熵算不下去的时候,
  124. return mayorClass(classList)
  125. bestFeatureIndex=chooseBestFeature(dataset,labels)
  126. bestFeature=labels[bestFeatureIndex]
  127. dtree={bestFeature:{}} #用代码表示这棵树
  128. featureList=dataset[:,bestFeatureIndex]
  129. featureValues=set(featureList)
  130. for value in featureValues:
  131. subdataset=splitDataSet(dataset,bestFeatureIndex,value)
  132. sublabels=np.delete(labels,bestFeatureIndex)
  133. dtree[bestFeature][value]=createTree(subdataset,sublabels) #将原始的labels干掉一列
  134. return dtree
  135.  
  136. def predict(tree,labels,testData):
  137. #分类,预测
  138. rootName=list(tree.keys())[0]
  139. rootValue=tree[rootName]
  140. featureIndex =list(labels).index(rootName)
  141. classLabel=None
  142. for key in rootValue.keys():
  143. if testData[featureIndex]==int(key):
  144. if type(rootValue[key]).__name__=="dict":
  145. classLabel=predict(rootValue[key],labels,testData) #递归
  146. else:
  147. classLabel=rootValue[key]
  148. return classLabel
  149.  
  150. def predictAll(tree,labels,testSet):
  151. classLabels=[]
  152. for i in testSet:
  153. classLabels.append(predict(tree,labels,i))
  154. return classLabels
  155.  
  156. if __name__ == "__main__":
  157. dataset,labels=creatDataSet()
  158. # print(dataset_entropy(dataset)
  159. # s=splitDataSet(dataset,0)
  160. # for item in s:
  161. # print(item)
  162. tree=createTree(dataset,labels)
  163. testSet=createTestSet()
  164. print(predictAll(tree,labels,testSet))
  165. ····························································
  166. 输出:
  167. ['N', 'N', 'Y', 'N', 'Y', 'Y', 'N']

决策树3:基尼指数--Gini index(CART)的更多相关文章

  1. Python实现CART(基尼指数)

    Python实现CART(基尼指数) 运行环境 Pyhton3 treePlotter模块(画图所需,不画图可不必) matplotlib(如果使用上面的模块必须) 计算过程 st=>start ...

  2. B-经济学-基尼指数

    目录 基尼指数 一.基尼指数简介 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/ni ...

  3. (二)《机器学习》(周志华)第4章 决策树 笔记 理论及实现——“西瓜树”——CART决策树

    CART决策树 (一)<机器学习>(周志华)第4章 决策树 笔记 理论及实现——“西瓜树” 参照上一篇ID3算法实现的决策树(点击上面链接直达),进一步实现CART决策树. 其实只需要改动 ...

  4. 决策树(上)-ID3、C4.5、CART

    参考资料(要是对于本文的理解不够透彻,必须将以下博客认知阅读,方可全面了解决策树): 1.https://zhuanlan.zhihu.com/p/85731206 2.https://zhuanla ...

  5. 【机器学习速成宝典】模型篇06决策树【ID3、C4.5、CART】(Python版)

    目录 什么是决策树(Decision Tree) 特征选择 使用ID3算法生成决策树 使用C4.5算法生成决策树 使用CART算法生成决策树 预剪枝和后剪枝 应用:遇到连续与缺失值怎么办? 多变量决策 ...

  6. 机器学习总结(八)决策树ID3,C4.5算法,CART算法

    本文主要总结决策树中的ID3,C4.5和CART算法,各种算法的特点,并对比了各种算法的不同点. 决策树:是一种基本的分类和回归方法.在分类问题中,是基于特征对实例进行分类.既可以认为是if-then ...

  7. 决策树之ID3,C4.5及CART

    决策树的基本认识  决策树学习是应用最广的归纳推理算法之一,是一种逼近离散值函数的方法,年,香农引入了信息熵,将其定义为离散随机事件出现的概率,一个系统越是有序,信息熵就越低,反之一个系统越是混乱,它 ...

  8. Theoretical comparison between the Gini Index and Information Gain criteria

    Knowledge Discovery in Databases (KDD) is an active and important research area with the promise for ...

  9. 多分类度量gini index

    第一份工作时, 基于 gini index 写了一份决策树代码叫ctree, 用于广告推荐. 今天想起来, 好像应该有开源的其他方法了. 参考 https://www.cnblogs.com/mlhy ...

随机推荐

  1. C#基于Redis实现分布式锁

    [本博客属于原创,如需转载,请注明出处:https://www.cnblogs.com/gdouzz/p/12097968.html] 最近研究库存的相关,在高峰期经常出现超卖等等情况,最后根据采用是 ...

  2. linux /etc/fstab 文件详细说明(整理版)

    转至:https://blog.csdn.net/xiaolongwang2010/article/details/8657332?utm_medium=distribute.pc_relevant. ...

  3. video视频控件

    <!-- 视频播放内容 --> <!-- autoplay准备就绪会自动播放 --> <!-- controls,要自定义得去掉这个 -->   <video ...

  4. csv/json/list/datatable导出为excel的通用模块设计

    导出excel的场景我一般都是一个List直接导出成一张sheet,用Npoi.Mapper库很方便,最近我经常是需要将接口返回的jsonarray转成一张excel表,比如从elasticsearc ...

  5. MySQL之InnoDB存储引擎 - 读书笔记

    1. MySQL 的存储引擎 MySQL 数据库的一大特色是有插件式存储引擎概念.日常使用频率最高的两种存储引擎: InnoDB 存储引擎支持事务,其特点是行锁设计.支持外键.非锁定读(默认读取操作不 ...

  6. .net core项目搭建swagger接口实现简单增删改查

    .net core搭建swagger 1,新建立.net core项目(这里不再细说) 2,引入NuGet程序包 3,建立项目之后在Startup类中配置swagger 这里我直接把代码贴出来: 在C ...

  7. 扩展我们的分析处理服务(Smartly.io):使用 Citus 对 PostgreSQL 数据库进行分片

    原文:Scaling Our Analytical Processing Service: Sharding a PostgreSQL Database with Citus 在线广告商正在根据绩效数 ...

  8. php 23种设计模式 - 命令模式

    命令模式 将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化.对请求排队或记录请求日志,以及支持撤销的操作. 命令模式以松散耦合主题为基础,发送消息.命令和请求,或通过一组处理程序发送 ...

  9. 15、mysql主从复制的原理

    mysql主从复制 要想实现mysql的主从复制需要先了解二进制日志(bin log)和中继日志(relay log). 二进制日志(bin log) binlog即binary log,二进制日志文 ...

  10. Unknown column ‘avatar_url‘ in ‘field list‘

    报错: Unknown column 'avatar_url' in 'field list' 解决: 查看mysql数据库中字段名前面是否有空格或则换行