大数据-203 数据挖掘 机器学习理论 - 决策树 sklearn 剪枝参数 样本不均匀问题

news2024/11/23 19:30:27

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(已更完)
  • Kudu(已更完)
  • Druid(已更完)
  • Kylin(已更完)
  • Elasticsearch(已更完)
  • DataX(已更完)
  • Tez(已更完)
  • 数据挖掘(正在更新…)

章节内容

上节我们完成了如下的内容:

  • 决策树 sklearn
  • 绘制决策树 防止过拟合

在这里插入图片描述

剪枝参数

max_depth

限制树的最大深度,超过设定深度的树全部剪掉,一般用做树的精修。
这是用的最广泛的剪枝参数,在高维度低样本量时非常有效,决策树多生长一层,对样本量的需求会增加一倍,所以限制树深度能够有效的限制过拟合。这在集成算法中也非常实用。
实际使用时,建议从=3 开始尝试,看看拟合的效果再决定是否增加设定深度。

min_samples_leaf

一个节点在分支后的每个子节点都必须包含至少 min_samples_leaf 个样本,否则分支就不会发生,或者分支会朝着满足每个子节点都包 min_samples_leaf 个样本的方向去发生。
一般搭配 max_depth 使用,在回归树中有神奇的效果,可以让模型变得更加平滑,这个参数的数量设置得太小会引起过拟合,设置的太大会阻止模型学习数据。
一般来说,建议从=5 开始使用,如果叶节点中含有样本量变化很大,建议输入浮点数作为样本量的百分比来使用。同时,这个参数可以保证每个叶子的最小尺寸,避免低方差,过拟合的叶子节点出现。

min_samples_split

一个节点必须要包含至少 min_samples_split 个训练样本,这个节点才允许被分支,否则分支就不会发生。

max_features

max_features 限制分支时考虑的特征个数,超过限制个数的特征都会被舍弃。和 max_depth 异曲同工,max_features 是用来限制高维度数据的过拟合的剪枝参数,但其方法比较暴力,是直接限制可以使用的特征数量而强行决策树停下的参数,在不知道决策树中的各个特征的重要性的情况下,强行设置这个参数可能会导致模型学习不足。
如果希望通过降维的方式防止过拟合,建议使用 PCA,ICA或者特征选择模块中的降维算法。

min_impurity_decrease

限制信息增益的大小,信息增益小于设定数值小于设定数值的分支不会发生,这是0.19 版本中更新的功能,在 0.19 版本之前时使用 min_impurity_split。

确认最优的剪枝参数

那具体怎么来确定每个参数写什么值?这时候,我们要使用确定超参数的曲线来进行判断,继续使用我们已经训练好的决策模型 CLF。
超参数的学习曲线,是一条以超参数的取值为衡坐标,模型的度量指标为纵坐标的曲线,它是来衡量不同超参数取值下模型的表现的线。在我们建好的决策树里,我们的模型度量指标就是score。

test = []
for i in range(10):
    clf = tree.DecisionTreeClassifier(max_depth=i+1,criterion="entropy",random_state=30,splitter="random")
    clf = clf.fit(Xtrain, Ytrain)
    score = clf.score(Xtest, ytest) # 记录下不同 max_depth 下模型在测试集分数
    test.append(score)
plt.plot(range(1,11),test,color="red",label="学习曲线")
plt.ylabel("socre")
plt.xlabel("max_depth")
plt.legend()
plt.show();

运行结果如下图所示:
在这里插入图片描述

最后总结

思考:

  • 剪枝参数一定能够提升模型在测试集上的表现吗?调参是没有绝对的答案的,一切都需要看数据的本身。
    无论如何,剪枝参数的默认值会让树无尽的生长,这些树在某些数据集上可能非常巨大,对内存的消耗也非常巨大。

属性是模型训练之后,能够调用查看的模型的各种性质,对决策树来说,最重要的是 feature_importances,能够查看各个特征对模型的重要性。
sklearn 中许多算法的接口都是相似的,比如说我们之前已经用到 fit 和 score,几乎对每个算法都可以使用,除了两个接口之外,决策树最常用的接口还有 apply 和 predict。

  • apply 中输入测试集返回每个测试样本所在的叶子节点的索引
  • predict 输入测试集返回每个测试样本的标签,返回的内容一目了然并且非常容易
    这里不得不提的是,所有接口中要求输入 Xtrain、Xtest 的部分,输入的特征的矩阵必须至少是一个二维矩阵,sklearn 不接受任何一维矩阵作为特征矩阵被输入。如果你的数据的确只有一个特征,那必须用 reshape(-1,1)来给矩阵增维。

