机器学习——决策树剪枝算法

机器学习——决策树剪枝算法

决策树是一种常用的机器学习模型,它能够根据数据特征的不同进行分类或回归。在决策树的构建过程中,剪枝算法是为了防止过拟合,提高模型的泛化能力而提出的重要技术。本篇博客将介绍剪枝处理的概念、预剪枝和后剪枝方法,以及决策树的损失函数(目标函数),并使用Python实现以上所有的算法。

1. 剪枝处理

在决策树的构建过程中,为了防止过拟合,通常会对生成的决策树进行剪枝处理。剪枝的目的是通过降低树的复杂度来提高模型的泛化能力。

2. 预剪枝与后剪枝

预剪枝是在决策树生成过程中,在决策树生长的过程中,根据一定的条件提前终止分支的生成。常用的预剪枝条件包括限制树的最大深度、叶节点最小样本数等。

后剪枝是在决策树生成完成后,通过一定的方法对决策树进行剪枝。后剪枝的思想是先生成一颗完全生长的决策树,然后根据损失函数(目标函数)对节点进行逐个判断,判断删除某一节点后是否能提高模型的泛化能力,如果能,则删除该节点。

3. 决策树的损失函数

决策树的损失函数(目标函数)是在剪枝过程中判断节点是否应该被剪枝的依据。通常使用的损失函数包括基于误分类率、基尼指数和交叉熵等。

3.1 基于误分类率的损失函数:

C α ( T ) = C ( T ) + α ∣ T ∣ C_{\alpha}(T) = C(T) + \alpha|T| Cα(T)=C(T)+αT

其中, C ( T ) C(T) C(T)是模型对训练数据的误分类率, ∣ T ∣ |T| T是决策树的叶节点个数, α \alpha α是调节参数。

3.2 基于基尼指数的损失函数:

C α ( T ) = C ( T ) + α ∣ T ∣ C_{\alpha}(T) = C(T) + \alpha|T| Cα(T)=C(T)+αT

其中, C ( T ) C(T) C(T)是模型的基尼指数, ∣ T ∣ |T| T是决策树的叶节点个数, α \alpha α是调节参数。

3.3 基于交叉熵的损失函数:

C α ( T ) = C ( T ) + α ∣ T ∣ C_{\alpha}(T) = C(T) + \alpha|T| Cα(T)=C(T)+αT

其中, C ( T ) C(T) C(T)是模型的交叉熵, ∣ T ∣ |T| T是决策树的叶节点个数, α \alpha α是调节参数。

4. Python实现

接下来,将使用Python实现预剪枝和后剪枝两种剪枝算法,并在相同的数据集上进行比较。

4.1 预剪枝算法

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 构建决策树模型(预剪枝)
clf = DecisionTreeClassifier(criterion='entropy', max_depth=3, min_samples_split=5, min_samples_leaf=2, random_state=42)
clf.fit(X_train, y_train)# 在测试集上进行预测
y_pred = clf.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Pre-pruning Accuracy:", accuracy)

4.2 后剪枝算法

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target#```python
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 构建决策树模型(后剪枝)
clf = DecisionTreeClassifier(criterion='entropy', random_state=42)
clf.fit(X_train, y_train)# 在测试集上进行预测
y_pred = clf.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Before Pruning Accuracy:", accuracy)# 后剪枝
path = clf.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas, impurities = path.ccp_alphas, path.impuritiesclfs = []
for ccp_alpha in ccp_alphas:clf = DecisionTreeClassifier(criterion='entropy', random_state=42, ccp_alpha=ccp_alpha)clf.fit(X_train, y_train)clfs.append(clf)train_scores = [clf.score(X_train, y_train) for clf in clfs]
test_scores = [clf.score(X_test, y_test) for clf in clfs]best_clf = clfs[test_scores.index(max(test_scores))]
y_pred = best_clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("After Pruning Accuracy:", accuracy)

