R语言第十一讲 决策树与随机森林

概念

       决策树主要有的回归和分类方法,这些方法主要根据分层和分割 的方式将预测变量空间划分为一系列简单区域。对某个给定待预测的观 测值,用它所属区域中训练集的平均值或众数对其进行预测。

       基于树的方法简便且易于解释。但预测准确性通常较低。

    

        如图所示,一共有5个人,我们根据年龄和性别进行判断,这个人是否喜欢打篮球。我们首先根据年龄是否大于15来判断是否喜欢打篮球。如上,判断出年龄大于15的都不喜欢打篮球,年龄小于15的可能喜欢打篮球。第一次划分,左边的数据集还具有不确定性,因此,我们再次根据性别进行划分,直到叶子节点的数据集的纯度较高时,停止划分。如上的树就是一棵决策树,决策之意,就是我们在每个分支节点上都定义了一个决策属性(age、is male)。使用方法:我们只需要将数据集中的每一个样本从上往下依次去走,直至到达叶子节点,来求得其预测值。

       真正的叶子节点的数据集的预测值往往达不到纯度(预测值数据占此叶子节点数据集的百分比)为100%,假设响应变量(是否打篮球)为定性变量,那么其响应值就是叶子节点数据集中出现次数最多的响应值,我们假设爷爷奶奶不喜欢打篮球,他妈妈喜欢打篮球,那么此叶子节点其响应值就是不喜欢打篮球。假设响应变量为定量变量(连续的数值类型),那么其响应值就是此叶子节点所有响应值的加权平均数。

      决策树,为什么要先用age决策呢,决策树如何建立的呢?

      接下来,我讲一讲决策树的训练阶段。如何从给定的数据集中构造出一棵决策树?

      

         如上图,假设这是一个人要去见约会对象了,我们将根据约会对象的年龄、长相、收入、是否是公务员来预测其去不去见他的约会对象。首先看年龄,其次看长相,再其次看收入……,决策的先后代表其重要的程度。

         熵  :描述一个子数据集的纯度指标。pi代表的是第i个响应值在叶子数据集中所占的比例,一共有n种响应值。从以下的公式,我们能够的出,如果一个数据集的纯度越高,其熵值就会越低,反之,越高。

       

         基尼系数: 描述一个子数据集的纯度指标。,如果一个数据集的纯度越高,其基尼系数值就会越低,反之,越高。

          

        到底谁来当根节点,这个是由计算机内部计算出来的。

        构造决策树的基本思想:随着树深度的增加,节点的熵值迅速的降低熵值降低的越快越好,这样就能得到一颗高度最矮的决策树。

        下面通过一个例子,来介绍决策树的构造过程。

         

          预测变量为:outlook(天气)、temperature(温度)、humidity(湿度)、windy(是否有风)。

          响应变量:是否出去玩(play)

          构造决策树:谁来当根节点?我们的得到如下的四种划分。

           

       上面说过了,决策树的构造是根据随着树深度的增加,节点的熵值迅速的降低熵值降低的越快越好。那么这四种划分,那种的熵值降低的幅度最大呢?原有数据集的熵值如下公式计算出来。

 

首先呢,若选择outlook作为根节点,首次划分之后,其熵值为多少呢?

outlook一共有14个样本

outlook=sunny时,5个样本,2/5的概率打球,3/5的概率不打球。entropy=0.971

outlook=overcast时,4个样本,entropy = 0

outlook=rainy时,5个样本,entropy= 0.971.

其熵值为:5/14 x 0.971 + 4/14 x 0 + 5/14 x 0.971 = 0.693。

如此,系统熵就从0.940降到了0.693.信息增益为 0.940 - 0.693 = 0.247

同样的temperature 信息增益为0.029,humidity 信息增益为0.152,windy 信息增益为0.048.

谁的信息增益大,取那个特征做决策,递归的其左右孩子皆为如此。

接下来,介绍一下一种算法叫做ID3算法,决策树传统的算法,他就是利用信息增益来构建决策树。

信息增益看起来很好,但其实他是存在一些问题的。它存在一些异常现象。

