ID3

# encoding: gbkimport pandas as pd
import numpy  as npclass DecisionTree:def __init__(self):self.model = None# 计算熵def calEntropy(self, y):valRate = y.value_counts().apply(lambda x: x / y.size)  # 频次汇总 得到各个特征对应的概率valEntropy = np.inner(valRate, np.log2(valRate)) * -1return valEntropydef fit(self, xTrain, yTrain=pd.Series([],dtype=pd.StringDtype())):if yTrain.size == 0:  # 如果不传进参数yTrain,自动选择最后一列作为分类标签yTrain = xTrain.iloc[:, -1]xTrain = xTrain.iloc[:, :len(xTrain.columns) - 1]self.model = self.buildDecisionTree(xTrain, yTrain)return self.modeldef buildDecisionTree(self, xTrain, yTrain):propNamesAll = xTrain.columns # 各属性名# print(propNamesAll)yTrainCounts = yTrain.value_counts()if yTrainCounts.size == 1:# print('only one class', yTrainCounts.index[0])return yTrainCounts.index[0]entropyD = self.calEntropy(yTrain)maxGain = None # 最大信息增益maxEntropyPropName = None # 最大信息增益对应的属性for propName in propNamesAll:propDatas = xTrain[propName]propClassSummary = propDatas.value_counts().apply(lambda x: x / propDatas.size)  # 频次汇总 得到各个特征对应的概率sumEntropyByProp = 0for propClass, dvRate in propClassSummary.items():yDataByPropClass = yTrain[xTrain[propName] == propClass]entropyDv = self.calEntropy(yDataByPropClass)sumEntropyByProp += entropyDv * dvRategainEach = entropyD - sumEntropyByPropif maxGain is None or gainEach > maxGain:maxGain = gainEachmaxEntropyPropName = propName# print('select prop:', maxEntropyPropName, maxGain)propDatas = xTrain[maxEntropyPropName]propClassSummary = propDatas.value_counts().apply(lambda x: x / propDatas.size)  # 频次汇总 得到各个特征对应的概率retClassByProp = {}for propClass, dvRate in propClassSummary.items():whichIndex = xTrain[maxEntropyPropName] == propClass # whichIndex: pd.Series()类型xDataByPropClass = xTrain[whichIndex]yDataByPropClass = yTrain[whichIndex]del xDataByPropClass[maxEntropyPropName]  # 删除已经选择的属性列retClassByProp[propClass] = self.buildDecisionTree(xDataByPropClass, yDataByPropClass)return {'Node': maxEntropyPropName, 'Edge': retClassByProp}def predictBySeries(self, modelNode, data=pd.Series([],dtype=pd.StringDtype())):if not isinstance(modelNode, dict):return modelNodenodePropName = modelNode['Node'] # 节点所表示的属性prpVal = data.get(nodePropName)  # 待预测数据在该属性上的取值for edge, nextNode in modelNode['Edge'].items():if prpVal == edge:return self.predictBySeries(nextNode, data)return Nonedef predict(self, data):if isinstance(data, pd.Series): # 如果只有一个数据,则执行。此时数据是Series,DataframeDataframe的一行数据是一个Seriesreturn self.predictBySeries(self.model, data)elif isinstance (data, pd.DataFrame):  # 若是一组数据,则执行。 此时数据是Dataframereturn data.apply(lambda d: self.predictBySeries(self.model, d), axis=1) # axis-1: 对行应用函数data = pd.read_csv("xigua.csv", encoding="gbk")data_train  = data.iloc[:,:-1] # 除去标签
# print(pd.DataFrame(data_train))decisionTree = DecisionTree()
treeData = decisionTree.fit(data)
print("树结构为:\n",treeData)print(pd.DataFrame({'预测值': decisionTree.predict(data_train), '真实标签': data.iloc[:, -1]}))

C4.5

