分类决策树原理及sklearn.tree.DecisionTreeClassifier参数说明_sklearn decisiontreeclassifier-程序员宅基地

技术标签: 数据挖掘算法  sklearn  决策树  分类  

一)前言
决策树这个算法说起来很简单,思路也很简单明了。但是如果你深入了解一下,里面的内容也相当的丰富,能细讲的也很多。决策树可以用于分类,也可以用于回归,今天这篇文章,主要总结了分类决策树原理,以及Sklearn库中分类决策树的使用参数,最后我还会用前面讲的网格搜索对分类决策树的参数进行优化。如果有哪些讲述的不太准确,还请大家在评论区指正。

二)决策树原理
决策树是一种类似于流程图的树结构,其中,每个内部结点(非树叶结点)表示在一个属性上的测试,每个分枝代表该测试的一个输出,而每个树叶结点(终端结点)存放一个类标号。树的最顶层结点是根结点。
核心思想:相似的输入必会产生相似的输出。
第一步:从训练样本矩阵中选择第一个特征进行子表的划分,使每个子表中该特征的值全部相同。
第二步:再在每个子表中选择下一个特征按照同样的规则划分更小的子表,
第三步:不断重复步骤一,二,直到所有特征全部使用完为止。此时便得到了叶级子表,其中所有的特征值完全相同。

对于待预测样本,根据其每一个特征的值,选择对应的子表,逐一匹配,找到与之完全匹配的叶级子表,用该子表中样本的输出,通过平均(回归问题)或投票(分类)的方式为待预测样本提供输出。

我画一个图出来,可能大家会更好理解(每个特征假定只有两个变量)

特征1 特征2 特征3 结果
1 6 3 100
2 9 5 120
1 6 5 200
。。。 。。。 。。。 。。。

在这里插入图片描述

三)sklearn.tree.DecisionTreeClassifier参数说明
先贴个官方文档:
https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier

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)

1、criterion: 特征选取标准。
默认:gini。
可选gini(基尼系数)或者entropy(信息增益)。

1.1选择entropy,则是ID3或C4.5算法。
ID3算法原理:
a 计算训练集所有样本的信息熵。
b 计算每一特征分类后的信息增益。
c 选择信息增益最大的特征进行分类,得到子节点。
d 在还未被选择的特征中迭代b和c,直到无特征可分或信息增益已经无法达到要求的标准时,算法终止。
计算公式说明:
在这里插入图片描述

C4.5算法原理:
C4.5是在ID3的算法基础上,采用信息增益率来做为特征选择,通过增加类别的惩罚因子,规避了ID3中类别越多信息增益越大的问题,同时也可以对连续变量通过均值离散化的方式,解决了ID3算法无法处理连续变量的问题。过程和ID3一样。
计算公式说明:
在这里插入图片描述

1.2通常选择gini,则是CART算法。
我简单描述一下CART算法原理:
CART不再通过信息熵的方式选取最优划分特征,而是采用基尼系数,也叫基尼不纯度,两者衡量信息量的作用相当,但是基尼系数由于没有对数运算,可大大减少计算开销。
当然CART相对于ID3,C4.5最大的优势就是可以处理回归问题。CART算法处理分类问题时,以叶子节点上样本投票预测类别,处理回归问题时,以叶子节点的样本均值作为预测值。
CART算法的过程如下:
a 计算训练集所有样本的基尼系数。
b 计算某一特征下每一属性划分后左右两边的基尼系数,找到基尼系数和最小的划分属性。
c 将每一个特征均按b中的方法计算,得到每一个特征最佳的划分属性。
d 对比c中每一个特征的最优划分属性下的基尼系数和,最小的就是最优的划分特征。
e 按最优的特征及最优属性划分,得到子节点。
f 在还未被选择的特征中迭代b-e,直到无特征可分或信息增益率已经无法达到要求的标准时,算法终止。
gini系数公式及举例:
在这里插入图片描述

1.3 两种算法差异不大对准确率无影响,信息墒的运行效率低一点,因为它有对数运算.一般说使用默认的基尼系数”gini”就可以了,即CART算法。

  1. splitter: 特征划分标准
    可选best或random,默认为best。
    best是在特征的全部划分点中找到最优的划分点,比如基于信息增益分类时,则选择信息增益最大的特征点。
    random是在随机选择的部分划分点找到局部最优的划分点,具体是如何随机选择的部分划分点的,我也不清楚,这个需要查看源码才知道。如果你看到了这篇文章,恰好又知道其中原理,不妨留言交流下。
    一般在样本量不大的时候,选择best,样本量过大,用random。