示例

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 构建决策树模型(后剪枝)
clf = DecisionTreeClassifier(criterion='entropy', random_state=42)
clf.fit(X_train, y_train)# 在测试集上进行预测
y_pred = clf.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Before Pruning Accuracy:", accuracy)# 后剪枝
path = clf.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas, impurities = path.ccp_alphas, path.impuritiesclfs = []
for ccp_alpha in ccp_alphas:clf = DecisionTreeClassifier(criterion='entropy', random_state=42, ccp_alpha=ccp_alpha)clf.fit(X_train, y_train)clfs.append(clf)train_scores = [clf.score(X_train, y_train) for clf in clfs]
test_scores = [clf.score(X_test, y_test) for clf in clfs]best_clf = clfs[test_scores.index(max(test_scores))]
y_pred = best_clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("After Pruning Accuracy:", accuracy)# 绘制准确率随着剪枝参数的变化曲线
plt.figure(figsize=(10, 6))
plt.plot(ccp_alphas, train_scores, marker='o', label='Train', drawstyle="steps-post")
plt.plot(ccp_alphas, test_scores, marker='o', label='Test', drawstyle="steps-post")
plt.xlabel("CCP Alpha")
plt.ylabel("Accuracy")
plt.title("Accuracy vs. CCP Alpha for Decision Tree Pruning")
plt.legend()
plt.show()

在这里插入图片描述

5. 总结

本篇博客介绍了决策树的剪枝算法,包括预剪枝和后剪枝两种方法,以及决策树的损失函数(目标函数)。通过Python实现了预剪枝和后剪枝算法,并在相同的数据集上进行了比较。

预剪枝通过限制决策树的生长来防止过拟合,但可能会导致欠拟合。后剪枝是在决策树生成完成后,通过一定的方法对决策树进行剪枝,可以更好地提高模型的泛化能力。在实际应用中,需要根据具体问题的特点和数据集的情况选择合适的剪枝算法,并通过调参来优化模型性能。

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

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

相关文章

C语言内存函数(1)【memcpy函数的使用与模拟实现】【memmove函数的使用和模拟实现】

关于内存函数有四个函数需要我们学习。分别是memcpy,memmove,memset和memcmp。都在头文件string.h里面。 一.memcpy函数的使用 一提到这个函数,我们可能会联想到strcpy函数,但strcpy函数是针对字符串的拷贝。但是我们在写代码的…

百度文心一言(ERNIE bot)API接入Android应用

百度文心一言(ERNIE bot)API接入Android应用实践 - 拾一贰叁 - 博客园 (cnblogs.com) Preface: 现在生成式AI越来越强大了,想在android上实现一个对话助手的功能,大概摸索了一下接入百度文心一言API的方法。 与AI助手交换信息的…

spring boot dynamic 动态数据数据源配置连接池

前言 我们可以使用 dynamic-datasource 来快速实现多数据源,但是多数据源配置连接池 以及说明文档都是收费的。 这里整理的连接池的配置以及配置说明 连接池配置 (druid或者 hikari 选择一个即可) 特此说明 如果配置配到了 spring.datasour…

RabbitMQ如何实现延迟消息?

RabbitMQ如何实现延迟消息? RabbitMQ中是可以实现延迟消息的,一般有两种方式,分别是通过死信队列以及通过延迟消息插件来实现。 死信队列 当RabbitMQ中的一条正常的消息,因为过了存活时间(TTL过期)、队列长…

(使用C语言详解)求一个集合的全部子集(leetcode编程笔记)

原题链接:子集 (Subsets) - 力扣 (LeetCode) 原码于文章末尾会给出。 本文通过位运算,实现题目要求,之后可能更新其他方法,敬请关注...... 题目: 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该…

C++类的6个默认成员函数(构造)

C类和对象基础-CSDN博客https://blog.csdn.net/lh11223326/article/details/136834917?spm1001.2014.3001.5501 目录 1.构造函数 概念 特性 2.析构函数 概念 特性 3.拷贝构造函数 概念 特征 4.赋值运算符重载(构造实现) 运算符重载 赋值运算…

Kafka快速入门及使用

入门 官网 简介 Kafka是一个分布式的流媒体平台应用: 消息系统日志收集用户行为追踪流式处理 特点 高吞吐量消息持久化高可靠性高扩展性 常用术语 Broker:集群中的服务器Zookeeper:服务管理Topic:主题,Kafka发…