# encoding: gbkimport pandas as pd
import numpy  as npclass DecisionTree:def __init__(self):self.model = None# 计算熵def calEntropy(self, y):valRate = y.value_counts().apply(lambda x: x / y.size)  # 频次汇总 得到各个特征对应的概率valEntropy = np.inner(valRate, np.log2(valRate)) * -1return valEntropydef fit(self, xTrain, yTrain=pd.Series([],dtype=pd.StringDtype())):if yTrain.size == 0:  # 如果不传进参数yTrain,自动选择最后一列作为分类标签yTrain = xTrain.iloc[:, -1]xTrain = xTrain.iloc[:, :len(xTrain.columns) - 1]self.model = self.buildDecisionTree(xTrain, yTrain)return self.modeldef buildDecisionTree(self, xTrain, yTrain):"""Attribute:propNamesAll: 所有属性名maxGrain_ratio:最大信息增益率maxEntropyPropName:最大信息增益率对应的属性propName:某个属性名propClassSummary:某属性的各个取值的频率"""propNamesAll = xTrain.columns # 各属性名# print(propNamesAll)yTrainCounts = yTrain.value_counts()if yTrainCounts.size == 1:# print('only one class', yTrainCounts.index[0])return yTrainCounts.index[0]entropyD = self.calEntropy(yTrain) # 熵maxGrain_ratio = None # 最大信息增益率maxEntropyPropName = None # 最大信息增益率对应的属性for propName in propNamesAll:propDatas = xTrain[propName]propClassSummary = propDatas.value_counts().apply(lambda x: x / propDatas.size)  # 频次汇总 得到各个特征对应的概率sumEntropyByProp = 0IV = 0for propClass, dvRate in propClassSummary.items(): # propClass:属性的取值yDataByPropClass = yTrain[xTrain[propName] == propClass]entropyDv = self.calEntropy(yDataByPropClass) # 某属性的某个取值的熵sumEntropyByProp += entropyDv * dvRateIV += np.inner(dvRate,np.log(dvRate))*-1gainEach = entropyD - sumEntropyByPropGrain_ratio = gainEach/IVif maxGrain_ratio is None or Grain_ratio > maxGrain_ratio:maxGrain_ratio = Grain_ratiomaxEntropyPropName = propName# print('select prop:', maxEntropyPropName, maxGain)propDatas = xTrain[maxEntropyPropName]propClassSummary = propDatas.value_counts().apply(lambda x: x / propDatas.size)  # 频次汇总 得到各个特征对应的概率retClassByProp = {}for propClass, dvRate in propClassSummary.items():whichIndex = xTrain[maxEntropyPropName] == propClass # whichIndex: pd.Series()类型xDataByPropClass = xTrain[whichIndex]yDataByPropClass = yTrain[whichIndex]del xDataByPropClass[maxEntropyPropName]  # 删除已经选择的属性列retClassByProp[propClass] = self.buildDecisionTree(xDataByPropClass, yDataByPropClass)return {'Node': maxEntropyPropName, 'Edge': retClassByProp}def predictBySeries(self, modelNode, data=pd.Series([],dtype=pd.StringDtype())):if not isinstance(modelNode, dict):return modelNodenodePropName = modelNode['Node'] # 节点所表示的属性prpVal = data.get(nodePropName)  # 待预测数据在该属性上的取值for edge, nextNode in modelNode['Edge'].items():if prpVal == edge:return self.predictBySeries(nextNode, data)return Nonedef predict(self, data):if isinstance(data, pd.Series): # 如果只有一个数据,则执行。此时数据是Series,DataframeDataframe的一行数据是一个Seriesreturn self.predictBySeries(self.model, data)elif isinstance (data, pd.DataFrame):  # 若是一组数据,则执行。 此时数据是Dataframereturn data.apply(lambda d: self.predictBySeries(self.model, d), axis=1) # axis-1: 对行应用函数data = pd.read_csv("xigua.csv", encoding="gbk")data_train  = data.iloc[:,:-1] # 除去标签
# print(pd.DataFrame(data_train))decisionTree = DecisionTree()
treeData = decisionTree.fit(data)
print("树结构为:\n",treeData)print(pd.DataFrame({'预测值': decisionTree.predict(data_train), '真实标签': data.iloc[:, -1]}))

CART