样本不均匀的问题

对于分类问题,永远都逃不过一个问题就是样本不均匀。
样本不均衡是指在一组数据集中,标签的一类天生占有很大的比例,但我们有捕捉出某种特定分类的需求的状况。
比如,我们现在要对潜逃人员和普通人进行分类,潜在犯罪占总人口比例是相当低的,也许是 2%,这样 98% 都是普通人,而我们的目标是要捕获潜在犯罪者。这样的标签分布会带来很多问题。
首先,分类模型天生会倾向于多数的类,让多数类更容易被判断正确,少数类被牺牲掉。因为对于模型而言,样本量越大的标签可以学习的信息越多,算法就会更依赖于从多数类中学习到的信息来进行判断,若我们希望捕获少数类,模型就会失败。
其次,模型评估指标会失去意义,这种分类状况下,即使模型什么也不做,全把所有人当作不会犯罪的人,准确率也会非常的高。这使得模型的评估标准的 Accuracy 变得毫无意义,根本无法达到我们要的“识别犯罪的人”的建模目的。
所以现在,我们要让算法意识到数据的标签不是均衡的,通过施加一些惩罚或者改变样本本身,来让模型捕获少数类的方向建模。

我们可以使用上采样和下采样来达到这个目的,所用的方法就叫做SMOTE,这种方法通过将少数的特征重新组合,创造出更多少数类样本。但这些采样方法会增加样本的总数,对于决策树这个样本总是对计算速度影响巨大的算法来说,我们完全不想轻易的增加样本数量,所以我们要寻求另一条路:改进我们的模型评估指标,使用更加针对于少数类的指标来优化模型。

class_weight

在决策中,存在着调节样本均衡的参数:class_weight 和接口 fit 中可以设定的 sample_weight。
在决策树中,参数 class_weight 默认 None,此模式表示假设数据集中的所有标签是均衡的,即自动认为标签比例是:1:1,所以当样本不均衡的时候,我们可以使用形如:

{
  "标签的值 1": 权重1,
  "标签的值 2": 权重2
}

用这种字典输入真实的样本标签比例,来让算法意识到样本是不平衡的,或者使用 balanced 模型。
有了权重之后,样本量就不再是单纯的记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配 min_weight_fraction_leaf 这个基于权重的剪枝参数来使用。
另请注意,基于权重的剪枝参数(例如 min_weight_fraction_leaf)将比不知道样本权重的标准(比如 min_samples_leaf)更少偏向主导类。如果是样本是加权的,则使用基于权重的预修剪标准来更容易优化树结构,这确保叶节点至少包含样本权重总和的一小部分。

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

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

相关文章

报错:npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

报错场景 使用npm run dev 报错 npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 npm…

