《机器学习》 决策树剪枝、树模型参数及案例演示

news2024/11/16 5:22:34

目录

一、决策树剪枝

1、什么是决策树剪枝?

2、如何剪枝

3、剪枝剪哪个位置的叶子结点

二、树模型参数及用法

1、参数种类

2、参数解释

1)criterion:gini or entropy

2)splitter:best or random

3)max_feature:最大特征数目

4)max_depth:最大层数

5)min_samples_split :内部节点最小样本数,即非叶子节点

6)min_samples_leaf:叶子结点最小样本数

7)min_weight_fraction_leaf:叶子结点最小样本权重和

8)max_leaf_nodes:最大叶子节点数

9)min_impurity_decrease:控制决策树节点的分裂

10)min_impurity_split:限制了决策树的增长

11)class_weight :指定样本各类别的的权重

12)random_state:设置决策树分枝中随机模式的参数

三、案例实现

完整代码实现:

运行结果展示:


一、决策树剪枝

1、什么是决策树剪枝?

        决策树剪枝是指在训练完整的决策树模型后,通过去除一些不必要的分支或叶节点,以减小模型的复杂度,提高泛化能力的一种技术。决策树剪枝方法主要分为预剪枝和后剪枝两种。

        决策树剪枝的目的是防止决策树模型过拟合训练数据,提高模型的泛化能力。

2、如何剪枝

        预剪枝:在构建决策树的过程中,在每个节点进行划分前,先进行评估,决定是否进行划分。常用的预剪枝方法有限制树的最大深度、限制节点的最小样本数、限制不纯度的最小改善程度等。其策略为限制树的深度、限制叶子结点个数以及叶子结点的样本数、基尼系数。

        后剪枝:在构建完整的决策树,从底部开始逐层向上剪枝。剪枝时移除某个节点的子树,将该节点转换为叶节点,并将该节点的多数类别作为该叶节点的类别。然后根据剪枝后的树在验证集上的性能,判断是否进行剪枝。常用的后剪枝方法有pessimistic error pruning和cost complexity pruning等。

         比如当此时有一个决策树,他的原本训练模型如下图所示:

        此时有五个叶子结点,如果想要限制叶子结点树,那么对其进行剪枝,如果只要4个叶子结点,那么可能有多种剪枝方法,但是具体剪哪一个呢,看下一点。

 

3、剪枝剪哪个位置的叶子结点

        在预剪枝中,剪枝的位置是在构建决策树时,在每个节点进行划分之前进行评估。在每个节点进行划分时,利用某种评估方法(如信息增益、基尼指数)来计算划分后的性能,并与预设的剪枝条件进行比较。如果划分后性能没有显著提升或达到剪枝条件,则停止划分并将当前节点转换为叶节点。

        后剪枝中,剪枝的位置是在构建完整的决策树之后。首先,从决策树的底部开始逐层向上剪枝。将一个节点的子树移除,将该节点转换为叶节点,并将该节点的多数类别作为该叶节点的类别。然后,根据剪枝后的树在验证数据集上的性能进行评估,如果剪枝后的性能没有显著下降或者达到剪枝条件,则保留剪枝后的树。

        剪枝的位置是根据评估指标和剪枝条件来确定的,旨在提高决策树模型的泛化能力。预剪枝在构建决策树时,根据预设条件进行剪枝。而后剪枝在构建完整的决策树后,通过逐层向上剪枝,并根据验证集性能进行剪枝。

二、树模型参数及用法

1、参数种类

        下列是直接调用一个树模型的类,然后内部是他的用法

class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)

2、参数解释

1)criterion:gini or entropy

        采用基尼系数还是熵值衡量,默认基尼系数

2)splitter:best or random

        前者是在所有特征中找最好的切分点 后者是在部分特征中(数据量大的时候)默认是best,无需更改

3)max_feature:最大特征数目

        log2,sqrt,N,特征小于50的时候一般使用所有的,默认取所有特征,无需更改