# encoding: gbkimport pandas as pd
import numpy  as npclass DecisionTree:def __init__(self):self.model = None# 计算熵def Gini(self, y):valRate = y.value_counts().apply(lambda x: x / y.size)  # 频次汇总 得到各个特征对应的概率valGini = 1 - np.inner(valRate, valRate) * -1return valGinidef fit(self, xTrain, yTrain=pd.Series([],dtype=pd.StringDtype())):if yTrain.size == 0:  # 如果不传进参数yTrain,自动选择最后一列作为分类标签yTrain = xTrain.iloc[:, -1]xTrain = xTrain.iloc[:, :len(xTrain.columns) - 1]self.model = self.buildDecisionTree(xTrain, yTrain)return self.modeldef buildDecisionTree(self, xTrain, yTrain):propNamesAll = xTrain.columns # 各属性名# print(propNamesAll)yTrainCounts = yTrain.value_counts()if yTrainCounts.size == 1:# print('only one class', yTrainCounts.index[0])return yTrainCounts.index[0]entropyD = self.Gini(yTrain)maxGini_index = None # 最大基尼指数maxGiniName = None # 最大基尼指数对应的属性for propName in propNamesAll:propDatas = xTrain[propName]propClassSummary = propDatas.value_counts().apply(lambda x: x / propDatas.size)  # 频次汇总 得到各个特征对应的概率sumGiniByProp = 0for propClass, dvRate in propClassSummary.items():yDataByPropClass = yTrain[xTrain[propName] == propClass]Gini = self.Gini(yDataByPropClass)sumGiniByProp += Gini * dvRateif maxGini_index is None or sumGiniByProp > maxGini_index:maxGini_index = sumGiniByPropmaxGiniName = propName# print('select prop:', maxGiniName, maxGain)propDatas = xTrain[maxGiniName]propClassSummary = propDatas.value_counts().apply(lambda x: x / propDatas.size)  # 频次汇总 得到各个特征对应的概率retClassByProp = {}for propClass, dvRate in propClassSummary.items():whichIndex = xTrain[maxGiniName] == propClass # whichIndex: pd.Series()类型xDataByPropClass = xTrain[whichIndex]yDataByPropClass = yTrain[whichIndex]del xDataByPropClass[maxGiniName]  # 删除已经选择的属性列retClassByProp[propClass] = self.buildDecisionTree(xDataByPropClass, yDataByPropClass)return {'Node': maxGiniName, 'Edge': retClassByProp}def predictBySeries(self, modelNode, data=pd.Series([],dtype=pd.StringDtype())):if not isinstance(modelNode, dict):return modelNodenodePropName = modelNode['Node'] # 节点所表示的属性prpVal = data.get(nodePropName)  # 待预测数据在该属性上的取值for edge, nextNode in modelNode['Edge'].items():if prpVal == edge:return self.predictBySeries(nextNode, data)return Nonedef predict(self, data):if isinstance(data, pd.Series): # 如果只有一个数据,则执行。此时数据是Series,DataframeDataframe的一行数据是一个Seriesreturn self.predictBySeries(self.model, data)elif isinstance (data, pd.DataFrame):  # 若是一组数据,则执行。 此时数据是Dataframereturn data.apply(lambda d: self.predictBySeries(self.model, d), axis=1) # axis-1: 对行应用函数data = pd.read_csv("xigua.csv", encoding="gbk")data_train  = data.iloc[:,:-1] # 除去标签
# print(pd.DataFrame(data_train))decisionTree = DecisionTree()
treeData = decisionTree.fit(data)
print("树结构为:\n",treeData)print(pd.DataFrame({'预测值': decisionTree.predict(data_train), '真实标签': data.iloc[:, -1]}))

xigua.csv数据集

