原文链接: http://tecdat.cn/?p=14056

原文出处:拓端数据部落公众号

本文为了说明回归树的构造(使用CART方法),考虑以下模拟数据集,

> set.seed(1)
> n=200
> X1=runif(n)
> X2=runif(n)
> P=.8*(X1<.3)*(X2<.5)+
+   .2*(X1<.3)*(X2>.5)+
+   .8*(X1>.3)*(X1<.85)*(X2<.3)+
+   .2*(X1>.3)*(X1<.85)*(X2>.3)+
+   .8*(X1>.85)*(X2<.7)+
+   .2*(X1>.85)*(X2>.7)
> Y=rbinom(n,size=1,P)
> B=data.frame(Y,X1,X2)

具有一个因变量(感兴趣的变量)和两个连续的自变量( 变量 和)。

> tail(B)Y        X1        X2
195 0 0.2832325 0.1548510
196 0 0.5905732 0.3483021
197 0 0.1103606 0.6598210
198 0 0.8405070 0.3117724
199 0 0.3179637 0.3515734
200 1 0.7828513 0.1478457

理论分区如下

在这里,可以将样本绘制在下方(请注意,第一个变量在上方的y轴上,在下方的x轴上),蓝色点   等于1,红色点等于0,

> plot(X1,X2,col="white")
> points(X1[Y=="1"],X2[Y=="1"],col="blue",pch=19)
> points(X1[Y=="0"],X2[Y=="0"],col="red",pch=19)

为了构造树,我们需要一个分区critera。最标准的可能是Gini的索引,当将s分为两类时,可以写出该索引,  在此表示 

或  将分为三类时,表示为 

等等,这里 只是属于分区的观测值的计数,   其   取值为。但是可以考虑其他标准,例如卡方距离,

在传统上,当我们考虑两个等级时,或者在三个等级的情况下。

同样,这里的想法是使距离最大化:想法是区分,所以我们希望样本尽可能不独立。要计算基尼系数

 

我们只需构造列联表,然后计算上面给出的数量。首先,假设只有一个解释变量。我们将样本一分为二,并使用所有可能的分割值,即

然后,我们为所有这些值计算基尼系数。结是使基尼系数最大化的值。有了第一个节点后,我们将继续保留(从现在开始将其称为)。我们通过寻找最佳第二选择来重申:给定一个根节点,考虑将样本一分为三的值,并给出最高的基尼系数,因此,我们考虑以下分区

或这个

也就是说,我们在上一个结的下方或上方分割。然后我们进行迭代。代码可以是这样的,


> for(s in 1:4){
+ for(i in 1:length(u)){+ vgini[i]=GINI(Y,I)+ }
+
+
+ cat("knot",k,u[k],"\n")
+
+
+ }
knot 69 0.3025479
knot 133 0.5846202
knot 72 0.3148172
knot 111 0.4811517

第一步,基尼系数的值如下:

最高约为0.3。然后,我们尝试分三部分构造一个分区(拆分为0.3以下或以上)。我们得到以下基尼系数图(作为第二个节点的函数)

当样本在0.6左右分裂(这成为我们的第二个节点)时最大。等,现在,让我们将代码与标准R函数进行比较,

node), split, n, deviance, yval* denotes terminal node1) root 200 49.8800 0.4750  2) X2 < 0.302548 69 12.8100 0.7536 *3) X2 > 0.302548 131 28.8900 0.3282  6) X2 < 0.58462 65 16.1500 0.4615  12) X2 < 0.324591 7  0.8571 0.1429 *13) X2 > 0.324591 58 14.5000 0.5000 *7) X2 > 0.58462 66 10.4400 0.1970 *

我们确实获得了类似的结:第一个为0.302,第二个为0.584。因此,构造树并不难...

现在,如果我们考虑两个解释变量,该怎么办?保持不变,除了分区的编写现在变得更加复杂。为了找到第一个节点,我们考虑了两个分量的所有值,然后再次保持最大化基尼指数的值,


> plot(u1,gini[,1],ylim=range(gini),col="green",type="b",xlab="X1",ylab="Gini index")
> abline(h=mg,lty=2,col="red")
> if(i==1){points(u1[which.max(gini[,1])],mg,pch=19,col="red")
+          segments(u1[which.max(gini[,1])],mg,u1[which.max(gini[,1])],-100000)}
> u2[which.max(gini[,2])]
[1] 0.3025479

这些图如下所示并获得了右侧的分区,

或者我们分割第二个分区(然后得到以下分区),

在这里,最好先分割第二个变量。实际上,我们回到了前面讨论的一维情况:正如预期的那样,最好在0.3左右进行分割。以下代码已确认这一点,

var   n       dev      yval splits.cutleft splits.cutright
1     X2 200 49.875000 0.4750000      <0.302548       >0.302548
2     X1  69 12.811594 0.7536232      <0.800113       >0.800113
4 <leaf>  57  8.877193 0.8070175
5 <leaf>  12  3.000000 0.5000000

对于第二个结,应考虑四种情况:在第二个变量上再次分裂(再次),在上一个结之上或之下(请参见左下方)或在第一个变量分裂。然后在上一个结的下方或上方设置一个分区(请参见右下方),

为了使树可视化,代码如下

注意,我们也可以可视化该分区。


参考文献

1.从决策树模型看员工为什么离职

2.R语言基于树的方法:决策树,随机森林,套袋Bagging,增强树数据分析

3.python中使用scikit-learn和pandas决策树进行鸢尾花数据分类

4.R语言对用电负荷时间序列数据进行K-medoids聚类建模和GAM回归

5.R语言k-Shape算法股票价格时间序列聚类

6.r语言鸢尾花iris数据集的层次聚类