4)max_depth:最大层数

        数据少或者特征少的时候可以不管这个值,如果模型样本量多,特征也多的情况下,可以尝试限制下。如果没有设置,那么将会节点完全展开,直到所有的叶子节点都是纯的,或者达到最小叶子节点的个数阈值设置。

5)min_samples_split :内部节点最小样本数,即非叶子节点

        如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分,如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。控制内部节点分裂的情况;假设<10,那么分裂的数量小于10就不会再次分裂了,默认2个

6)min_samples_leaf:叶子结点最小样本数

        如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝,如果样本量不大,不需要管这个值,先构成决策树,再剪枝,当小于某个设定值后,删除此节点以及此节点的分支节点

7)min_weight_fraction_leaf:叶子结点最小样本权重和

        限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝,默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。

8)max_leaf_nodes:最大叶子节点数

        防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制具体的值可以通过交叉验证得到。假设限制最大的叶子节点数为10个,那么就不会再次分裂了

9)min_impurity_decrease:控制决策树节点的分裂

        用于设置分裂的阈值,指定了一个阈值,当某个节点进行分裂后,分裂后的节点的不纯度减少值(或相对于父节点的不纯度减少值)大于该阈值时才会进行分裂操作,否则不进行分裂,将该节点标记为叶节点。

10)min_impurity_split限制了决策树的增长

        如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点 。

11)class_weight :指定样本各类别的的权重

        主要是为了防止训练集某些类别的样本过多导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。

12)random_state:设置决策树分枝中随机模式的参数

        当数据集中的特征数量较少时,随机性不会很明显。但是,当特征数量较多时,随机性就会变得明显。random_state参数可以确保每次运行代码时都得到相同的结果

三、案例实现

        当前有一个文件为电信客户流失数据.xlsx,其主要目的是为了训练一个模型,用来测试哪些用户有想要离开电信运营商的趋势,如果判定为想要流失的人员,系统自动给这个客户发送一些福利,如流量、话费券等等

文件内特征及类别大致如下:

完整代码实现:

import pandas as pd

def cm_plot(y, yp):    # 可视化混淆矩阵,网上都是包装好的,可以直接复制使用
    from sklearn.metrics import confusion_matrix
    import matplotlib.pyplot as plt

    cm = confusion_matrix(y, yp)
    plt.matshow(cm, cmap=plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x, y], xy=(y, x), horizontalalignment='center',verticalalignment='center')
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
    return plt

datas = pd.read_excel("电信客户流失数据.xlsx")  # 导入数据

data = datas.iloc[:,:-1]   # 取出特征数据以及标签数据
target = datas.iloc[:,-1]

# 数据切分测试集训练集
from sklearn.model_selection import train_test_split
data_train,data_test,target_train,target_test = train_test_split(data,target,test_size=0.2,random_state=42)

# 定义决策树
from sklearn import tree
# 建立决策树模型,并对其进行训练
dtr = tree.DecisionTreeClassifier(criterion='gini' , max_depth=8 , random_state=42) # 设置计算方式为gini系数计算,最大层数为8层,随机种子设置为42
dtr.fit(data_train,target_train)  # 对训练集数据进行训练
# 预测数据
train_predicted = dtr.predict(data_train)

# 对测试集 打印分类报告
from sklearn import metrics
print(metrics.classification_report(target_train,train_predicted))
# 对原始数据测试,并打印报告
predict = dtr.predict(data)
print(metrics.classification_report(target, predict))
# 对随机切分的数据打印报告
predict1 = dtr.predict(data_test)
print(metrics.classification_report(target_test,predict1))

运行结果展示:

此时测试集概率不高,需要你继续对源代码进行调参,或者在对其使用k折交叉验证来处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2067438.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【解析几何笔记】6.三阶行列式