决策树ID3 C4.5 CART代码相关推荐

  1. 决策树数学原理(ID3,c4.5,cart算法)

    上面这个图就是一棵典型的决策树.我们在做决策树的时候,会经历两个阶段:构造和剪枝. 构造 简单来说,构造的过程就是选择什么属性作为节点的过程,那么在构造过程中,会存在三种节点: 根节点:就是树的最顶端 ...

  2. 决策树 基于python实现ID3,C4.5,CART算法

    实验目录 实验环境 简介 决策树(decision tree) 信息熵 信息增益(应用于ID3算法) 信息增益率(在C4.5算法中使用) 基尼指数(被用于CART算法) 实验准备 数据集 算法大体流程 ...

  3. 【机器学习】通过ID3,C4.5,CART算法构建决策树

    决策树 (一).决策树的简介 (二).构造决策树的三种构造方法 1.基于信息增益生成决策树(ID3算法) 2.基于信息增益率生成决策树(C4.5算法) 3.基于基尼指数生成决策树(CART算法) 总结 ...

  4. 【机器学习实战】构建/绘制决策树(ID3/C4.5)

    近来想要整理一下机器学习实验的代码,将一些基本算法的过程重新整理实现,并完善注释. 一.构建决策树 1.计算信息熵calculate_entropy(dataset) 2.按某一特征划分数据集spli ...

  5. 决策树模型(ID3/C4.5/CART)原理和底层代码解读 学习笔记

    本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 内容可能有不到之处,欢迎交流. 未经本人允许禁止转载 如下为个人的学习笔记,使用latex编写,再写成文本太麻烦 ...

  6. 机器学习:决策树及ID3,C4.5,CART算法描述

    文章目录 概念理解 熵: 条件熵: 信息增益,互信息: 信息增益比 基尼指数 ID3算法描述 C4.5算法描述 CART (Classification and Regression Tree)算法描 ...

  7. 【机器学习】 ID3,C4.5,CART决策树

    决策树模型在监督学习中非常常见,可用于分类(二分类.多分类)和回归.虽然将多棵弱决策树的Bagging.Random Forest.Boosting等tree ensembel 模型更为常见,但是&q ...

  8. cart算法_【统计学】决策树模型大比拼!ID3/C4.5/CART算法哪个更好用?

    - 点击上方"中国统计网"订阅我吧!- 决策树模型在监督学习中非常常见,可用于分类(二分类.多分类)和回归.虽然将多棵弱决策树的Bagging.Random Forest.Boos ...

  9. 通过实例理解决策树算法(ID3,C4.5,Cart算法)

    (一)实例:使用ID3算法给出"好苹果"的决策树 (二)决策树的工作原理 我们在做决策树的时候,会经历两个阶段:构造和剪枝. 构造原理--构造的过程就是选择什么属性作为节点的过程, ...

最新文章

  1. LLVM编译器基础架构与DragonEgg示例
  2. Python独领风骚,AI热情有所降温|2020 年技术趋势解读
  3. 2011最有用最潮的jQuery特效教程,前端们抱走吧~
  4. linux通常使用的 rc 和 .(点)文件
  5. python相关软件安装
  6. 方程的根的个数C语言xtu_零度根轨迹的绘制及情况讨论、以及参数根轨迹的原理介绍...
  7. 【Qt】QBoxLayout类详解
  8. matlab 求二值图像图形的面积和重心
  9. 目标跟踪学习笔记_2(particle filter初探1)
  10. 谈谈以前那位研发总监的工作
  11. opencv python 人脸识别 相似度_Python学习:基于Opencv来快速实现人脸识别(完整版)...
  12. 【CSS3】模拟太阳系八大行星运行轨迹
  13. 我本可以忍受黑暗,如果我不曾见过太阳。
  14. Windows提权基本原理,各位表哥了解下!
  15. [汇编语言]标志寄存器
  16. bilibiliC++概念遍览
  17. CISSP考试指南笔记:1.1安全目标
  18. 算法工程师的正常研发流程
  19. 挖掘长尾关键词的工具有哪些?
  20. XDOC云服务API(六)

热门文章

  1. 《重新认识你自己》八:与真实的自我相处
  2. nyoj-205--求余数--(大整数取模)
  3. NYOJ 123 士兵杀敌(四)
  4. YII2 整合百度UEditor上传图片到阿里云OSS
  5. [CCF] 201612-2 工资计算
  6. Java Web 高性能开发,前端的高性能
  7. 单元测试(Unit Test)学习
  8. Silverlight控件-Slider
  9. 微软欲2012年拿下智能手机系统四成市场
  10. WPF开发中遇到的问题及解决系列(一):How can I programmatically click a Button