机器学习-决策树

【机器学习】九大决策树模型总结 这篇博客深入探讨了九种不同的决策树模型,每种模型都拥有其独特的特点和应用场景。我将带您了解一些经典的模型,让你理解它们的工作原理,并在实践中灵活运用它们。 阅读详情

手写笔记

请添加图片描述

决策树算法实现

""" @File   : DecisionTree
    @Author : BabyMuu
    @Time   : 2022/4/12 13:00
"""
import pandas as pd
import numpy as np


class DecisionTree:
    def __init__(self, feature, target, labels, max_depth=None):
        """"""
        self.feature = feature.copy()
        self.target = target.copy()
        self.labels = labels
        self.feature_labels = []
        self.tree_height = self.feature.shape[1]
        if max_depth:
            self.max_depth = max_depth
        else:
            self.max_depth = self.tree_height
        self.tree = self.init(self.feature, self.target, self.labels)

    def init(self, feature, target, labels):
        """创建决策树"""
        # 设置停止条件
        if target.nunique() == 1:
            # 如果当前target的值全为一个值 则直接返回该值即可
            return target.unique()[0]
        if self.tree_height - feature.shape[1] == self.max_depth:
            # 如果所有特征全部分完, 仍然没有完全分清, 则根据少数服从多数进行判断属于哪个类别
            return self.majority_cnt(target)
        # 获得 特征中 评价指标最好的 特征索引
        best_feature_label = \
            self.choose_best_feature(feature, target)
        # 将选出的特征放入特征列表中
        self.feature_labels.append(best_feature_label)
        # 删除已经放入树中的特征
        labels = labels.drop(best_feature_label)
        cur_tree = {best_feature_label: {}}  # 创建根节点
        # 获取当前特征中有多少个不同的值
        unique_vals = feature[best_feature_label].unique()
        for value in unique_vals:
            index = feature[feature[best_feature_label] == value].index
            f = feature[labels].loc[index]
            t = target.loc[index]
            cur_tree[best_feature_label][value] = self.init(f, t, labels)
        return cur_tree

    @staticmethod
    def majority_cnt(target: pd.DataFrame):
        """计算当前节点中哪一个类别的比较多"""
        return target.describe()['top']

    def choose_best_feature(self, features, target: pd.DataFrame):
        """选择信息增益最高的特征"""
        # 1, 计算基础信息熵
        base_entropy = self.cal_entropy(target.value_counts())
        print(base_entropy)
        # 2, 计算所有特征的信息增益
        info_gain = self.cal_info_gain(features, target, base_entropy)
        # 3, 返回所有特征中信息增益最大的特征名称
        return sorted(info_gain, key=lambda x: info_gain[x], reverse=True)[0]

    def cal_info_gain(self, features: pd.DataFrame, target, base_info_gain):
        """计算信息增益"""
        # 1, 组合特征和标签
        features['target'] = target
        label_counts = {}
        feature_entropy = {}
        # 2, 遍历每个特征, 获取(特征值, target值) : 数量
        for feature in features[features.columns.drop('target')]:
            # (特征值, target值) : 数量
            value_counts = features.groupby(feature)['target'].value_counts()
            # 特征值
            feature_unique = features[feature].unique().tolist()
            label_counts[feature] = (value_counts, feature_unique)
        # 删除添加的标签
        features.drop(columns='target', inplace=True)
        # 3, 遍历获取每一个特征的信息增益
        for feature in label_counts:
            label_count, value_count = label_counts[feature]
            entropy = 0  # 信息熵
            for value in value_count:
                # 计算每个特征值对应的信息熵
                entropy += self.cal_entropy(
                    label_count[value]) * label_count[value].sum()
            # 计算当前 feature 的信息增益
            feature_entropy[feature] = \
                base_info_gain - entropy / label_count.sum()
        # 4, 返回信息增益列表
        return feature_entropy

    @staticmethod
    def cal_entropy(target_count):
        """计算信息熵"""
        value = target_count / target_count.sum()
        print(value)
        return -np.dot(np.log2(value), value.T)

决策树可视化

""" @File   : draw_tree
    @Author : BabyMuu
    @Time   : 2022/4/13 9:09
"""
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