6. 三阶行列式 6.1 三阶行列式的定义 对三阶方阵 ( a 1 a 2 a 3 b 1 b 2 b 3 c 1 c 2 c 3 ) \begin{pmatrix} a_{1} & a_{2} & a_{3}\\ b_{1} & b_{2} & b_{3}\\ c_{1} & c_{2} &c_{3} \end{pmatrix} ​a1​b1​c1​​a2​b2​c2​​a3​b3​c3​​ …

案例分享—国外金融软件界面设计

国外金融软件界面设计追求简洁&#xff0c;旨在减少用户认知负担&#xff0c;通过直观布局与清晰信息架构&#xff0c;提升操作效率与用户体验 其简洁性还源于对金融数据精准呈现的重视&#xff0c;避免冗余元素干扰&#xff0c;确保用户快速获取关键信息&#xff0c;做出明智决…

《机器学习》周志华-CH2(模型评估与选择)

2.1经验误差与过拟合 2.1.1典型的机器学习过程 2.1.2误差 当有 m m m个样本&#xff0c;其中 a a a个分类错误&#xff0c;则错误率为 E a / m Ea/m Ea/m&#xff1b;相应地&#xff0c; 1 − a / m 1-a/m 1−a/m称为精度。 2.1.3过拟合与欠拟合 过拟合&#xff1a;学习能力…

【LeetCode每日一题】——1046.最后一块石头的重量

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 优先队列 二【题目难度】 简单 三【题目编号】 1046.最后一块石头的重量 四【题目描述】 有…

蓝队技能-应急响应篇钓鱼攻击邮件与文件EML还原蠕虫分析线索定性

知识点&#xff1a; 1、应急响应-钓鱼邮件-定性&排查 2、应急响应-恶意文件-应急&分析一、演示案例-蓝队技能-钓鱼攻击-邮件&附件&分析&排查 如何分析邮件安全性&#xff1a; 1、看发信人地址 2、看发信内容信息 3、看发信内容附件 4、看邮件原文源码…

31套科技风PPT模版免费下载

目录 资源名称&#xff1a;31套科技风PPT模板合集资源简介&#xff1a;部分展示&#xff1a;适用人群&#xff1a;资源内容&#xff1a;使用指南&#xff1a;资源下载链接&#xff08;免费&#xff0c;已设置0个积分下载&#xff09; 资源名称&#xff1a;31套科技风PPT模板合集…

【人工智能】Transformers之Pipeline(十二):零样本物体检测(zero-shot-object-detection)

目录 一、引言 二、零样本物体检测&#xff08;zero-shot-object-detection&#xff09; 2.1 概述 2.2 技术原理 2.3 应用场景 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模型排名 三、总结 一、引言 pipeline&#xff08;管…

动态规划之买卖股票篇-代码随想录算法训练营第三十八天| 买卖股票的最佳时机ⅠⅡⅢⅣ,309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费

121. 买卖股票的最佳时机 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 讲解视频&#xff1a; 动态规划之 LeetCode&#xff1a;121.买卖股票的最佳时机1 题目描述&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定…

u盘加密工具哪款U盘加密工具好?6款U盘加密工具分享

数据泄露和非法拷贝成为企业面临的严峻挑战。为了保护敏感数据不被非法复制和传播&#xff0c;市场上涌现出了众多U盘加密工具。 本文将为您介绍六款功能强大、备受好评的U盘加密工具&#xff0c;帮助您选择最适合自己需求的加密解决方案。 1.安企神 它支持Windows、macOS和L…

学习大数据DAY43 Sqoop 安装,配置环境和使用

目录 sqoop 安装 配置 mysql sqoop 安装 sqoop 指令集 sqoop 使用 sqoop 创建 hive 表 sqoop 全量导入表 sqoop 增量导入表 sqoop 全量导出表 sqoop 分区表导入表 sqoop 分区表导出表 上机练习 sqoop 安装 配置 mysql create database test DEFAULT CHARACTER S…

