CART与决策树中的超参数

先前的决策树其实应该称为CART

CART的英文是Classification and regression tree,全称为分类与回归树,其是在给定输入随机变量X条件下输出随机变量Y的条件概率分布的学习方法,就是假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支,其可以解决分类问题,又可以解决回归问题,特点就是根据某一个维度d和某一个阈值v进行二分

在sklearn中的决策树都是CART的方式实现的

回顾前面,不难发现,对于之前的决策树的划分模拟,平均而言,预测的复杂度是O(logm),其中m为样本个数,这样创建决策树的训练的过程的复杂度是O(nmlogm),是很高的,n为维度数,还有一个重要的问题就是很容易产生过拟合

那么因为种种原因,在创建决策树的时候需要进行剪枝,即降低复杂度,解决过拟合的操作

剪枝的操作有很多种,实际上就是对各种参数进行平衡

通过具体操作来体现一下

(在notebook中)

加载好需要的包,使用make_moons生成虚拟数据,将数据情况绘制出来

  import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets X,y = datasets.make_moons(noise=0.25,random_state=666) plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下

然后使用DecisionTreeClassifier这个类,不进行任何限定操作,进行实例化操作以后训练数据

  from sklearn.tree import DecisionTreeClassifier

  dt_clf = DecisionTreeClassifier()
dt_clf.fit(X,y)

绘制函数,绘制图像