7.Python Monte Carlo K-Means聚类实战研究

8.用R进行网站评论文本挖掘聚类

9.Python中的Apriori关联算法市场购物篮分析

10.通过Python中的Apriori算法进行关联规则挖掘

11.使用LSTM神经网络预测爱尔兰的电力消耗

12.用R语言实现神经网络预测股票实例

拓端tecdat|R语言中自编基尼系数的CART回归决策树的实现相关推荐

  1. R语言ineq算基尼系数_R语言中自编基尼系数的CART回归决策树的实现

    原文链接 本文为了说明回归树的构造(使用CART方法),考虑以下模拟数据集, > set.seed(1) > n=200 > X1=runif(n) > X2=runif(n) ...

  2. 拓端tecdat|R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险

    最近我们被客户要求撰写关于冠心病风险的研究报告,包括一些图形和统计输出. 相关视频:R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险 逻辑回归Logistic模型原理和R语言分类预测冠 ...

  3. 拓端tecdat|R语言用LOESS(局部加权回归)季节趋势分解(STL)进行时间序列异常检测

    最近我们被客户要求撰写关于LOESS(局部加权回归)的研究报告,包括一些图形和统计输出. 这篇文章描述了一种对涉及季节性和趋势成分的时间序列的中点进行建模的方法.我们将对一种叫做STL的算法进行研究, ...

  4. 拓端tecdat|R语言向量误差修正模型 (VECMs)分析长期利率和通胀率影响关系

    最近我们被客户要求撰写关于向量误差修正模型的研究报告,包括一些图形和统计输出. 向量自回归模型估计的先决条件之一是被分析的时间序列是平稳的.但是,经济理论认为,经济变量之间在水平上存在着均衡关系,可以 ...

  5. 拓端tecdat|R语言线性回归和时间序列分析北京房价影响因素可视化案例

    最近我们被客户要求撰写关于北京房价影响因素的研究报告,包括一些图形和统计输出. 目的 房价有关的数据可能反映了中国近年来的变化: 人们得到更多的资源(薪水),期望有更好的房子 人口众多 独生子女政策: ...

  6. R语言中使用非凸惩罚函数回归(SCAD、MCP)分析前列腺数据

    原文链接:http://tecdat.cn/?p=20828 本文使用lasso或非凸惩罚拟合线性回归,GLM和Cox回归模型的正则化,特别是_最小_最_大凹_度_惩罚_函数_(MCP)_和光滑切片绝 ...

  7. 数据分享|R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化...

    全文链接:http://tecdat.cn/?p=22262 在讨论分类时,我们经常分析二维数据(一个自变量,一个因变量)(点击文末"阅读原文"获取完整代码数据). 但在实际生活中 ...

  8. R语言中的广义线性模型(GLM)和广义相加模型(GAM):多元(平滑)回归分析保险资金投资组合信用风险敞口

    最近我们被客户要求撰写关于信用风险敞口的研究报告,包括一些图形和统计输出. 在之前的课堂上,我们已经看到了如何可视化多元回归模型(带有两个连续的解释变量).在此,目标是使用一些协变量(例如,驾驶员的年 ...

  9. 在r语言中使用GAM(广义相加模型)进行电力负荷时间序列分析

    广义相加模型(GAM:Generalized Additive Model),它模型公式如下:有p个自变量,其中X1与y是线性关系,其他变量与y是非线性关系,我们可以对每个变量与y拟合不同关系,对X2 ...

  10. 二次拟合r方_拟合R语言中的多项式回归

    原标题:拟合R语言中的多项式回归 让我们看一个经济学的例子:假设你想购买一定数量q的特定产品.如果单价是p,那么你会支付总金额y.这是一个线性关系的典型例子.总价格和数量成正比. 如下所示: 但购买和 ...

最新文章

  1. const在函数前与函数后的区别 [转]
  2. AI破解脑电波,准确率超80%!高度还原你眼中最美的ta
  3. ASP.NET MVC 学习1
  4. CSS弹出二级多列菜单和DIV布局实例 - 仿IBM官网首页
  5. 使用AFNetworking请求新浪微博数据接口出错解决办法
  6. 找找 Spring Event 源码中各种设计模式的使用
  7. 探访物联网安全新边界 文印保护成思维盲区
  8. Linux 下的/usr/bin /usr/sbin /usr/local/bin /usr/local/sbin区别
  9. php 服务器 mac地址吗,php获取服务器端mac和客户端mac的地址
  10. 用MATLAB编程课程设计,matlab课程设计报告---用Mtlab编程实现句柄图形应用
  11. 4083. 最大公约数
  12. 如何检验java环境变量是否配好_如何验证Java环境变量配置成功
  13. BP 神经网络的非线性系统建模——非线性函数拟合
  14. 【数字逻辑设计】电路原理图
  15. 内存带宽测试工具 mbw
  16. 有重复组合公式及其证明方法
  17. php判断手机号码归属地,手机号码归属查询大全所在位置(PHP通过API获取手机号码归属地)...
  18. Beyond compare4激活使用
  19. JavaWeb中的四大作用域
  20. 喝酒骑行电瓶车属于违法或者犯罪吗?

热门文章

  1. kafka单机环境搭建
  2. mysql二进制增量备份
  3. 我的年终总结:做了9年SOC的一点点实践体会
  4. C# 用装饰模式实现蝌蚪变青蛙的过程-续
  5. 创新的垃圾处理模式——赛普利
  6. 对失恋男人的10条忠告
  7. MapReduce中的排序和分组
  8. 在AspNetCore中json序列化日期格式自定义
  9. 第三季-第25课-UDP通讯程序设计
  10. 第35课 函数对象分析(函数操作符()重载)