决策树基本 CART Python手写实现

ops/2024/11/19 2:00:19/

参考资料:
https://blog.csdn.net/weixin_45666566/article/details/107954454
https://blog.csdn.net/Elenstone/article/details/105328111

代码如下:
python">#-*- coding:utf-8 -*-
import numpy as np
import pandas as pd
import operatordef loadDataSet():csv = pd.read_csv(filepath_or_buffer=r'D:/PythonData/决策树.csv')dataSet = np.array(csv)labels = np.array(csv.columns)[:4]targets = sorted(np.unique(dataSet[:,-1:].flatten()), reverse=True)return dataSet, labels, targetsdef calcProbabilityEnt(dataSet, targets):numEntries = len(dataSet)  # 数据条数feaCounts = 0fea1 = targets[0]for featVec in dataSet:if featVec[-1] == fea1:feaCounts +=1probabilityEnt = float(feaCounts) / numEntriesreturn probabilityEnt    def splitDataSet(dataSet, index, value):retDataSet = []noRetDataSet = []for featVec in dataSet:if featVec[index]  == value:retDataSet.append(np.concatenate((featVec[:index],featVec[index+1:])))if featVec[index]  != value:noRetDataSet.append(np.concatenate((featVec[:index],featVec[index+1:])))return retDataSet,noRetDataSetdef chooseBestFeatureToSplit(dataSet, targets):numFeatures = len(dataSet[0]) - 1if numFeatures == 1:return 0bestGini = 1bestFeatureIndex = -1for i in range(numFeatures):# 每一列中的唯一值集合uniqueVals = set(example[i] for example in dataSet)feaGini = 0for value in uniqueVals:subDataSet,noSubDataSet = splitDataSet(dataSet=dataSet, index=i,value=value)prod = len(subDataSet) / float(len(dataSet))noPord = len(noSubDataSet) / float(len(dataSet))probabilityEnt = calcProbabilityEnt(subDataSet, targets)noProbabilityEnt = calcProbabilityEnt(noSubDataSet,targets)feaGini = round(prod * 2 * probabilityEnt * (1 - probabilityEnt) +  (noPord * (2 * noProbabilityEnt * (1 - noProbabilityEnt))),2)if bestGini > feaGini:bestGini = feaGinibestFeatureIndex = ireturn bestFeatureIndexdef majorityCnt(classList):classCount = {}for vote in classList:try:classCount[vote] += 1except KeyError:classCount[vote] = 1sortedClassCount = sorted(iterable=classCount.items(),key=operator.itemgetter(1),reverse=True)return sortedClassCount[0][0]def createTree(dataSet, labels,targets):classList = [example[-1]  for example in dataSet]if classList.count(classList[0]) == len(classList):return classList[0]if len(dataSet[0]) == 1:return majorityCnt(classList=classList)bestFeatIndex  = chooseBestFeatureToSplit(dataSet=dataSet,targets=targets)bestFeatLabel = labels[bestFeatIndex]np.delete(labels,bestFeatIndex)uniqueVals = set(example[bestFeatIndex] for example in dataSet) # 选出最优特征对应属性的唯一值myTree = {bestFeatLabel:{}} # 分类结果以字典形式保存for value in uniqueVals:subLabels = labels[:] # 深拷贝,拷贝后的值与原值无关(普通复制为浅拷贝,对原值或拷贝后的值的改变互相影响)subDataSet,noSubDataSet = splitDataSet(dataSet,bestFeatIndex,value)myTree[bestFeatLabel][value] = createTree(subDataSet,subLabels,targets) # 递归调用创建决策树return myTreeif __name__=='__main__':dataSet,labels,targets = loadDataSet()print(createTree(dataSet,labels,targets))
运行如果如下:
PS D:\PythonWorkSpace> & E:/anaconda3/python.exe d:/PythonWorkSpace/DecisionTreeDemo.py
{'有自己的房子': {'否': {'有工作': {'否': '不同意', '是': '同意'}}, '是': '同意'}}

http://www.ppmy.cn/ops/134832.html

相关文章

数据结构-布隆过滤器和可逆布隆过滤器

布隆过滤器家族 普通布隆过滤器基本原理代码实现 计数布隆过滤器基本原理代码实现 可逆布隆过滤器基本原理代码实现 参考 在解决缓存穿透问题时,往往会用到一种高效的数据结构-布隆过滤器,其能够快速过滤掉不存在的非法请求,但其也存在一定的…

【网络】HTTP 协议

目录 基本概念基于 HTTP 的系统组成HTTP 的基本性质 HTTP 请求头 & 响应头HTTP 的请求方法HTTP 的返回码HTTP 的 CookieHTTP 缓存 Cache-Control会话HTTP/1.x 的连接管理 基本概念 HTTP(Hypertext Transfer Protocol,超文本传输协议)是一…

ctfshow DSBCTF web部分wp

ctfshow 单身杯 web部分wp web 签到好玩的PHP 源码&#xff1a; <?php error_reporting(0); highlight_file(__FILE__);class ctfshow {private $d ;private $s ;private $b ;private $ctf ;public function __destruct() {$this->d (string)$this->d;$this…

【Golang】——Gin 框架中的模板渲染详解

Gin 框架支持动态网页开发&#xff0c;能够通过模板渲染结合数据生成动态页面。在这篇文章中&#xff0c;我们将一步步学习如何在 Gin 框架中配置模板、渲染动态数据&#xff0c;并结合静态资源文件创建一个功能完整的动态网站。 文章目录 1. 什么是模板渲染&#xff1f;1.1 概…

Mac 使用mac 原生工具将mp4视频文件提取其中的 mp3 音频文件

简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做笔…

ChatDev本地部署教程

ChatDev本地部署教程 &#x1f4d6; 概述 ChatDev 是一家虚拟软件公司&#xff0c;通过各种不同角色的智能体 运营&#xff0c;包括执行官&#xff0c;产品官&#xff0c;技术官&#xff0c;程序员 &#xff0c;审查员&#xff0c;测试员&#xff0c;设计师 等。这些智能体形…

「Mac玩转仓颉内测版14」PTA刷题篇5 - L1-005 考试座位号

本篇将继续讲解PTA平台上的题目 L1-005 考试座位号&#xff0c;通过考生准考证号与座位号的对应关系&#xff0c;掌握简单的数据查询与映射操作&#xff0c;进一步提升Cangjie编程语言的实际应用能力。 关键词 PTA刷题数据查询映射操作输入输出Cangjie语言 一、L1-005 考试座位…

DAY27|贪心算法Part01|LeetCode:455.分发饼干、376. 摆动序列、53. 最大子序和

贪心算法 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心算法并没有固定的套路&#xff0c;最难想的就在于如何通过局部最优去推出全局最优。在做一个题目的时候&#xff0c;靠自己手动模拟&#xff0c;如果模拟可行&#xff0c;就可以试一试贪心策略…