3.max_depth:决策树最大深度
默认为None。
一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。常用来解决过拟合

  1. min_samples_split:内部节点再划分所需最小样本数
    默认为2。
    意义:如果节点上的样本已经低于这个值,则不会再寻找最优的划分点进行划分,且以该结点作为叶子节点。样本过多的情况下,可以设定一个阈值,具体可根据业务需求和数据量来定。可以输入一个具体的值(int),或小于1的数(float类型,会根据样本量计算百分比)。

5.min_samples_leaf:叶子节点所需最少样本数
默认为1。
意义:如果达不到这个阈值,则同一父节点的所有叶子节点均被剪枝,这是一个防止过拟合的参数。可以输入一个具体的值(int),或小于1的数(float类型,会根据样本量计算百分比)。

6.min_weight_fraction_leaf:叶子节点所有样本权重和
默认为0。
意义:如果低于阈值,则会和兄弟节点一起被剪枝,默认是0,就是不考虑权重问题。这个一般在样本的分布类别偏差很大,或有较多缺失值的情况下会考虑,这时我们就要注意这个值了。

7.max_features:划分考虑最大特征数
默认为None。
意义:不输入则默认全部特征,可以选 log2N,sqrt(N),auto或者是小于1的浮点数(百分比)或整数(具体数量的特征)。如果特征特别多时,比如大于50,可以考虑选择auto来控制决策树的生成时间。

8.random_state:随机数生成种子
默认为:None。
意义:设置随机数生成种子是为了保证每次随机生成的数是一致的(即使是随机的);如果不设置,那么每次生成的随机数都是不同的。

9.max_leaf_nodes:最大叶子节点数
默认为:None。
意义:防止过拟合,默认不限制,如果设定了阈值,那么会在阈值范围内得到最优的决策树。
如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。

10.min_impurity_decrease:节点划分最小不纯度
默认为:0。
意义:这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益)小于这个阈值,则该节点不再生成子节点。
sklearn 0.19.1版本之前叫 min_impurity_split。

11.class_weight:类别权重
默认为:None。
意义:在样本有较大缺失值,或类别偏差较大时可选,防止决策树向类别过大的样本倾斜。可设定None或者balanced,后者会自动根据样本的数量分布计算权重,样本数少则权重高,与min_weight_fraction_leaf对应。
不适用于回归树 sklearn.tree.DecisionTreeRegressor

12.Presort:是否排序
默认为:False。

模型参数选择的几项建议:
1.样本少数量但是样本特征非常多的时候,决策树很容易过拟合,在拟合决策树模型前,推荐先做维度规约,比如主成分分析(PCA),特征选择(Losso)。这样特征的维度会大大减小。再来拟合决策树模型效果会好。
在训练模型先,注意观察样本的类别情况(主要指分类树),如果类别分布非常不均匀,就要考虑用class_weight来限制模型过于偏向样本多的类别。

接下来,用sklearn.tree.DecisionTreeClassifier来做泰坦尼克号的预测,来演示下各参数的应用。由于文章篇幅有限,具体的代码讲解放在一下篇文章中。
注:2022:-06-15日,对ID3,C4.5,CART算的公式做了补充说明

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/MR_Trustin/article/details/96886157

智能推荐

git排除某文件的提交_sourcetree .git 强制忽略指定文件不提交-程序员宅基地

文章浏览阅读435次。在公司写项目,大部分都会用到 svn 或 git 提交代码到服务器。我们公司用的GIT,每个程序员有自己的独立分支,各写各的代码互不冲突,最终合并到主分支再解决相同代码冲突问题。这时候会遇到一些配置文件提交的问题,每个程序员在自己的电脑都有自己的环境,每个环境配置各不相同,这样导致提交代码的时候都把自己的配置文件一起提交上去,这样每次提交都需要单独合并解决配置问题的冲突,对于更新平凡的项目来说很麻..._sourcetree里可以忽略某些提交吗?

JedisPool的testOnBorrow、testOnReturn和testWhileIdle参数的实现原理_jedis testonborrow-程序员宅基地

文章浏览阅读8.2k次,点赞6次,收藏13次。前言我们平时使用jedispool来连接Redis的集群、sentinel或者主从服务器,经常会遇到testOnBorrow、testOnReturn和testWhileIdle这些参数的设置问题,我们知道连接Redis服务器的连接是维护在通用对象池中的,如果想要正确的、符合自己业务场景的设置这些参数,需要了解其底层原理。Jedispool和genericObjectPool的关系我们翻到j..._jedis testonborrow