假设,我们考虑这样一个特征,他呢,有很多个值,每一个属性值内部的样本数量又非常少,极端情况下,其每一个属性值内部只有一个样本,那么其熵值就会为0,但是,这样的特征真的就好吗。答案是否定的。采用信息增益作为判定方法,会倾向于去选择属性取值比较多的属性。那么,选择取值多的属性为什么就不好了呢?举个比较极端的例子,如果将身份证号作为一个属性,那么,其实每个人的身份证号都是不相同的,也就是说,有多少个人,就有多少种取值,它的取值很多吧,让我们继续看,如果用身份证号这个属性去划分原数据集D,那么,原数据集D中有多少个样本,就会被划分为多少个子集,每个子集只有一个人,这种极端情况下,因为一个人只可能属于一种类别,好人,或者坏人,那么此时每个子集的信息熵就是0了,就是说此时每个子集都特别纯。信息增益计算出来的特别大,然后决策树会用身份证号这个属性来划分原数据集D,其实这种划分毫无意义。

所以,后人提出了对于ID3的改进算法:C4.5,他是基于信息增益率来构造决策树的。

信息增益率:一个决策的信息增益/属性的熵值  

比如身份证的例子,身份证属性的熵值就很大,因为其属性值很多,纯度很低。身份证的熵值虽然大但是除以属性的熵值之后就会变小,也就是其信息增益率就会很小。

如何评价一棵决策树的预测效果呢,到底这颗树的效果如何呢?

在此,我们引入评价函数

                                     

N代表当前叶子节点数据集的样本数量,H代表当前叶子节点的熵值。

树的减枝。一个决策树预测好了之后,如果不进行减枝很可能会出现过拟合的现象发生,也就是说,他能很好的拟合训练集,但是测试集的运行效果并不是很好,这主要在于这棵树太过于庞大,有太多的分支,也可能是受到了训练集上一些异常值的影响。
我们可以进行两种减枝操作:

预剪枝:在构建决策树的过程中,提前停止。比如,决策度的深度、或者某个叶子节点数据集样本数到某个数值时就进行停止。

后剪枝:决策树构建好了后,然后才开始减枝。我们将评价函数作如下改变, T代表叶子节点的个数。

              

             图中的a值用来,作为一个调整参数。

              我们利用评价函数,对树中的分支节点进行评价,根据评价函数值进行决定要不要进行减枝。

随机森林:通俗的讲就是我们将训练集中部分数据进行10次有放回的随机抽样得到十个训练集,然后就能在十个训练集上得到十棵决策树,构造决策树的时候,选择特征(天气、温度……)时,每棵树只抽取部分特征。使用的时候,用十棵决策树共同来做出决定,比如同一个预测变量值,六棵树预测为蓝色,4棵为红色,其最终预测值就是蓝色。

 

 

 

 

        

          

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

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

相关文章

python面试题汇总(1)

1. (1)python下多线程的限制以及多进程中传递参数的方式   python多线程有个全局解释器锁(global interpreter lock),这个锁的意思是任一时间只能有一个线程使用解释器,跟单cpu跑多个程序一个意思,大家都是轮着用的&…

阿里云 超级码力在线编程大赛初赛 第3场 题目1. 最大公倍数

文章目录1. 题目2. 解题1. 题目 来源:https://tianchi.aliyun.com/oj/15179470890799741/85251759933690467 2. 解题 看的大佬的解题,很强! class Solution { public:/*** param a: Left margin* param b: Right margin* return: return t…

Javascript:前端利器 之 JSDuck

背景 文档的重要性不言而喻,对于像Javascript这种的动态语言来说就更重要了,目前流行的JDoc工具挺多的,最好的当属JSDuck,可是JSDuck在Windows下的安装非常麻烦,这里就写下来做个备忘。 JSDuck生成的文档效果 JSDuck安…

Ubuntu 扩展内存或断电之后卡在 /dev/sda1 clean 和 /dev/sda1 recovering journal

当ubuntu虚拟机硬盘空间不够用的时候,往往会出现新增扩展硬盘空间之后,出现开机卡死的现象。 通过查阅相关资料,排坑如下: 一、原VM硬盘空间已满 当原VM硬盘空间已满的情况下,千万不要重启或者关机操作,极…

阿里云 超级码力在线编程大赛初赛 第3场 题目2. 房屋染色(DP)

文章目录1. 题目2. 解题1. 题目 有n个房子在一列直线上,现在Bob需要给房屋染色,共有k种颜色。 每个房屋染不同的颜色费用也不同,Bob希望有一种染色方案使得相邻的房屋颜色不同。 但Bob计算了使相邻房屋颜色不同的最小染色费用,发…

TCP协议以及三次握手