# 树信息统计 叶子节点数量 和 树深度
def getTreeSize(decisionTree):
    nodeName = list(decisionTree.keys())[0]
    nodeValue = decisionTree[nodeName]
    leafNum = 0
    treeDepth = 0
    leafDepth = 0
    for val in nodeValue.keys():
        if type(nodeValue[val]) == dict:
            leafNum += getTreeSize(nodeValue[val])[0]
            leafDepth = 1 + getTreeSize(nodeValue[val])[1]
        else:
            leafNum += 1
            leafDepth = 1
        treeDepth = max(treeDepth, leafDepth)
    return leafNum, treeDepth


decisionNodeStyle = dict(boxstyle="sawtooth", fc="0.8")
leafNodeStyle = {"boxstyle": "round4", "fc": "0.8"}
arrowArgs = {"arrowstyle": "<-"}


# 画节点
def plotNode(nodeText, centerPt, parentPt, nodeStyle):
    createPlot.ax1.annotate(nodeText, xy=parentPt, xycoords="axes fraction",
                            xytext=centerPt
                            , textcoords="axes fraction", va="center",
                            ha="center", bbox=nodeStyle, arrowprops=arrowArgs)


# 添加箭头上的标注文字
def plotMidText(centerPt, parentPt, lineText):
    xMid = (centerPt[0] + parentPt[0]) / 2.0
    yMid = (centerPt[1] + parentPt[1]) / 2.0
    createPlot.ax1.text(xMid, yMid, lineText)


# 画树
def plotTree(decisionTree, parentPt, parentValue):
    # 计算宽与高
    leafNum, treeDepth = getTreeSize(decisionTree)
    # 在 1 * 1 的范围内画图,因此分母为 1
    # 每个叶节点之间的偏移量
    plotTree.xOff = plotTree.figSize / (plotTree.totalLeaf - 1)
    # 每一层的高度偏移量
    plotTree.yOff = plotTree.figSize / plotTree.totalDepth
    # 节点名称
    nodeName = list(decisionTree.keys())[0]
    # 根节点的起止点相同,可避免画线;如果是中间节点,则从当前叶节点的位置开始,
    #      然后加上本次子树的宽度的一半,则为决策节点的横向位置
    centerPt = (plotTree.x + (leafNum - 1) * plotTree.xOff / 2.0, plotTree.y)
    # 画出该决策节点
    plotNode(nodeName, centerPt, parentPt, decisionNodeStyle)
    # 标记本节点对应父节点的属性值
    plotMidText(centerPt, parentPt, parentValue)
    # 取本节点的属性值
    treeValue = decisionTree[nodeName]
    # 下一层各节点的高度
    plotTree.y = plotTree.y - plotTree.yOff
    # 绘制下一层
    for val in treeValue.keys():
        # 如果属性值对应的是字典,说明是子树,进行递归调用; 否则则为叶子节点
        if type(treeValue[val]) == dict:
            plotTree(treeValue[val], centerPt, str(val))
        else:
            plotNode(treeValue[val], (plotTree.x, plotTree.y), centerPt,
                     leafNodeStyle)
            plotMidText((plotTree.x, plotTree.y), centerPt, str(val))
            # 移到下一个叶子节点
            plotTree.x = plotTree.x + plotTree.xOff
    # 递归完成后返回上一层
    plotTree.y = plotTree.y + plotTree.yOff


# 画出决策树
def createPlot(decisionTree):
    fig = plt.figure(1, facecolor="white")
    fig.clf()
    axprops = {"xticks": [], "yticks": []}
    createPlot.ax1 = plt.subplot(111, frameon=False, **axprops)
    # 定义画图的图形尺寸
    plotTree.figSize = 1.0
    # 初始化树的总大小
    plotTree.totalLeaf, plotTree.totalDepth = getTreeSize(decisionTree)
    # 叶子节点的初始位置x 和 根节点的初始层高度y
    plotTree.x = 0
    plotTree.y = plotTree.figSize
    plotTree(decisionTree, (plotTree.figSize / 2.0, plotTree.y), "")
    plt.show()

简单测试