【STM32】 4X4矩阵键盘电路_stm32 4x4矩阵键盘-程序员宅基地

文章浏览阅读7.1k次,点赞4次,收藏33次。【STM32】 4X4矩阵键盘电路_stm32 4x4矩阵键盘

java中下拉框select和单选按钮的回显_"<select name=\"cid\"> <option value=\"0\">请选择</op-程序员宅基地

文章浏览阅读1.9k次。前提:&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%&gt;1.下拉框select&lt;select name="departmentId" id="departmentId"&gt; &lt;option value="0"&gt;请选择部门&_" 请选择

ORACLE---Unit04: SQL(高级查询)-程序员宅基地

文章浏览阅读94次。---(重点复习:子查询、分页查询、decode)--- SQL(高级查询)--- 子查询--- 子查询是嵌套在其它SQL语句当中的,目的是为嵌套的SQL提供数据,以便其执行。---查看谁的工资高于CLARK?---1.先查CLARK的工资SELECT sal FROM emp_RR WHERE ename='CLARK';--->2450---2.工资高于CLARK的员工信息SEL..._"在子查询依赖于管道,其中一个不在where子句中,启用:set enable_pipeline=true;\","

TP5.1 搜索功能分页传参_tp5.1 分页传参前台-程序员宅基地

文章浏览阅读367次。1.html代码<form class="form-horizontal" action="{:url('admin/AuthRoles/lst')}" method="get"><div class="input-group input-group-sm"> <input type="text" id="search" name="search" styl..._tp5.1 分页传参前台

随便推点

[cernRoot] how to get contours from a TH2D_cern root th2d-程序员宅基地

文章浏览阅读567次。here, i use a TMultiGraph to save the gotten contours, because the contours may be not closed in a TH2D, with the function TMultiGraph * GetContours(const char * fn, const char * th2dname, int nlevel)._cern root th2d

erdas正射校正、数据融合、影像镶嵌_erdas imagine制作dtm和dom-程序员宅基地

文章浏览阅读1.2w次,点赞15次,收藏104次。在几个传统影像处理软件中,erdas的处理速度往往是最快的(比起ENVI、argis),而且img格式稳定,不易变化,个人使用首推erdas,当然大规模生产的话还是任务订单式的GXL好,它在批处理的路上走得更远,以web方式提交任务,以集群方式处理数据,高并发的处理能力,估计很多传统做影像处理的人要失业,扯远了。下面是望神州公司的一个erdas操作教程,本人无意抄袭,只想给正在用ERDAS的人..._erdas imagine制作dtm和dom

idea连接数据库 The specified database user/password combination is rejected: com.mysql.cj报错_2021版idea连接阿里云mysql出现the specified database user/p-程序员宅基地

文章浏览阅读1.2w次,点赞4次,收藏3次。报错如下图:解决方法:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC转载自:https://blog.csdn.net/weixin_39938635/article/details/90212775.._2021版idea连接阿里云mysql出现the specified database user/password combinatio

linux服务器安装anaconda总结_home/jovyan在哪里-程序员宅基地

文章浏览阅读701次。一、官网下载linux版安装包https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh二、上传并进行安装将安装包拷贝至服务器,使用cd命令进入安装包所在位置,比如我拷到的是/home下面,就是cd /home。然后使用bash进行安装。cd /homebash Anaconda3-2019.10-Linux-x86_64.sh按照要求输入yes同意阅读协议,并一直按住enter键翻到底开始安装.._home/jovyan在哪里

C#并行编程高级教程:精通.NET 4 Parallel Extensions_.net4 parallel extension-程序员宅基地

文章浏览阅读5.5k次。基本信息原书名: Professional Parallel Programming with C#: Master Parallel Extensions with .NET 4原出版社: Wrox 作者: (美)Gaston Hillar [作译者介绍] 译者: 郑思遥 房佩慈 出版社:清华大学出版社 ISBN:9787302273561上架时间:2012-1_.net4 parallel extension

浅谈获取url传递的参数值的几种方式_<%=传获取的参数-程序员宅基地

文章浏览阅读1.3w次。以下内容是在开发中本人经常使用的方式,现总结如下:jsp页面中: //el表达式 获取请求参数var id = ${param.id}; var id = &lt;%=request.getParameter("id")%&gt; html页面中: //使用js 获取参数值function getQueryVariable(va..._<%=传获取的参数</div>

推荐文章

热门文章

相关标签