tensorflow基本算法(3):随机森林random forest

2023-05-16

参考维基百科

在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的演算法。而"Random Forests"是他们的商标。这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林random decision forests)而来的。这个方法则是结合Breimans的"Bootstrap aggregating"想法和Ho的"random subspace method" 以建造决策树的集合。

算法过程:

  1. N来表示训练用例(样本)的个数,M表示特征数目。
  2. 输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M
  3. N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。
  4. 对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这m个特征,计算其最佳的分裂方式。
  5. 每棵树都会完整成长而不会剪枝(Pruning,这有可能在建完一棵正常树状分类器后会被采用)。

总结:

  Random Forest(随机森林)算法是通过训练多个决策树,生成模型,然后综合利用多个决策树进行分类。

1. 单棵决策树的构建:

  (1)令N为训练样例的个数,则单棵决策树的输入样例的个数为N个从训练集中有放回的随机抽取N个训练样例。

  (2)令训练样例的输入特征的个数为M,且m远远小于M,则我们在每颗决策树的每个节点上进行分裂时,从M个输入特征里随机选择m个输入特征,然后从这m个输入特征里选择一个最好的进行分裂。m在构建决策树的过程中不会改变。

  (3)每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类。不需要剪枝。

  2. 随机森林的分类结果

  按照1生成t个决策树之后,对于每个新的测试样例,综合多个决策树的分类结果来作为随机森林的分类结果。

  (1)目标特征为数字类型:取t个决策树的平均值作为分类结果。

  (2)目标特征为类别类型:少数服从多数,取单棵树分类结果最多的那个类别作为整个随机森林的分类结果。

  3. 分类效果的评价

  在随机森林中,无需交叉验证来评价其分类的准确性,随机森林自带OOB(out-of-bag)错误估计:

  OOB:在构造单棵决策树时我们只是随机有放回的抽取了N个样例,所以可以用没有抽取到的样例来测试这棵决策树的分类准确性,这些样例大概占总样例数目的三分之一(好心人评论给出的解释:n趋于无穷时,未选到的概率为(1-1/n)的n次方,极限为1/e=0.3678,约为三分之一)。所以对于每个样例j,都有大约三分之一的决策树(记为SetT(j))在构造时没用到该样例,我们就用这些决策树来对这个样例进行分类。我们对于所有的训练样例j,用SetT(j)中的树组成的森林对其分类,然后看其分类结果和实际的类别是否相等,不相等的样例所占的比例就是OOB错误估计。OOB错误估计被证明是无偏的。

tensorflow实现:

from __future__ import print_function

import tensorflow as tf
from tensorflow.python.ops import resources
from tensorflow.contrib.tensor_forest.python import tensor_forest

# Ignore all GPUs, tf random forest does not benefit from it.
import os
os.environ["CUDA_VISIBLE_DEVICES"] = ""

# Parameters
num_steps = 500 # Total steps to train
batch_size = 1024 # The number of samples per batch
num_classes = 10 # The 10 digits
num_features = 784 # Each image is 28x28 pixels
num_trees = 10
max_nodes = 1000

# Input and Target data
x = tf.placeholder(tf.float32, shape=[None, num_features])
# For random forest, labels must be integers (the class id)
y = tf.placeholder(tf.int32, shape=[None])

# Random Forest Parameters
hparams = tensor_forest.ForestHParams(num_classes=num_classes,
                                      num_features=num_features,
                                      num_trees=num_trees,
                                      max_nodes=max_nodes).fill()

# Build the Random Forest
forest_graph = tensor_forest.RandomForestGraphs(hparams)
# Get training graph and loss
train_op = forest_graph.training_graph(x, y)
loss_op = forest_graph.training_loss(x, y)

# Measure the accuracy
infer_op, _, _ = forest_graph.inference_graph(x)
correct_prediction = tf.equal(tf.argmax(infer_op, 1), tf.cast(y, tf.int64))
accuracy_op = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# Initialize the variables (i.e. assign their default value) and forest resources
init_vars = tf.group(tf.global_variables_initializer(),
    resources.initialize_resources(resources.shared_resources()))