TCP协议,传输控制协议(英语:TransmissionControl Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。 tcp通信需要经过创建连接、数据传送、终止连接三个步骤…

02.改善深层神经网络:超参数调试、正则化以及优化 W1.深度学习的实践层面(作业:初始化+正则化+梯度检验)

文章目录作业1:初始化1. 神经网络模型2. 使用 0 初始化3. 随机初始化4. He 初始化作业2:正则化1. 无正则化模型2. L2 正则化3. DropOut 正则化3.1 带dropout的前向传播3.2 带dropout的后向传播3.3 运行模型作业3:梯度检验1. 1维梯度检验2. 多…

LeetCode 第 34 场双周赛(385/2842,前13.5%)

文章目录1. 比赛结果2. 题目1. LeetCode 5491. 矩阵对角线元素的和 easy2. LeetCode 5492. 分割字符串的方案数 medium3. LeetCode 5493. 删除最短的子数组使剩余数组有序 medium4. LeetCode 5494. 统计所有可行路径 hard1. 比赛结果 做出来3题,最后一题动态规划&a…

TCP程序流程及服务器客户端

Tcp服务器创建: import socket # 服务器的端口号 PORT 9000 # 创建套接字socket对象,用于进行通讯 # scoket.SOCK_STREAM 表明使用tcp协议,流式协议 # 监听socket server_sock socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 为…

LeetCode 1576. 替换所有的问号

文章目录1. 题目2. 解题1. 题目 给你一个仅包含小写英文字母和 ? 字符的字符串 s, 请你将所有的 ? 转换为若干小写字母,使最终的字符串不包含任何 连续重复 的字符。 注意:你 不能 修改非 ‘?’ 字符。 题目测试用例保证 除 ‘?’ 字符…

tcp十种状态

CLOSED:表示关闭状态(初始状态)。 LISTEN:该状态表示服务器端的某个SOCKET处于监听状态,可以接受连接。 SYN_SENT:这个状态与SYN_RCVD遥相呼应,当客户端SOCKET执行CONNECT连接时,它首…

TCP的2MSL问题

2MSL (Maximum SegmentLifetime) TIME_WAIT状态的存在有两个理由: 让4次挥手关闭流程更加可靠;4次挥手的最后一个ACK是是由主动关闭方发送出去的,若这个ACK丢失,被动关闭方会再次发一个FIN过来。若主动关闭方能够保持一个2MSL的TI…

LeetCode 1577. 数的平方等于两数乘积的方法数(双指针)

文章目录1. 题目2. 解题1. 题目 给你两个整数数组 nums1 和 nums2 ,请你返回根据以下规则形成的三元组的数目(类型 1 和类型 2 ): 类型 1:三元组 (i, j, k) ,如果 nums1[i]2 nums2[j] * nums2[k] 其中 0…

LeetCode 1578. 避免重复字母的最小删除成本

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s 和一个整数数组 cost ,其中 cost[i] 是从 s 中删除字符 i 的代价。 返回使字符串任意相邻两个字母不相同的最小删除成本。 请注意,删除一个字符后,删除其他字符的成本不会改变。 示例 1&…

hdu2709 Sumsets 递推

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid2709 感觉很经典的一道递推题 自己想了有半天的时间了。。。。比较弱。。。。 思路: 设f[n]表示和为n的组合数; 那么 当n为奇数时,很简单,相当于在f[n-1]的每一个…

python入门字符串

python 字符串str, ‘’, ‘’ ‘’, ‘’’ ‘’’;python没有字符,只有字符串hh 切片 字符串不可以修改,修改的话,类似于tuple, 修改的话, 只可以整体修改 tuple 也是可这样, 确切的说只是修改了指针…

阿里云 超级码力在线编程大赛初赛 第4场 题目3. from start to end

文章目录1. 题目2. 解题1. 题目 样例1: 输入: "abcd" "bcda" 输出: true样例2: 输入: "abcd" "abdc" 输出: false来源:https://tianchi.aliyun.com/oj…

Codeforces Round #697 (Div.3) A~G解题报告与解法证明

题目大体概括 A #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std;typedef long long LL; const int N 500; LL a[N]; int sz; bool Check(LL n) {for (int i 0; i < sz; i ){if (n a[i])…

python网络编辑 socket篇

Python之路&#xff1a; socket篇 Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换&#xff0c;这个连接的一端称为一个socket&#xff0c;作为BSD UNIX的进程通信机制&#xff0c;通常也称做“套接字” &#xff0c;是一个通信链的句柄&#xff0c;实现不同程序…