from matplotlib.colors import ListedColormap
def plot_decision_boundary(model, axis): x0,x1 = np.meshgrid(
np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)).reshape(-1,1),
np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100)).reshape(-1,1)
)
X_new = np.c_[x0.ravel(),x1.ravel()] y_predict = model.predict(X_new)
zz = y_predict.reshape(x0.shape) custom_cmap = ListedColormap(['#EF9A9A', '#FFF59D', '#90CAF9']) plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap) plot_decision_boundary(dt_clf,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下(可以发现决策边界很不规则,很明显产生了过拟合)

设置参数max_depth为2,限制最大深度为2,然后训练数据并绘制模型

  dt_clf2 = DecisionTreeClassifier(max_depth=2)
dt_clf2.fit(X,y) plot_decision_boundary(dt_clf2,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下(可以发现过拟合已经不明显了,很清晰的表示出了边界)

还可以设置参数min_samples_split为10,限制一个节点的样本数最小为10,然后训练数据并绘制模型

  dt_clf3 = DecisionTreeClassifier(min_samples_split=10)
dt_clf3.fit(X,y) plot_decision_boundary(dt_clf3,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下(过拟合程度低)

还可以设置参数min_samples_leaf为6,限制一个叶子节点样本数至少为6,然后训练数据并绘制模型

  dt_clf4 = DecisionTreeClassifier(min_samples_leaf=6)
dt_clf4.fit(X,y) plot_decision_boundary(dt_clf4,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下

还可以设置参数max_leaf_nodes为4,限制叶子节点最多为4,然后训练数据并绘制模型

  dt_clf5 = DecisionTreeClassifier(max_leaf_nodes=4)
dt_clf5.fit(X,y) plot_decision_boundary(dt_clf5,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下

可以发现,对参数进行适当的修改可以很好的解决过拟合的问题,但是需要注意不要调节到欠拟合,那么寻找到合适的参数就可以使用网格搜索的方式

【笔记】CART与决策树中的超参数的更多相关文章

  1. 机器学习:决策树(CART 、决策树中的超参数)

    老师:非参数学习的算法都容易产生过拟合: 一.决策树模型的创建方式.时间复杂度 1)创建方式 决策树算法 既可以解决分类问题,又可以解决回归问题: CART 创建决策树的方式:根据某一维度 d 和某一 ...

  2. DeepLearning.ai学习笔记(二)改善深层神经网络:超参数调试、正则化以及优化--Week2优化算法

    1. Mini-batch梯度下降法 介绍 假设我们的数据量非常多,达到了500万以上,那么此时如果按照传统的梯度下降算法,那么训练模型所花费的时间将非常巨大,所以我们对数据做如下处理: 如图所示,我 ...

  3. 【笔记】KNN之网格搜索与k近邻算法中更多超参数

    网格搜索与k近邻算法中更多超参数 网格搜索与k近邻算法中更多超参数 网络搜索 前笔记中使用的for循环进行的网格搜索的方式,我们可以发现不同的超参数之间是存在一种依赖关系的,像是p这个超参数,只有在 ...

  4. Coursera Deep Learning笔记 改善深层神经网络:超参数调试 正则化以及梯度相关

    笔记:Andrew Ng's Deeping Learning视频 参考:https://xienaoban.github.io/posts/41302.html 参考:https://blog.cs ...

  5. deeplearning.ai 改善深层神经网络 week3 超参数调试、Batch正则化和程序框架 听课笔记

    这一周的主体是调参. 1. 超参数:No. 1最重要,No. 2其次,No. 3其次次. No. 1学习率α:最重要的参数.在log取值空间随机采样.例如取值范围是[0.001, 1],r = -4* ...

  6. [DeeplearningAI笔记]02_3.1-3.2超参数搜索技巧与对数标尺

    Hyperparameter search 超参数搜索 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.1 调试处理 需要调节的参数 级别一:\(\alpha\)学习率是最重要的需要调节的 ...

  7. Deep Learning.ai学习笔记_第二门课_改善深层神经网络:超参数调试、正则化以及优化

    目录 第一周(深度学习的实践层面) 第二周(优化算法) 第三周(超参数调试.Batch正则化和程序框架) 目标: 如何有效运作神经网络,内容涉及超参数调优,如何构建数据,以及如何确保优化算法快速运行, ...

  8. ng-深度学习-课程笔记-8: 超参数调试,Batch正则(Week3)

    1 调试处理( tuning process ) 如下图所示,ng认为学习速率α是需要调试的最重要的超参数. 其次重要的是momentum算法的β参数(一般设为0.9),隐藏单元数和mini-batc ...

  9. 【笔记】KNN之超参数

    超参数 超参数 很多时候,对于算法来说,关于这个传入的参数,传什么样的值是最好的? 这就涉及到了机器学习领域的超参数 超参数简单来说就是在我们运行机器学习之前用来指定的那个参数,就是在算法运行前需要决 ...

随机推荐

  1. 前端笔记:Html页面常用元素

    Html页面由基本几个元素(标签)组成 html.head.body.foot(很少使用). html是整个页面的父级元素,内部包括head.body.foot子类标签. head是页头,及页面的头部 ...

  2. buu crypto 凯撒?替换?呵呵!

    一. 以为是简单的凯撒加密,但是分析Ascill表,发现毫无规律,意味着要爆破出所有可能.只能用在线工具来弄了,脚本是不可能写的(狗头) 找到了,但是提交不成功,需要变成小写,用脚本转换一下,同时很坑 ...

  3. spring集成flyway

    最近给公司项目集成flyway,由于我们项目移动端使用的是spring框架,网上看了很多博客,感觉这方面的东西还是很少的,毕竟现在是springboot的天下,大多数都是springboot集成fly ...

  4. Pandas高级教程之:window操作

    目录 简介 滚动窗口 Center window Weighted window 加权窗口 扩展窗口 指数加权窗口 简介 在数据统计中,经常需要进行一些范围操作,这些范围我们可以称之为一个window ...

  5. 从sql2008导入表结构及数据到mysql

    打开navicat for mysql连接mysqlcreate database lianxi刷新,双击lianxi,双击"表"点击右边的"导入向导"选择&q ...

  6. Python图表库Matplotlib 组成部分介绍

    图表有很多个组成部分,例如标题.x/y轴名称.大刻度小刻度.线条.数据点.注释说明等等. 我们来看官方给的图,图中标出了各个部分的英文名称 Matplotlib提供了很多api,开发者可根据需求定制图 ...

  7. .Net Core with 微服务 - Polly 服务降级熔断

    在我们实施微服务之后,服务间的调用变的异常频繁.多个服务之间可能是互相依赖的关系.某个服务出现故障或者是服务间的网络出现故障都会造成服务调用的失败,进而影响到某个业务服务处理失败.某一个服务调用失败轻 ...

  8. SpringBoot总结之Spring Data Jpa

    一.Spring Data Jpa简介 JPA(Java Persistence API)定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate.TopLink等. Spring D ...

  9. 深入理解JavaScript中的继承

    1前言 继承是JavaScript中的重要概念,可以说要学好JavaScript,必须搞清楚JavaScript中的继承.我最开始是通过看视频听培训班的老师讲解的JavaScript中的继承,当时看的 ...

  10. Kafka之--自动启动zookeeper & kafka 脚本

    1) 首先配置SSH免密登录,在这里我用kafka(151)这台机器来作为启动脚本的存放和执行机器 [root@kafaka3 .ssh]# pwd #生成SSH KEY /root/.ssh [ro ...