前面介绍过决策树的三种实现:ID3算法,C4.5算法和CART算法。虽然这些决策树有很多优良的性质,比如训练时间
复杂度较低,模型容易展示等等,但是同时单决策树有一些不好的地方,比如容易over-fitting,虽然剪枝可以减
少这种现象的发生,但是还是不够的。为了减少决策树的不足,近年来又提出了许多模型组和+决策树的算法,这些算
法都是生成N棵决策树,虽然这N棵树都很简单,但是它们综合起来就很强大了。今天就来介绍随机森林。
Contents
1. 随机森林的基本原理
2. 随机森林的具体步骤
3. 随机森林的优点
4. 随机森林开源框架
1. 随机森林的基本原理
在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类型是由每个树输出类别的众数而定。顾
名思义,随机森林就是用随机的方式构建一个森林,这个森林由很多的决策树构成,随机森林的每棵决策树之间是
没有关联的。在建好随机森林后,当有一个新的样本输入后,就让森林中的每棵决策树都进行判断,最终的预测结
果就是这N棵决策树的众数对应的种类。
2. 随机森林的具体步骤
在随机森林中,最重要的是如何构造一个随机森林。假设数据样本数为N,那么每棵决策树采样的样本数也就是N,
每个样本的属性个数为M,在每个决策树构造过程中,每个节点随机选择m个属性计算最佳分裂方式进行分裂。具
体步骤如下
(1)有放回地随机选择N个样本,用这N个样本来训练一棵决策树。
(2)每个样本有M个属性,在决策树中需要分裂节点时,从这M个属性中随机选取m个属性,一般来说m << M,
然后从这m个属性中采用某种策略选择最佳属性作为当前节点的分裂属性。
(3)每棵决策树的每个节点的分裂都按照步骤(2)进行,直到不能分裂为止。
(4)对于每棵决策树都这样建立,就得到了随机森林。
随机森林的随机性体现在每棵树的训练样本是随机的,树中每个节点的分裂属性也是随机选择的。有了这2个随机
因素,即使每棵决策树没有进行剪枝,随机森林也不会产生过拟合的现象。
随机森林中有两个人为控制参数:森林中树的数量(一般选取值较大)和m值的大小(一般选取为M的平方根)。
3. 随机森林的优点
随机森林有很多优点,具体如下
(1)分类结果更加准确
(2)可以处理高维度的属性,并且不用做特征选择
(3)即使有很大部分数据遗失,仍可以维持高准确度
(4)学习过程快速
(5)在训练完成后,能够给出哪些属性比较重要
(6)容易实现并行化计算
(7)在训练过程中,能够检测到属性之间的相互影响
4. 随机森林开源框架
在机器学习中,随机森林有很多开源框架,现在就来介绍一些。
(1)Julia中的框架
在julia中,有一个叫做DecisionTree的模块,里面有随机森林用于分类和回归。具体可以看下面链接
链接:https://github.com/bensadeghi/DecisionTree.jl/blob/master/README.md
(2)Python中的框架
Python中有一个机器学习库,叫做ScikitLearn,有关于随机森林的框架。参考这里
(3)其它语言中的随机森林
除了上述语言的随机森林,还有R语言中的随机森林,百度也有随机森林框架,不过针对的是64位的Linux
系统,更多框架网上查阅即可。
Go语言的随机森林实现:https://github.com/fxsjy/RF.go
js判断字符串是否是日期格式
2019独角兽企业重金招聘Python工程师标准>>> ...
文章目录原题题目提示代码实现原题题目#include <cstdlib>#include <iostream>#include <string>#include <algorithm>using namespace std;class MyString:public string{// 在此处补充你的代码};int main(){ MyString s1("abcd-"),s2,s3("efgh-"),s4(s1); MyS
android EditText自动获取焦点并弹出输入法
访问https://start.spring.io/actuator/info{ "git": { "branch": "32297d783343977ca471232557985127bca14d6a", "commit": { "id": "32297d7", "time": "2021-06-23T08:59:54Z" } }, "build": .
题目;1:按照格式显示当前时间,并保存到指定文件中:Command:date +%T | tee time.txt;2:显示/etc/passwd文件的第15~18行内容:Command: head /etc/passwd -n 18 | tail -n 4;3:显示/bin目录中,包含大写大写字母的文件,保存到指定文件中,并统计行数:Command: ls /bin/【【::up...
本文用Java创建UI并联合JNI层操作surface来直接显示yuv数据(yv12),开发环境为Android 4.4,全志A23平台。package com.example.myyuvviewer; import java.io.File; import java.io.FileInputStream; import android.app.Activity; imp...
今天遇到一个奇怪的问题,restore 只能读取一次状态,也许是 save 的设计使然吧。都说,canvas restore 可以还原画布旋转( rotate )、平移(translate )变换,于是想画一个旋转对称画面就有了如下代码:<!DOCTYPE html><html><meta charset="utf-8" ><body><canvas id="myCanvas" width="500" height="500" sty..
#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>using namespace std;void framebuffer_size_callback(GLFWwindow* window, int width, int height);const char *verte...
java网上商城系统毕业设计答辩网上商城系统管理员子功能模块演示PPT 目录 研究意义 开发环境 整体框架 设计思路 功能展示 总结陈词 致 谢 研究意义 相对于消费者: 网上购物不限时,随时可以买东西; 网上购物物美价廉; 网上购物只需鼠标一点,货即到家,省时省力; 网上购物可以买到全国各地的商品,跨越了地域的限制; 相对于商家: 网上商城市场宏大; 网上商城省去了开实...
1.1.1 AudioPolicyService的路由实现我们在AudioPolicyService小节曾将其比作是一个“路由器”,不过还没有深入解析它是如何完成路由选择的。这部分的功能与使用者——AudioTrack有很大关联,所以我们特别将它的实现原理剖析放在这里,以使读者可以综合起来理解。路由器功能由如下几个部分组成:l 与发送方(AudioTrack)的接口就好像路由器首先要接收到一个I
启动部分常用的bootloader--ubootBootLoader最为系统复位或上电后首先运行的代码,一般应写在起始物理地址0x0开始。Bootloader的启动过程可以是单阶段的,也可以是多阶段的。通常多阶段的bootloader能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的bootloader大多数是二阶段的启动过程,也即启动过程可以分为stage1和stage2两