Python基于TensorFlow实现双向循环神经网络GRU加注意力机制分类模型(BiGRU-Attention分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着深度学习技术的发展,循环神经网络(RNN)及其变种如门控循环…

从APP小游戏到Web漏洞的发现

一、前因: 在对一次公司的一个麻将游戏APP进行渗透测试的时候发现,抓到HTTP请求的接口,但是反编译APK后发现没有在本身发现任何一个关于接口或者域名相关的关键字,对此感到了好奇。 于是直接解压后everything搜索了一下&#xff…

C++ | Leetcode C++题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; class Solution { public:int findMaxLength(vector<int>& nums) {int maxLength 0;unordered_map<int, int> mp;int counter 0;mp[counter] -1;int n nums.size();for (int i 0; i < n; i) {int num nums[i];if …

一个月调研分析标的“英伟达”

放在现在依然成立 一、移动网兴起至今的最佳股票与人工智能时代的目标 9 年移动网兴起至今&#xff0c;若选一只股票长期持有&#xff0c;最佳解是 ARM&#xff08;涨了 20 倍&#xff09;&#xff0c;因为无论系统层和应用层谁胜出&#xff0c;底层一定是芯片&#xff0c;而…

5.Java入门笔记--数组

数组就是一个容器&#xff0c;用来存储一批同种类型的数据。 1.静态初始化数组 定义数组的时候直接给数组赋值。 静态初始化数组的格式&#xff1a; //完整格式 数据类型[] 数组名 new 数据类型[]{元素1,元素2,元素3...}; int [] ages new int[]{12,24,36} double[] scor…

SSM学习 day02

一、vue项目开发流程 vue根组件 <template><div><h1>{{ message }}</h1><element-view></element-view></div> </template><script> import ElementView from ./views/Element/ElementView.vue export default {compon…

OpenGL入门003——使用Factory设计模式简化渲染流程

前面两节已经学会了如何使用opengl创建窗口并绘制三角形&#xff0c;我们可以看出有些步骤是固定的&#xff0c;而且都写在main.cpp&#xff0c;这一节我们将了解如何使用Factroy设计模型。将模型渲染逻辑封装在一个单独的类中&#xff0c;简化开发流程&#xff0c;且提高代码复…

【CSS/SCSS】@layer的介绍及使用方法

目录 基本用法layer 的作用与优点分离样式职责&#xff0c;增强代码可读性和可维护性防止无意的样式冲突精确控制样式的逐层覆盖提高复用性 兼容性实际示例&#xff1a;使用 import 管理加载顺序实际示例&#xff1a;混入与 layer 结合使用 layer 是 CSS 中用于组织和管理样式优…

PHP反序列化原生类字符串逃逸框架反序列化利用

PHP反序列化 概念 序列化的原因&#xff1a;为了解决开发中数据传输和数据解析的一个情况(类似于要发送一个椅子快递&#xff0c;不可能整个椅子打包发送&#xff0c;这是非常不方便的&#xff0c;所以就要对椅子进行序列化处理&#xff0c;让椅子分成很多部分在一起打包发送…

红队-shodan搜索引擎篇

如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一.shodan原理与功能的介绍 Shodan Search Engine 它是专门搜网络设备的,只要联网的,只要有IP地址的都可以称为网络设备 1.shodan&#x…

synchronized进阶原理

synchronized进阶原理 1.轻量级锁 轻量级锁的使用场景:如果一个对象虽然有多个线程访问,但多线程访问的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化(如果出现竞争,操作系统会将轻量级锁升级为重量级锁)。轻量级锁对使用者是透明的(由操作系统控制),即语法仍是s…

JavaWeb——Web入门(3/9)-HTTP协议:概述(概念、特点,HTTP协议定义,基于 TCP 协议,基于请求-响应模型)

目录 概念 特点 内容预告 概念 HTTP 协议定义&#xff1a;全称 Hyper Text Transfer Protocol&#xff0c;即超文本传输协议&#xff0c;规定了浏览器与服务器之间数据传输的规则&#xff0c;具体指客户端浏览器与服务器之间进行数据交互的数据格式。 在互联网的世界中&…

Altium Designer使用技巧(二)

一、创建类 1、按DC键&#xff0c;打开对象类。 2、右键添加一个类。命名为PWR。 3、将所有的电源类&#xff0c;全部添加到新创建的类中&#xff0c;从非成员类中点选到成员类中。 4、右下角点panes ,点PCB。 5、然后在左边单击PWR&#xff0c;点连接&#xff0c;可显示或…

边缘计算【智能+安全检测】系列教程--agx orin解决RTC时间问题

因为是离线运行&#xff0c;首要问题是时间不准确&#xff0c;就在主板上加装了纽扣电池&#xff0c;但是会有一系列问题&#xff0c;比如无法将RTC时间回写到系统时间&#xff0c;或者无法将系统时间写到RTC中等等一些列问题。为解决这些问题&#xff0c;一劳永逸的方式&#…

React中常用的hook函数(二)——useReducer和useContext

React中常用的hook函数(一)——useState和useEffect_usestate useeffect-CSDN博客https://blog.csdn.net/Mrs_Lupin/article/details/142905749?sharetypeblogdetail&sharerId142905749&sharereferPC&sharesourceMrs_Lupin&spm1011.2480.3001.8118React中常用…

Java项目实战II基于Java+Spring Boot+MySQL的智能推荐的卫生健康系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 基于Java、…

《Linux系统编程篇》消息队列(Linux 进程间通信(IPC))——基础篇

文章目录 引言消息队列&#xff08;Message Queue&#xff09;消息队列的特点消息队列的特性消息队列的操作ipcs -q 拓展ipcrm 拓展注意事项 结论 “山重水复疑无路&#xff0c;柳暗花明又一村。” ——陆游 引言 《Linux系统编程篇》——基础篇首页传送门 想象一下&#xff0…

微服务设计模式 - 重试模式(Retry Pattern)

微服务设计模式 - 重试模式&#xff08;Retry Pattern&#xff09; 定义 重试模式&#xff08;Retry Pattern&#xff09;是一种微服务中的设计模式&#xff0c;用于在临时性失败&#xff08;如网络故障或暂时不可用的服务&#xff09;发生时&#xff0c;自动重新尝试请求&…