""" @File   : demo1
    @Author : BabyMuu
    @Time   : 2022/5/6 13:01
"""
from pprint import pprint

import pandas as pd

from handwritten_algorithm_model.decision_tree.DecisionTree import DecisionTree
from handwritten_algorithm_model.template.draw.draw_tree import createPlot

data_path = '../_data/sales_data.xls'
data = pd.read_excel(data_path, index_col='序号')
feature = data[data.columns.drop('销量')]
target = data['销量']
tree = DecisionTree(feature, target, feature.columns)
pprint(tree.tree)
createPlot(tree.tree)

可视化结果

在这里插入图片描述

机器学习第五章之决策树模型 机器学习专题系列 阅读详情

相关推荐

机器学习西瓜书&南瓜书——决策树模型

决策树模型是机器学习领域最常见的模型之一,甚至有人说决策树模型上机器学习领域的水平上升了一个台阶。决策树的基本思想是根据样本的一些特征来构造一个树,树的每个分支节点都是一个分支属性,每个分支节点都会针对当前节点的属性把样本一分为二,有这个属性或者说在这个属性上表现为yes的数据被分为一个集合,没有这个属性或者在这个属性上表现为no的数据呗分为一个集合。一个完整的决策过程包含若干个子决策,最终得到判定结果。以“找出好瓜”这个任务为例,假设西瓜有“色泽“,”根蒂“,”敲击声“这三个属性,假设先判定“色泽”这个属

m0_73556978的博客 1840

Easyui DataGrid拖动到Tree

采用了网上找到的实现方式,核心逻辑就是参考官方datagrid-dnd.js的写法,把关键拖动目标从grid to grid改成grid to tree 效果图 前端代码 <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <link

℡メ㏑╭ァ小凯 442

机器学习——决策树模型:Python实现

机器学习——决策树模型:Python实现欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你

qq_34357269的博客 8772

决策树挑出好西瓜

决策树挑出好西瓜一、ID3算法1.包引入2.读取数据3.代码编写4.结果二、sklearn实现ID3、CART算法实现1.ID32.CART三、总结1.ID3算法2.CART算法四、参考 一、ID3算法 1.包引入 import numpy as np import pandas as pd import sklearn.tree as st import math import matplotlib import os import matplotlib.pyplot as plt 2.读取数据 dat

xyf_fate的博客 320

Python 机器学习 回归决策树

决策树是一种常用于分类和回归的机器学习算法。在回归问题中,决策树用于预测连续值的输出,如价格或温度等。回归决策树是一种用于回归问题的决策树模型。与分类决策树(输出离散标签)不同,回归决策树的目标是预测一个连续的数值。回归决策树的工作原理与分类树相似,但在决定分支如何划分时,它们寻求最小化的是目标变量的方差或均方误差(MSE),而不是不纯度(如基尼不纯度或熵)。

weixin_42098295的博客 1461

Python实现DescionTree决策树 --- 选择切分数据集的最佳特征

# 选择切分数据集的最佳特征 def choose_best_feature_to_split(self, data_set): num_features = len(data_set[0]) - 1 # 计算信息熵 base_entropy = self.calc_shannon_ent(data_set) #best_i...

杨鑫newlife的专栏 2233

决策树---使用三种方法对数据建立决策树

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、决策树原理 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:通过自己搜集数据对决策树分类进行测试。 提示:以下是本篇文章正文内容,下面案例可供参考 一、决策树原理 决策树是一个预测判别模型。它代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,每个分支路径代表某个可能的属性值,每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的...

weixin_48882021的博客 7013

【ML】基于机器学习的心脏病预测研究(附代码和数据集,决策树模型)

【ML】基于机器学习的心脏病预测研究(附代码和数据集,决策树模型)

学无止境、积少成多、厚积薄发 632

决策树算法(四)——选取最佳特征划分数据集

写在前面的话咦,好神奇,我今天发现我莫名其妙的成了小三。原来我被卖了还不知道,还帮人家宣传博客和微信公众账号。我放弃了自己规划好的人生,然后决定跟另一个在一起,然后发现原来他有女朋友。我今天有点头大哎。哈哈哈哈哈。原来被劈腿也会被我遇到呢。可怜了我这个系列的博客,写的这么好却没有人知道欣赏。就像我这么好,哈哈哈,我好不要脸,却。。。。如果您有任何地方看不懂的,那一定是我写的不好,请您告诉我,我会争取