Linux/openEuler系统部署spring boot+vue前后端分离项目(nginx均衡代理)

Linux/openEuler系统部署spring bootvue前后端分离项目(nginx均衡代理) 1、系统环境准备,安装openjdk和nginx还有MySQL,咱们本文先连接主机mysql进行登录(linux上的mysql服务可以先不安装) 可以看我前面的…

springboot精品源码

springboot精品源码 所有项目都包括:源码数据库文件开题LW说明文档运行视频 请看主页资料联系。 项目类型包括: 1 SpringBoot学生心理咨询评估系统 2 基于SpringBoot的网上订餐系统 3 大学生租房平台的设计与实现 4 SpringBoot房屋租赁系统 5 基于SpringBoot的课…

SpringCloud之网关组件Gateway学习

SpringCloud之网关组件Gateway学习 GateWay简介 Spring Cloud Gateway是Spring Cloud的⼀个全新项目,目标是取代Netflix Zuul,它基于Spring5.0SpringBoot2.0WebFlux(基于高性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型…

STM32---DHT11温湿度传感器与BH1750FVI光照传感器(HAL库、含源码)

写在前面:本节我们学习使用两个常见的传感器模块,分别为DHT11温湿度传感器以及BH1750FVI光照传感器,这两种传感器在对于环境监测中具有十分重要的作用,因为其使用简单方便,所以经常被用于STM32的项目之中。今天将使用分享给大家&a…

QGIS编译(跨平台编译)057:FastCGI编译(Windows、Linux、MacOS环境下编译)

文章目录 1、FastCGI介绍2、FastCGI下载3、Windows下编译4、linux下编译5、MacOS下编译1、FastCGI介绍 FCGI 是 FastCGI 的缩写,是一种用于改善 CGI(Common Gateway Interface)性能的协议。在传统的 CGI 中,每次请求都需要启动一个新的进程来处理,这导致了较高的资源消耗和…

【测试思考】设计测试用例时,你在想什么

突然想写这篇文章是因为,前两天看到一篇文章【像用户一样测试】 然后想起事儿 .. 想到在2020年上海爆发疫情后,开始频繁使用买菜软件,在一个深夜从某团紧急挑选加购商品,看到提醒自己账户还有一张满减优惠券,挺高兴的…

claude3国内怎么用

你是否苦恼没有渠道接触最牛的AI——Claude3,这个已经被媒体刷屏的彻底吊打了ChatGPT-4的地表最强AI。 最近,一个国内的claude3镜像站出现了,国内的小伙伴也可以体验了。 无论你用它写文案、做PPT、写代码、调bug、还是画图,都不…

【Linux】调试器-gdb的安装与使用

1. 背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项 GDB的安装 在开始之前,确保已经安装了GDB。如果没有安…

Android 观察者模式

在Android中,观察者模式(Observer Pattern)是一种常用的设计模式,用于在对象之间建立一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Android开发中&#xff0…

HTML5和CSS3笔记

一:网页结构(html): 1.1:页面结构: 1.2:标签类型: 1.2.1:块标签: 1.2.2:行内标签: 1.2.3:行内块标签: 1.2.4:块标签与行…

独孤思维:流量暴涨,却惨遭违规

最近独孤操作虚拟资料短视频,有个很深的感悟。 每天发10条短视频,积累到20天左右,播放量和粉丝数开始暴涨。 虽然很多牛比的比我数据好,但是对于刚做短视频的独孤来说,我已经满足了。 但是又发了10来天,…

如何用VSCode和Clangd与Clang-Format插件高效阅读Linux内核源码及写驱动

一、如何高效阅读Linux源码:基于clangd uboot/busybox等都可以用这种方式,理论上说所有基于Make和Cmake的源码工程都可以用这套方案 阅读Linux源码最大问题在于调用链太复杂,一个函数或变量引用太多,source insight和cscope等基于…

Pink老师Echarts教学笔记

可视化面板介绍 ​ 应对现在数据可视化的趋势,越来越多企业需要在很多场景(营销数据,生产数据,用户数据)下使用,可视化图表来展示体现数据,让数据更加直观,数据特点更加突出。 01-使用技术 完成该项目需…