# Start TensorFlow session
sess = tf.train.MonitoredSession()

# Run the initializer
sess.run(init_vars)

# Training
for i in range(1, num_steps + 1):
    # Prepare Data
    # Get the next batch of MNIST data (only images are needed, not labels)
    batch_x, batch_y = mnist.train.next_batch(batch_size)
    _, l = sess.run([train_op, loss_op], feed_dict={x: batch_x, y: batch_y})
    if i % 50 == 0 or i == 1:
        acc = sess.run(accuracy_op, feed_dict={x: batch_x, y: batch_y})
        print('Step %i, Loss: %f, Acc: %f' % (i, l, acc))

# Test Model
test_x, test_y = mnist.test.images, mnist.test.labels
print("Test Accuracy:", sess.run(accuracy_op, feed_dict={x: test_x, y: test_y}))

结果输出:

INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Step 1, Loss: -1.400000, Acc: 0.348633
Step 50, Loss: -257.600006, Acc: 0.902344
Step 100, Loss: -544.000000, Acc: 0.923828
Step 150, Loss: -828.000000, Acc: 0.915039
Step 200, Loss: -1001.000000, Acc: 0.907227
Step 250, Loss: -1001.000000, Acc: 0.918945
Step 300, Loss: -1001.000000, Acc: 0.928711
Step 350, Loss: -1001.000000, Acc: 0.918945
Step 400, Loss: -1001.000000, Acc: 0.925781
Step 450, Loss: -1001.000000, Acc: 0.919922
Step 500, Loss: -1001.000000, Acc: 0.914062
Test Accuracy: 0.923

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tensorflow基本算法(3):随机森林random forest 的相关文章

  • cef浏览器加载过程实测ILoadHandler和IRequestHandler

    针对方法GetResourceRequestHandler 获取资源请求过程中 会多次发生请求 不知道何时加载完的问题 IRequestHandler 没有了OnResourceLoadComplete 和OnBeforeResourceL
  • cefsharp监控鼠标点击及键盘按键事件,并定义“热键”源码

    cefsharp浏览器 xff0c 支持组合键检测 xff08 监控 xff09 xff0c 通过ctrl 43 回车 xff0c 弹出打开网址的输入对话框 核心代码如下 第一步在 xxx FrameLoadEnd事件中注册监听事件 xff
  • cefsharp-winform一键网页快照invokeCapture完美实现(源码及知识点)

    实现这个功能查找了几乎所有材料 都没法完全系统的实现想要的功能 终于摸索成功完美实现 大概步骤 1 获取页面真实高度 并滚动到底部 需要执行js脚本 nbsp nbsp 2 模拟设备开启 手机端 需要设置几个参数 宽高和deviceScal
  • cefsharp升级最新包108.4.130

    1 用IDM下载包文件packages 估计10来分钟 如果网速慢时间背可能会慢 https globalcdn nuget org packages cef redist x86 108 4 13 nupkg https globalcd
  • 移动开发者大会次日观感

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 继续是2011移动开发者大会的观感 第二天是进行的主题论坛 xff0c 分别有下面一些主题 xff1a 开放平台与技术 产品与设计 移动游
  • cefsharp之devtools开发者工具API应用-Emulation

    这里仅介绍关键方法 xff0c 快捷键根据自己爱好定义 1 一键设置禁用 启用Javascript 核心代码 参数true禁用 xff0c false启用 xff0c sel webbrowser为你的浏览器 await sel webbr
  • CefSharp.WinForms-109.1.110升级

    包升级地址 NuGet Gallery CefSharp WinForms 109 1 110 NuGet Gallery CefSharp Common 109 1 110 NuGet Gallery cef redist x64 109
  • ESP32S2(12K)-DS18B20数码管显示温度

    一 物料清单 NODEMCU 32 S2 ESP32 12K 四段数码管 共阴 DS18B20 VCC DQ GND Arduino IDE 2 0 3 二 实现方法及效果图 2 1 引用库 include lt OneWire h gt
  • cefsharp-物联网浏览器-升级至110.0.250

    基于cefsharp二次开发的物联网浏览器升级最新版 110 0 250 暂不支持H264功能 一款属于自己的浏览器 支持H264的最新版本100 0 230 更多功能了解 关注我
  • 德赛西威NAV75*-SV731*导航升级(凯立德J30)实战

    一 前言 xff1a 升级导航德赛西威 xff08 2015年买的 xff09 地图几年没升级过了 xff08 之前自己折腾了一个 xff09 之前的启动是DSA2013 xff08 电子G已经无法升级数据文件了 xff0c 本次只升级地图
  • 网络串口调试助手(串口透传网络调试)

    一 前言 xff1a 1 本地串口调试同步到网络 xff08 可以远程实时查看发送 串口打印数据 xff09 2 远程直接发送串口调试指令透传到串口设备 3 通讯协议MQTT 43 WebSocket 串口 二 效果展示 网络客户端 xff
  • log4net(winform)使用方法

    前言 xff1a log4net是 Net下一个非常优秀的开源日志记录组件 log4net记录日志的功能非常强大 它可以将日志分不同的等级 xff0c 以不同的格式 xff0c 输出到不同的媒介 第一步 xff1a 引入组件 xff1a 引
  • cefsharp111.2.20(winform)版本体验

    第一步 xff1a 更新步骤 xff1a 先下载再本地更新会快一点 https globalcdn nuget org packages cefsharp winforms 111 2 20 nupkg https globalcdn nu
  • CefSharp.WinForms 112.2.70最新版体验

    一 准备 下载最新包及依赖包 对应 NET4 5 2 后续版本可能4 6 2 到packages中 本地升级更快 NuGet Gallery CefSharp WinForms 112 2 70 NuGet Gallery CefSharp
  • VUE3(.NET6)管理后台

    基于Admin NET框架 xff0c 预览下效果 内置功能 主控面板 xff1a 控制台页面 xff0c 可进行工作台 xff0c 分析页 xff0c 统计等功能的展示 用户管理 xff1a 对企业用户和系统管理员用户的维护 xff0c
  • 2011年养成的一个工作习惯

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 有一句名言 xff0c 没有记录的公司 xff0c 迟早要垮掉的 xff0c 多么尖锐 个人也不是如此吗 xff1f 在下半年 xff0c
  • Cefsharp.WinForms-v112.3.0 带您最新版体验(小更新)

    一 准备 下载最新包及依赖包 对应 NET4 5 2 后续版本可能4 6 2 到packages中 本地升级更快 NuGet Gallery CefSharp WinForms 112 3 0 NuGet Gallery CefSharp
  • 无人机飞行控制算法、控制律设计软件与半物理仿真

    工业级多功能可编程飞行控制系统专业的图形化控制律设计软件灵活强大的工程应用开发平台DSP处理器及高精度传感器自定义高速遥测数据采集嵌入式半物理仿真系统丰富的用户设备接口适用于固定翼 旋翼机 特殊飞行器 车船艇 机器人 云台等 概 述 xff
  • 程序调试记录

    最近把师兄的程序在万兆网络上进行测试 xff0c 现在把调试中出现的问题进行记录 xff1a 1 xff09 其中一共是十六块板子 xff0c 板子的配置文件是sipixel xml xff0c 每块板子的配置信息里都有对应的IP xff0
  • 华清远见嵌入式学习day27——编译工具和环境搭建

    0 系统移植四天课程安排 1 编译工具 xff0c 环境搭建 2 bootloader 3 kernel 4 文件系统 1 嵌入式系统的应用领域 1 军事 2 医疗 3 移动设备 4 家电 5 工控 2 什么是嵌入式系统 一般的定义 xff

随机推荐