编程小栈 2万+

单细胞专题(1) | 单细胞转录组研究样本准备指南(上)

单细胞RNA测序(scRNA-seq)是目前最前沿,能进行大规模实验的转录组研究技术,为理解细胞组成和动态生物学过程提供了很多新的见解。单细胞研究已经为我们理解发育过程,老化和疾病(如癌症)等提供了大量数据。在这里,小编主要就前期的样本准备与保存需注意问题给大家进行讲解,以备大家在不同的研究场景和研究背景下,走好单细胞转录组学研究的第一步。

bioyigene的博客 4232

RK3588部署rtmpose模型

摘要: 本文详细介绍了在RK3588开发板上部署RTMPose模型的全流程。首先在Ubuntu环境中搭建MMCV框架,通过MMPose工具将PTH模型转换为ONNX格式。随后使用RKNN-Toolkit2将ONNX模型转换为RKNN格式,并完成开发板部署。关键步骤包括模型转换(PTH→ONNX→RKNN)、环境配置和推理验证,最终实现人体姿态估计功能。整个过程涉及MMPose、RKNN-Toolkit等工具链的使用,为边缘计算场景下的实时姿态分析提供了可行方案。

qq_44224801的博客 1221

[机器学习]决策树模型及实验

机器学习决策树

weixin_73049545的博客 2300

DDR内存条选购避坑指南:单Rank vs 双Rank性能实测对比(附2024年颗粒推荐)

本文深入解析了内存条中单Rank与双Rank设计的原理与性能差异。通过实战测试对比,揭示了双Rank内存在高负载场景(如3D渲染、视频剪辑)中凭借Rank Interleaving技术带来的显著性能优势,并提供了2024年针对不同用户需求的DDR4/DDR5内存选购策略与避坑指南。

ik678901的博客 1140

[ML]机器学习_决策树模型

决策树是一种经典的监督学习模型,它通过对数据集进行递归分区,最终形成一个树形结构,树上每个节点都对应一个关于特征的判断条件,而叶节点则是对应一个分类结果或者回归值。决策树可以用于分类(C4.5、CART)和回归(CART),其中分类树解决离散变量,回归树解决连续变量。决策树的构建过程一般包括以下几个步骤:特征选择:选择最优的特征作为当前节点的分裂依据,这一步通常根据信息熵或者基尼不纯度进行计算。

iazzz的博客 630

平衡电桥检测高压绝缘电阻的原理

检测绝缘漏电的高压拓扑如下:BMU需要连接BAT+,BAT-和PE线,并测量电池总压(Ubatt)和负母线电压(Un),并计算出正母线电压(Up)。

booksyhay的专栏 1万+

从2D到3D地图开发:手把手教你用Cesium+Three.js实现卫星轨迹可视化(含代码片段)

本文详细介绍了如何结合Cesium与Three.js实现从2D到3D的卫星轨迹可视化。通过对比传统Web GIS框架的局限,阐述了Cesium处理三维地理与轨道数据、Three.js负责高级图形渲染的分工优势,并提供了从环境搭建、坐标同步到动态粒子效果实现的完整代码实战指南。

nut55的博客 673

机器学习——决策树(Decision Tree)

决策树是一种模仿人类决策过程的机器学习算法,它通过学习简单的决策规则来预测目标变量的值。决策树模型由节点和边组成,形成一个树状结构。树的每个内部节点表示一个特征上的判断,每个边代表判断的结果,而每个叶子节点代表一个类别或决策结果。今天由我来向大家介绍决策树的相关算法以及如何构造和实现决策树。决策树(Decision Tree)是从一组无次序、无规则,但有类别标号的样本集中推导出的、树形表示的分类规则。一般的,一棵决策树包含一个根结点、若干个内部结点(中间结点)和若干个叶子结点。

zdx2585503940的博客 5482

【faers数据库-R语言】

