当前位置: 首页 > news >正文

【机器学习】树模型预剪枝和后剪枝

在树模型建模的过程中的树模型的超参数会影响模型的精度,那么如何调整超参数呢?可以提前限制模型的超参数,也可以在训练模型之后再调整。本文将介绍树模型的预剪枝和后剪枝的实践过程。

原始模型

使用基础数据集和基础的树模型进行训练,然后查看树模型在训练集和测试集的精度:

df = pd.read_csv('https://mirror.coggle.club/dataset/heart.csv')
X = df.drop(columns=['output'])
y = df['output']
x_train,x_test,y_train,y_test = train_test_split(X,y,stratify=y)

clf = tree.DecisionTreeClassifier(random_state=0)
clf.fit(x_train,y_train)

模型在训练集上准确率100%,但在测试集上存在19个错误样本。

图片

图片

预剪枝

预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,如果当前结点的划分不能带来决策树模型泛化性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点。

停止决策树生长最简单的方法有:

  • 限制树模型最大深度;

  • 限制树模型叶子节点最小样本数量;

  • 使用信息增益限制节点;

可以调节的对应超参数为:

  • max_depth

  • min_sample_split

  • min_samples_leaf

params = {'max_depth': [2,4,6,8,10,12],
         'min_samples_split': [2,3,4],
         'min_samples_leaf': [1,2]}

clf = tree.DecisionTreeClassifier()
gcv = GridSearchCV(estimator=clf,param_grid=params)
gcv.fit(x_train,y_train)

model = gcv.best_estimator_
model.fit(x_train,y_train)

模型在训练集上有30个错误样本,但在测试集上只存在15个错误样本。

图片

图片

后剪枝

使用后剪枝方法需要将数据集分为测试集和训练集。用测试集来判断将这些叶节点合并是否能降低测试误差,如果是的话将合并。

  • Reduced-Error Pruning(REP)

  • Pesimistic-Error Pruning(PEP)

  • Cost-Complexity Pruning(CCP)

CCP对应的超参数为 alpha,我们将获得这棵树的 alpha 值。首先计算可选的alpha,并计算对应的模型的精度。

path = clf.cost_complexity_pruning_path(x_train, y_train)
ccp_alphas, impurities = path.ccp_alphas, path.impurities

clfs = []
for ccp_alpha in ccp_alphas:
    clf = tree.DecisionTreeClassifier(random_state=0, ccp_alpha=ccp_alpha)
    clf.fit(x_train, y_train)
    clfs.append(clf)
    
train_acc = []
test_acc = []
for c in clfs:
    y_train_pred = c.predict(x_train)
    y_test_pred = c.predict(x_test)
    train_acc.append(accuracy_score(y_train_pred,y_train))
    test_acc.append(accuracy_score(y_test_pred,y_test))

plt.scatter(ccp_alphas,train_acc)
plt.scatter(ccp_alphas,test_acc)

图片

从结果可知如果alpha设置为0.2得到的测试集精度最好,我们将从新训练模型:

clf_ = tree.DecisionTreeClassifier(random_state=0,ccp_alpha=0.020)
clf_.fit(x_train,y_train)

模型在训练集上有36个错误样本,但在测试集上只存在16个错误样本。

图片

图片

推荐文章

  • 李宏毅《机器学习》国语课程(2022)来了

  • 有人把吴恩达老师的机器学习和深度学习做成了中文版

  • 上瘾了,最近又给公司撸了一个可视化大屏(附源码)

  • 如此优雅,4款 Python 自动数据分析神器真香啊

  • 梳理半月有余,精心准备了17张知识思维导图,这次要讲清统计学

  • 年终汇总:20份可视化大屏模板,直接套用真香(文末附源码)

技术交流

欢迎转载、收藏、有所收获点赞支持一下!

在这里插入图片描述

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

长按关注

相关文章:

  • 性能提升 25 倍:Rust 有望取代 C 和 C++,成为机器学习首选 Python 后端
  • python一些操作的笔记
  • 4、乐趣国学—“行有不得,反求诸己。”
  • Github每日精选(第42期):web前端自定义Alert窗口sweetalert
  • “大厂”角力移动办公系统市场,钉钉和企微向左、WorkPlus向右
  • 面向有监督学习与文本数据的通用分类器
  • 为了学明白中断机制,我努力了
  • Python中的super函数,你熟吗?
  • 护眼灯频闪是什么意思?无频闪护眼灯哪个好
  • 「设计模式」六大原则之里氏替换原则小结
  • springboot+篮球场馆预约系统 毕业设计-附源码211706
  • vue实现【接口数据渲染随机显示】和【仅显示前五条数据】
  • JVM原理及优化_子系统
  • HTML——css与js案例练习
  • 吐血总结 50道Python面试题集锦
  • DataBase in Android
  • Docker下部署自己的LNMP工作环境
  • export和import的用法总结
  • Mybatis初体验
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Python - 闭包Closure
  • python大佬养成计划----difflib模块
  • SwizzleMethod 黑魔法
  • Vue小说阅读器(仿追书神器)
  • Webpack 4x 之路 ( 四 )
  • 给Prometheus造假数据的方法
  • 聊聊redis的数据结构的应用
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 浅谈web中前端模板引擎的使用
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 数据结构java版之冒泡排序及优化
  • 物联网链路协议
  • 原生js练习题---第五课
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • (C++17) optional的使用
  • (TOJ2804)Even? Odd?
  • (八)c52学习之旅-中断实验
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)Java算法:二分查找
  • (转) Face-Resources
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • ./和../以及/和~之间的区别
  • .NET Core 中的路径问题
  • .net 调用php,php 调用.net com组件 --
  • .net 简单实现MD5
  • .Net 应用中使用dot trace进行性能诊断
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .net6 webapi log4net完整配置使用流程
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @Data注解的作用