汇编语言:adc指令 和 sbb指令

一. abc 指令 adc &#xff08;add carry&#xff09;是带向假想的更高位进位加法指令&#xff0c;它利用了标志寄存器上 CF 标志位记录的进位值。 指令格式&#xff1a;adc 操作对象1, 操作对象2 功能&#xff1a;操作对象1 操作对象1 操作对象2 CF 比如&#xff0c;指令…

Vue2升级Vue3填坑笔记

背景 前段时间使用Vue2完成一个流量回放的前端开发&#xff0c;实现了流量回放的基本功能。开发过程中&#xff0c;发现现主流的插件都在适配Vue3&#xff0c;奈何为了赶进度&#xff0c;只能先用自己熟悉的Vue2先顶上。恰巧最近有些许空余时间&#xff0c;就把项目代码逐步变…

基于单片机的人体健康监测系统的设计

本设计以STM32F103C8T6单片机作为主控&#xff0c;通过MAX30102采集心率、血氧值&#xff0c;通过MSP20血压采集模块检测血压值&#xff0c;通过MLX90614红外体温采集模块检测体温值。OLED屏可以显示以上检测的信息&#xff0c;并可以通过蓝牙模块将信息发送给手机APP。当检测值…

【QAMISRA】解决永久license文件替换后未生效的问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决浮动版永久license文件替换后未生效的问题。 2、 问题场景 客户替换永久版license文件且重启lserv服务后&#xff0c;license信息还是原来临时license的信息。 3、软硬件环境 1、软件版本&#xff1a; QA-MIS…

Android车载蓝牙音乐实例(附Demo源码):实现手机播放音乐后车机应用显示音乐名称,歌手,专辑名。且可控制上一曲下一曲,暂停播放功能

一、功能需求 功能需求是在Android10以上设备上实现蓝牙音乐功能&#xff0c;细分为两个功能点&#xff1a; 1、手机和车载设备实现蓝牙连接 &#xff08;本Demo文只做监听蓝牙连接状态&#xff0c;需手动到设置中连接蓝牙&#xff09; 2、连接蓝牙成功后手机播放音乐时车载…

【python报错已解决】“IndexError: list index out of range”

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 你是否在处理Python列表时遇到了“IndexError: list index out of range”的错误&#xff1f;这个错误可能会让你的程序中…

51单片机最快能生成多高频率的方波?

前言 在嵌入式系统开发中&#xff0c;51 单片机作为一种非常非常非常经典&#xff0c;贯穿上下几十年的微控制器&#xff0c;被广泛应用于各种电子项目中。其中&#xff0c;生成特定频率的方波信号是一项常见的需求。 那么&#xff0c;51 单片机究竟能以多快的速度生成方波呢&…

STM32——GPS模块(GY-NEO-6M)

1连接 1-1 使用 USB-TTL 工具&#xff0c;安装好驱动&#xff0c;可以在”设备管理器看到对应COM”按照如下链接测试模块&#xff1a; USB-TTL GPS 模块 3.3V--------------------------------->VCC GND------------------------------>GND RXD--------------------…

应用程自定义协议与序列化反序列化

本篇将主要介绍在应用层中自定义的协议&#xff0c;自定义协议的同时还需要将我们的数据继续序列化和反序列化&#xff0c;所以本篇的重点为序列化、反序列化的原因以及如何自定义协议&#xff0c;接着探讨了关于为什么 tcp 协议可以支持全双工协议。还根据用户自定义协议结合 …

⼆⼿⻋交易系统前景分析

二手车交易系统开发小程序在当前市场中具有显著的优势和潜力。以下是对二手车交易系统小程序功能的综合分析&#xff1a; 车辆信息展示&#xff1a;小程序应提供详细的车辆信息展示&#xff0c;包括车辆的图片、品牌、型号、年份、里程数、价格等关键信息&#xff0c;方便用户…