摘要:本文详细介绍了FAERS数据库不良反应信号挖掘的完整流程,包括数据解压导入(R代码示例)、数据结构理解、数据清洗(缺失值处理、标准化、合并和编码映射)、信号挖掘准备(药物-反应组合表创建)以及信号强度指标计算(PRR和ROR)。重点阐述了数据清洗的关键步骤,如缺失值处理(colSums(is.na()))、数据标准化(toupper()、as.Date())和表合并(merge()),并提供了完整的R语言实现代码。最后强调结果需结合临床知识解读,建议使用data.table等高效工具处理大数据。整个流

weixin_46587777的博客 1505

《machine learning in action》机器学习 算法学习笔记 决策树模型

决策树模型 重要任务:是为了理解数据中所蕴含的知识信息,因此决策树可以使用不熟悉的数据集合,并从中提取出一系列规则,这些机器根据数据集创建规则的过程就是机器学习的过程。 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。 缺点:可能会产生过度匹配问题。 范例:专家系统。 如何构造决策树: 编写构造树的python代码 度量算法成功率 递归建立分类器 Matplotlib绘制决策树图 利用信息论划分数据集,伪代码: IF (整个数据集属于同一个类型) return 类

m0_52186223的博客 1040

多思计组实验实验六 微程序控制器实验

实验六 微程序控制器实验

qq_53089329的博客 3791

【RT-DETR实战】RT-DETR实战手记(200):端侧实时目标检测,下一步往哪儿走?

昨天深夜调一个模型部署,在树莓派4B上跑RT-DETR-nano,帧率死活卡在8FPS上不去。量化也做了,算子也优化了,内存对齐也检查了,可就是离实时检测的底线还差一截。盯着终端里跳动的数字,突然意识到——我们可能正在接近当前技术路径的瓶颈。端侧实时目标检测的下一个突破口,恐怕不在现有框架的修修补补里。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 187

决策树模型案例_机器学习进阶 决策树模型

本课程属于 Python人工智能 A 计划,不单独售卖,加入 A 计划可免费观看本课程及所有 Python人工智能 收费课程~Python人工智能 A 计划永久有效期购买链接:http://www.sikiedu.com/classroom/14/introduction> 课程简介与内容本次课程中会给大家详细讲解机器学习中决策树模型,为后面的集成打基础前置知识信息与熵不确定性计算...

weixin_39876450的博客 195

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

机器学习方法:15分钟带你吃透决策树模型

【本文的阅读时间约15分钟,希望大家耐心观看】这是机器学习方法系列科普文章,由浙中大公卫徐老师撰写,往期推文可以看集合。在众多机器学习模型中,决策树是最为简单直观的一种算法。它就像我们平常做决定时的过程,逐步排除可能的选项,最终得出结论。今天这篇文章中,我们将结合图例讲解讲解决策树的结构、数学原理、具体构建和优化过程,让大家在理解时不至于太抽象,同时我们也会提供构建决策树预测模型的数据和代码,感...

郑老师统计 2936

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

决策树模型构建+调参Python代码——用决策树模型实现机器学习

决策树模型构建+调参Python代码——用决策树模型实现机器学习。

qq_41698317的博客 3529

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【机器学习15】决策树模型详解

决策树算法前言一、决策树算法的概述1.树模型2.树模型基本流程二、熵的作用三、决策树构造实例四、信息增益率和gini系数五、剪枝方法六、分类、回归任务七、树模型的可视化展示八、决策边界展示分析九、决策树预剪枝常用参数十、回归树模型总结 前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的决策树的详细内容。 一、决策树算法的概述 1.树模型 决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。

lys_828的博客 4万+

Spark:基于PySpark的逻辑回归和决策树模型对泰旦尼克号幸存者预测的机器学习流程

基于PySpark,使用spark的MLLib部分机器学习包,SparkML,对Kaggle入门初级案例:泰坦尼克号幸存者预测的案例,从数据分析,数据清洗,数据整理,特征工程,特征向量化等完整流程示例,最后基于SparkML包中的逻辑回归和决策树模型进行了模型构建和预测测试

maoyuanming0806的博客 4227
上一篇: 机器学习-聚类算法
下一篇: 机器学习-回归
BabyMuu
博客等级 码龄7年 35粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值