1. 首页 > 数码 >

huber损失函数_huber损失函数的公式

损失函数和代价函数一样吗

在slam中

huber损失函数_huber损失函数的公式huber损失函数_huber损失函数的公式


损失函数(Lossfunction residual)

Cartographer可以看作是两个但相关的子系统。个是 LocalSLAM (有时也称为 前端 或 局部轨迹构建器 )。它的工作是建立一系列 子图 。每个子图都是本地一致的,但我们接受LocalSLAM随着时间的推移而漂移。大多数地方SLAM选项中可以找到 install_isolated/share/cartographer/configuration_files/trajectory_builder_2d.lua 为2D和 install_isolated/share/cartographer/configuration_files/trajectory_builder_3d.lua 为3D。(对于本页的其余部分,我们将参考TRAJECTORY_BUILDER_nD作为常用选项)代价函数(Costfunction另一个子系统是 全局SLAM (有时称为 后端 )。它在后台线程中运行,其主要工作是找到 回环约束 。它通过对子图的扫描匹配来实现。它还结合了其他传感器数据,以获得更高级别的视图,并确定最一致的全局解决方案。在3D中,它还试图找到重力方向。它的大多数选项都可以在 install_isolated / share / cartographer / configuration_files / e_graph.lua中找到。)

比如在优化的时候,由于无匹配等原因,把原本不应该加到图中的边给加进去了,误大的边梯度也大,意味着调整与它相关的变量会使目标函数下降更多。所以当误很大时,二范数增长得太快,二核函数保证每条边的误不会大得没边而掩盖掉其他的边。具体是将原先误的二范数度量替换成一个增长没那么快的函数,同时保证光滑性(不然没法求导),使优化结果更加损失函数是你的误函数,是观测数据与估计值的,稳健,所以又叫鲁棒核函数。常见的Huber核函数。

ceres中的核函数用来减小Outlier的影响,对应g2o中的edge->setRobustKernel()。

深度学习的核函数:

一般定义是将原始表达转换到一个隐式特征空间去,该空间具有更好的特征可分性质。

在机器学习中,(一层线性卷积结构+一层核函数)N的特殊结构,能拟合任何函数的原因。但如果只有N层的线性结构,那的组合还是线性结构,就相当于以前的感知机(perceptron)。使得类似神经网络结构从线性变成非线性的,就是每一层后加的核函数/激活函数。

从上边我们可以看出,核函数的作用,是将原始结果空间映射到一个新的输出空间,在这个映射过程中可以进行滤波,转换后的空间具有更好的特征可分性质。

Cartographer调参

注:

Cartographer是一个复杂的系统,调整它需要很好地理解其内部工作。此页面试图直观地概述Cartographer使用的不同子系统及其配置值。如果您对Cartographer的介绍不仅仅感兴趣,还应参考Cartographer论文。它仅描述了2D SLAM,但它严格定义了此处描述的大多数概念。这些概念通常也适用于3D。

子图可以将它们的范围数据存储在几个不同的数据结构中:最广泛使用的表示称为概率网格。但是,在2D中,还可以选择使用截断的有符号距离场(TSDF)。

W. Hess, D. Kohler, H. Rapp, and D. Andor, Real-Time Loop Closure in 2D LIDAR SLAM , in Robotics and Automation (ICRA), 2016 IEEE International Conference on . IEEE, 2016. pp. 1271–1278.

在更高的抽象上,LocalSLAM的工作是生成良好的子图,而全局SLAM的工作是将它们最一致地结合在一起。

测距传感器(例如:LIDAR)提供多个方向的深度信息。但是,有些测量与SLAM无关。如果传感器部分被灰尘覆盖或者如果它被引向机器人的一部分,则一些测量距离可被视为SLAM的噪声。另一方面,一些最远的测量也可能来自不需要的源(反射,传感器噪声),并且也与SLAM无关。为解决这些问题,Cartographer首先应用带通滤波器,并仅将范围值保持在某个最小和范围之间。应根据机器人和传感器的规格选择最小值和值。

在2D中,Cartographer将比max_range更换范围 TRAJECTORY_BUILDER_2D.missing_data_ray_length 。它还提供了将3D点云过滤为2D切割的值 max_z 和 min_z 值。

距离是在一段时间内测量的,而机器人实际上正在移动。但是,距离是由大型ROS消息中的“批量”传感器提供的。Cartographer可以考虑每个消息的时间戳,以考虑机器人运动引起的畸变。Cartographer进行测量频率越高,测量结果组合成一个可以立即捕获的单个相干扫描就越好。因此,强烈建议通过扫描提供尽可能多的 rangedata (ROS消息)。

较小的立方体大小将导致更密集的数据表示,从而导致更多计算。较大的立方体大小会导致数据丢失,但会更快。

在应用了固定尺寸的体素滤镜后,Cartographer还应用了 自适应体素滤镜 。此过滤器尝试确定体素大小(在长度下)以实现目标点数。在3D中,两个自适应体素滤波器用于生成高分辨率和低分辨率点云,它们的使用将在 LocalSLAM中 阐明。

有两种扫描匹配策略:

在3D中, occupied_space_weight_0 和 occupied_space_weight_1 参数分别与高分辨率和低分辨率滤波点云相关。

在 CeresScanMatcher 从得名 Ceres Solver ,以谷歌为解决非线性最小二乘问题的库。扫描匹配问题被建模为这样的问题的最小化,其中两个扫描之间的 运动 (变换矩阵)是要确定的参数。Ceres使用下降算法针对给定的迭代次数优化运动。Ceres可以配置为根据您自己的需要调整收敛速度。

该 RealTimeCorrelativeScanMatcher 可以根据您在传感器的信任进行切换。它的工作原理是在 搜索窗口中 搜索类似的扫描, 搜索窗口 由距离半径和角度半径定义。当使用此窗口中的扫描执行扫描匹配时,可以为平移和旋转组件选择不同的权重。例如,如果您知道机器人不会旋转很多,您可以使用这些权重。

为避免每个子图插入太多扫描,一旦扫描匹配器找到两次扫描之间的运动,它就会通过 运动滤波器 。如果导致它的运动不够重要,则扫描将被删除。仅当扫描的运动高于特定距离,角度或时间阈值时,才会将扫描插入到当前子图中。

概率网格将空间划分为2D或3D表格,其中每个单元格具有固定大小并包含被障碍物占有的概率。根据“ 命中 ”(测量范围数据)和“ 未命中 ”(传感器和测量点之间的自由空间)更新Odds。 命中 和 未命中 可以在占用概率计算不同的权重,赋予更多或更少的信任。

在2D中,每个子图仅存储一个概率网格。在3D中,出于扫描匹配性能的原因,使用两个 混合 概率网格。(术语“混合”仅指内部树状数据表示并被抽象给用户)

扫描匹配首先将低分辨率点云的远点与低分辨率混合网格对齐,然后通过将高分辨率点与高分辨率混合网格对齐来细化位姿。

CartographerROS提供了一个可视化子图的RViz插件。您可以从其编号中选择要查看的子图。在3D中,RViz仅显示3D混合概率网格的2D投影(灰度)。RViz左侧窗格中提供了选项,可在低分辨率和高分辨率混合网格可视化之间切换。

TODO : 记录TSDF配置

当LocalSLAM生成其连续的子图时,全局优化(通常称为“ 优化问题 ”或“ 稀疏位姿调整 ”)任务在后台运行。它的作用是重新安排彼此之间的子图,以便它们形成一个连贯的全局地图。例如,该优化负责改变当前构建的轨迹以正确地对准关于环闭合的子图。

一旦插入了一定数量的轨迹节点,就会批量运行优化。根据您运行它的频率,您可以调整这些批次的大小。

将 POSE_GRAPH.optimize_ry_n_nodes 设置为 0 是禁用全局SLAM并专注于LocalSLAM行为的便捷方法。这通常是调整Cartographer的件事。

全局SLAM是一种“ GraphSLAM ”,它本质上是一种位姿图优化,它通过在 节点 和子图之间构建 约束 然后优化得到的约束图来工作。可以直观地将约束视为将所有节点捆绑在一起的小绳索。稀疏位姿调整完全固定这些绳索。生成的网称为“ 位姿图 ”。

约束可以在RViz中可视化,调整全局SLAM非常方便。还可以切换 POSE_GRAPH.constraint_builder.log_matches 以获得格式化为直方图的约束构建器的常规报告。

实际上,全局约束不仅可以在单个轨迹上查找循环闭包。它们还可以对齐由多个机器人记录的不同轨迹,但我们将保留此用法以及与“全局本地化”相关的参数超出本文档的范围。

为了限制约束(和计算)的数量,Cartographer仅考虑构建约束的所有关闭节点的子采样集。这由采样率常数控制。采样太少的节点可能导致错过约束和无效的循环闭包。对太多节点进行采样会降低全局SLAM的速度并阻止实时循环关闭。

当考虑节点和子图建立约束时,它们会通过名为的一旦扫描组装并从多个范围数据中过滤,就可以为LocalSLAM算法做好准备。LocalSLAM 使用来自 位姿估计器 的初始估计通过 扫描匹配 将新扫描插入其当前子图构造中。位姿估计器背后的想法是使用除测距仪之外的其他传感器的传感器数据来预测下一次扫描应该插入子图的位置。个扫描匹配器 FastCorrelativeScanMatcher 。该扫描匹配器专为Cartographer设计,可实现实时循环闭合扫描匹配。在 FastCorrelativeScanMatcher 依靠“ 分支定界 ”机制在不同的格点分辨率的工作,有效地消除不正确匹配数。这种机制在本文件前面介绍的制图文章中有广泛的介绍。它适用于可以控制深度的探索树。

当Cartographer运行 优化问题时 ,Ceres用于根据多个 残 重新排列子图。残是使用 加权损失函数 计算的。全局优化具有成本函数以考虑大量数据源:全局(循环闭包)约束,非全局(匹配器)约束,IMU加速和旋转测量,局部SLAM粗略姿态估计,测距源或固定框架(如GPS系统)。可以按照 LocalSLAM 部分中的说明配置权重和Ceres选项。

通过切换,可以找到有关优化问题中使用的残的有用信息 POSE_GRAPH.max_num_final_iterations

作为其IMU残的一部分,优化问题为IMU姿态提供了一些灵活性,默认情况下,Ceres可以自由地优化IMU和跟踪帧之间的外部校准。如果您不信任您的IMU位姿,可以记录Ceres全局优化的结果并用于改进您的外部校准。如果Ceres没有正确优化您的IMU位姿并且您完全相信您的外在校准,则可以使此位姿保持不变。

在残中,异常值的影响由配置有某个Huber量表的 Huber损失 函数处理。Huber量表 越大 ,(潜在)异常值 的影响越大 。

一旦轨迹完成,Cartographer就会运行一个新的全局优化,通常比以前的全局优化要多得多。这样做是为了完善Cartographer的最终结果,通常不需要是实时的,所以大量的迭代通常是正确的选择。

Cartographer调参

一般而言,如果两个类别比例为9:1,则认为失衡,为99:1,认为失衡。

Cartographer是一个复杂的系统,调整它需要很好地理解其内部工作。此页面试图直观地概述Cartographer使用的不同子系统及其配置值。如果您对Cartographer的介绍不仅仅感兴趣,还应参考Cartographer论文。它仅描述了2D SLAM,但它严格定义了此处描述的大多数概念。这些概念通常也适用于3D。

定义: 泰勒公式是一个用函数在某点的信息描述其附近取值的公式。

W. Hess, D. Kohler, H. Rapp, and D. Andor, Real-Time Loop Closure in 2D LIDAR SLAM , in Robotics and Automation (ICRA), 2016 IE当LocalSLAM已经接收到给定量的范围数据时,认为子图构建完成。LocalSLAM会随着时间漂移,GlobalSLAM用于解决这种漂移问题。子图必须足够小,以使其内部的漂移低于分辨率,以便它们在局部是正确。另一方面,子图应该足够大以使环路闭合能够正常工作。EE International Conference on . IEEE, 2016. pp. 1271–1278.

在更高的抽象上,LocalSLAM的工作是生成良好的子图,而全局SLAM的工作是将它们最一致地结合在一起。

测距传感器(例如:LIDAR)提供多个方向的深度信息。但是,有些测量与SLAM无关。如果传感器部分被灰尘覆盖或者如果它被引向机器人的一部分,则一些测量距离可被视为SLAM的噪声。另一方面,一些最远的测量也可能来自不需要的源(反射,传感器噪声),并且也与SLAM无关。为解决这些问题,Cartographer首先应用带通滤波器,并仅将范围值保持在某个最小和范围之间。应根据机器人和传感器的规格选择最小值和值。

在2D中,Cartographer将比max_range更换范围 TRAJECTORY_BUILDER_2D.missing_data_ray_length 。它还提供了将3D点云过滤为2D切割的值 max_z 和 min_z 值。

距离是在一段时间内测量的,而机器人实际上正在移动。但是,距离是由大型ROS消息中的“批量”传感器提供的。Cartographer可以考虑每个消息的时间戳,以考虑机器人运动引起的畸变。Cartographer进行测量频率越高,测量结果组合成一个可以立即捕获的单个相干扫描就越好。因此,强烈建议通过扫描提供尽可能多的 rangedata (ROS消息)。

较小的立方体大小将导致更密集的数据表示,从而导致更多计算。较大的立方体大小会导致数据丢失,但会更快。

在应用了固定尺寸的体素滤镜后,Cartographer还应用了 自适应体素滤镜 。此过滤器尝试确定体素大小(在长度下)以实现目标点数。在3D中,两个自适应体素滤波器用于生成高分辨率和低分辨率点云,它们的使用将在 LocalSLAM中 阐明。

有两种扫描匹配策略:

在3D中, occupied_space_weight_0 和 occupied_space_weight_1 参数分别与高分辨率和低分辨率滤波点云相关。

在 CeresScanMatcher 从得名 Ceres Solver ,以谷歌为解决非线性最小二乘问题的库。扫描匹配问题被建模为这样的问题的最小化,其中两个扫描之间的 运动 (变换矩阵)是要确定的参数。Ceres使用下降算法针对给定的迭代次数优化运动。Ceres可以配置为根据您自己的需要调整收敛速度。

该 RealTimeCorrelativeScanMatcher 可以根据您在传感器的信任进行切换。它的工作原理是在 搜索窗口中 搜索类似的扫描, 搜索窗口 由距离半径和角度半径定义。当使用此窗口中的扫描执行扫描匹配时,可以为平移和旋转组件选择不同的权重。例如,如果您知道机器人不会旋转很多,您可以使用这些权重。

为避免每个子图插入太多扫描,一旦扫描匹配器找到两次扫描之间的运动,它就会通过 运动滤波器 。如果导致它的运动不够重要,则扫描将被删除。仅当扫描的运动高于特定距离,角度或时间阈值时,才会将扫描插入到当前子图中。

概率网格将空间划分为2D或3D表格,其中每个单元格具有固定大小并包含被障碍物占有的概率。根据“ 命中 ”(测量范围数据)和“ 未命中 ”(传感器和测量点之间的自由空间)更新Odds。 命中 和 未命中 可以在占用概率计算不同的权重,赋予更多或更少的信任。

在2D中,每个子图仅存储一个概率网格。在3D中,出于扫描匹配性能的原因,使用两个 混合 概率网格。(术语“混合”仅指内部树状数据表示并被抽象给用户)

扫描匹配首先将低分辨率点云的远点与低分辨率混合网格对齐,然后通过将高分辨率点与高分辨率混合网格对齐来细化位姿。

CartographerROS提供了一个可视化子图的RViz插件。您可以从其编号中选择要查看的子图。在3D中,RViz仅显示3D混合概率网格的2D投影(灰度)。RViz左侧窗格中提供了选项,可在低分辨率和高分辨率混合网格可视化之间切换。

TODO : 记录TSDF配置

当LocalSLAM生成其连续的子图时,全局优化(通常称为“ 优化问题 ”或“ 稀疏位姿调整 ”)任务在后台运行。它的作用是重新安排彼此之间的子图,以便它们形成一个连贯的全局地图。例如,该优化负责改变当前构建的轨迹以正确地对准关于环闭合的子图。

一旦插入了一定数量的轨迹节点,就会批量运行优化。根据您运行它的频率,您可以调整这些批次的大小。

将 POSE_GRAPH.optimize_ry_n_nodes 设置为 0 是禁用全局SLAM并专注于LocalSLAM行为的便捷方法。这通常是调整Cartographer的件事。

全局SLAM是一种“ GraphSLAM ”,它本质上是一种位姿图优化,它通过在 节点 和子图之间构建 约束 然后优化得到的约束图来工作。可以直观地将约束视为将所有节点捆绑在一起的小绳索。稀疏位姿调整完全固定这些绳索。生成的网称为“ 位姿图 ”。

约束可以在RViz中可视化,调整全局SLAM非常方便。还可以切换 POSE_GRAPH.constraint_builder.log_matches 以获得格式化为直方图的约束构建器的常规报告。

实际上,全局约束不仅可以在单个轨迹上查找循环闭包。它们还可以对齐由多个机器人记录的不同轨迹,但我们将保留此用法以及与“全局本地化”相关的参数超出本文档的范围。

为了限制约束(和计算)的数量,Cartographer仅考虑构建约束的所有关闭节点的子采样集。这由采样率常数控制。采样太少的节点可能导致错过约束和无效的循环闭包。对太多节点进行采样会降低全局SLAM的速度并阻止实时循环关闭。

当考虑节点和子图建立约束时,它们会通过名为的个扫描匹配器 FastCorrelativeScanMatcher 。该扫描匹配器专为Cartographer设计,可实现实时循环闭合扫描匹配。在 FastCorrelativeScanMatcher 依靠“ 分支定界 ”机制在不同的格点分辨率的工作,有效地消除不正确匹配数。这种机制在本文件前面介绍的制图文章中有广泛的介绍。它适用于可以控制深度的探索树。

当Cartographer运行 优化问题时 ,Ceres用于根据多个 残 重新排列子图。残是使用 加权损失函数 计算的。全局优化具有成本函数以考虑大量数据源:全局(循环闭包)约束,非全局(匹配器)约束,IMU加速和旋转测量,局部SLAM粗略姿态估计,测距源或固定框架(如GPS系统)。可以按照 LocalSLAM 部分中的说明配置权重和Ceres选项。

通过切换,可以找到有关优化问题中使用的残的有用信息 POSE_GRAPH.max_num_final_iterations

作为其IMU残的一部分,优化问题为IMU姿态提供了一些灵活性,默认情况下,Ceres可以自由地优化IMU和跟踪帧之间的外部校准。如果您不信任您的IMU位姿,可以记录Ceres全局优化的结果并用于改进您的外部校准。如果Ceres没有正确优化您的IMU位姿并且您完全相信您的外在校准,则可以使此位姿保持不变。

在残中,异常值的影响由配置有某个Huber量表的 Huber损失 函数处理。Huber量表 越大 ,(潜在)异常值 的影响越大 。

一旦轨迹完成,Cartographer就会运行一个新的全局优化,通常比以前的全局优化要多得多。这样做是为了完善Cartographer的最终结果,通常不需要是实时的,所以大量的迭代通常是正确的选择。

用AdaBoost和GBDT模型处理违约问题

Rangedata通常从机器人上的单个点测量,但是以多个角度测量。这意味着靠近的表面(例如道路)经常被击中并提供许多点。相反,远处的物体不常被击中并且提供较少的点数。为了减少点处理的计算权重,我们通常需要对点云进行下采样。然而,简单的 随机抽样 将从我们已经具有低密度测量的区域移除点,并且高密度区域仍将具有比所需更多的点。为了解决这个密度问题,我们可以使用一个 体素滤波 ,将原始点下采样为一个恒定大小的立方体,并只保留每个立方体的质心。

以决策树为基函数的提升方法称为提升树(boosting tree),包括GBDT,xgboost,adaboost。

Bootstrap是一种有放回的抽样方法思想。

该思想的应用有两方面:bagging和boosting

虽然都是有放回的抽样,但二者的区别在于:Bagging采用有放回的均匀取样,而Boosting根据错误率来取样(Boosting初始化时对每一个训练例赋相等的权重1/n,然后用该学算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重),因此Boosting的分类精度要优于Bagging。Bagging的训练集的选择是随机的,各轮训练集之间相互,而Boostlng的各轮训练集的选择与前面各轮的学习结果有关。

Bagging主要关注降低方,Boosting关注的主要是降低偏。

该集成算法体现了3方面的优势,分别是提升Boosting,梯度Gradient,和决策树Decision Tree。提升是指将多个弱分类器通过线下组合实现强分类器的过程,梯度是指算法在提升过程中求解损失函数时增强了灵活性和便捷性,决策树是指算法所使用的弱分类器为CART回归树。

先讨论决策树,随机森林是利用Bootstrap抽样技术生成多个数据集,然后通过这些数据集构造多棵决策树,进而运用投票或平均的思想实现分类和预测问题的解决,但是这样的随机性会导致树与树之间并没有太多的相关性,往往会导致随机森林算法在拟合效果上不好,于是有了“提升”的概念,即通过改变样本点的权值和各个弱分类器的权重,将这些弱分类器组合,实现预测准确性的突破,然后又为了求解损失函数容易和方便,又提出了GBDT。

GBDT的核心在于累加所有树的结果作为最终结果,回归树(预测实数值)是可以累加的,而分类树(分类标签值)是没办法累加的,所以GBDT中的树都是回归树,不是分类树,尽管GBDT调整后也可用于分类但不代表GBDT的树是分类树。即GDBT调整之后可以用于分类问题,但是内部还是回归树。

这部分和决策树中的是一样的,无非就是特征选择。回归树用的是最小化均方误,分类树是用的是最小化基尼指数(CART)

以年龄为例:

回归树在每个节点(不一定是叶子节点)都会得一个预测值,该预测值等于属于这个节点的所有人年龄的平均值。分枝时穷举每一个feature的每个阈值找的分割点,但衡量的标准不再是熵,而是最小化均方--即(每个人的年龄-预测年龄)^2 的总和 / N,或者说是每个人的预测误平方和 除以 N。这很好理解,被预测出错的人数越多,错的越离谱,均方就越大,通过最小化均方能够找到最靠谱的分枝依据。分枝直到每个叶子节点上人的年龄都或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不,则以该节点上所有人的平均年龄做为该叶子节点的预测年龄。

Boosting,迭代,即通过迭代多棵树来共同决策。他的思想来源是三个臭皮匠顶个诸葛亮,Boost是"提升"的意思,一般Boosting算法都是一个迭代的过程,每一次新的训练都是为了改进上一次的结果。 GBDT是把所有树的结论累加起来做最终结论的,每棵树的结论并不是年龄本身,而是年龄的一个累加量。GBDT的核心就在于,每一棵树学的是之前所有树结论和的残,这个残就是一个加预测值后能得真实值的累加量。 比如A的真实年龄是18岁,但棵树的预测年龄是12岁,了6岁,即残为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残,第三棵树里A的年龄就变成1岁,继续学。

是boosting,但不是Adaboost。GBDT不是Adaboost Decistion Tree。就像提到决策树大家会想起C4.5,提到boost多数人也会想到Adaboost。Adaboost是另一种boost方法,它按分类对错,分配不同的weight,计算cost function时使用这些weight,从而让“错分的样本权重越来越大,使它们更被重视”。Bootstrap也有类似思想,它在每一步迭代时不改变模型本身,也不计算残,而是从N个样本训练集中按一定概率重新抽取N个样本出来(单个样本可以被重复抽样),对这N个新的样本再训练一轮。由于数据集变了迭代模型训练结果也不一样,而一个样本被前面分错的越厉害,它的概率就被设的越高,这样就能同样达到逐步关注被分错的样本,逐步完善的效果。Adaboost的方法被实践证明是一种很好的防止过拟合的方法。Adaboost是一种代表的提升树。Adaboost也可以用于分类或者回归。

GBDT是提升算法的扩展板,在原始的提升算法中,如果损失函数为平方损失或指数损失,求解损失函数的最小值问题会很简单,但如果损失函数为更一般的函数(比如损失函数获Huber损失函数),目标值的求解会复杂,Freidman提出了梯度提升算法,即在第m轮基础模型中,利用损失函数的负梯度值作为该轮基础模型损失值的近似,并利用这个近似值构建下一轮基础模型。

GBDT适用范围:

GBDT可以适用于回归问题(线性和非线性),相对于logistic regression仅能用于线性回归,GBDT适用面更广。

GBDT也可用于二分类问题(设定阈值,大于为正,否则为负)和多分类问题。

优点:

参数少,准确率高,运算时间少,对异常数据稳定。

GBDT和随机森林

GBDT和随机森林的相同点:

都是由多棵树组成

最终的结果都由多棵树共同决定

GBDT和随机森林的不同点:

组成随机森林的可以是分类树、回归树;组成GBDT只能是回归树

对于最终的输出结果而言,随机森林使用多数投票或者简均;而GBDT则是将所有结果累加起来,或者加权累加起来

随机森林对异常值不敏感,GBDT对异常值非常敏感

随机森林对训练集一视同仁权值一样,GBDT是基于权值的弱分类器的集成

随机森林通过减小模型的方提高性能,GBDT通过减少模型偏提高性能

GBDT相比于决策树有什么优点

泛化性能更好!GBDT的好处在于,每一步的残计算其实变相的增大了分错样本的权重,而已经分对的样本则都趋向于0。这样后面就更加专注于那些分错的样本。

Gradient体现在哪里?

通过组合多个分类器(可以不同)的分类结果,获得了比简单的分类器更好的效果。选择不同的分类器可以缓解同一分类器可能放大的过拟合问题。

有三种集成方法:Bagging、Boosting 和 Random Forset。Bagging通过随机抽样 S 次(有放回的抽样),得到 S 个与原数据集大小相同的数据集,作用到 S 个分类器上,根据投票决定分到哪一个类;Boosting 在 Bagging 上更进一步,它在数据集上顺序应用了多个不同的分类器。

Boosting 中的的一个算法是 AdaBoost,是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),以弱学习器作为基分类器,并且输入数据,使其通过权重向量进行加权。在次迭代中,所有数据等权重,在后续迭代中,前次迭代中分错的数据的权值增大,将修改过权值的新数据集送给下层分类器进行训练,将每次训练得到的分类器融合起来,作为的决策分类器。这种针对错误的调节能力正是 AdaBoost 的长处。

AdaBoost的具体做法:

(1)提高那些被前一轮弱分类器错误分类样本的权值,降低那些被正确分类的样本的权值。这样一来,那些没有得到正确分类的数据,由于其权值的加大而受到后一轮弱分类器的关注。

(2)采用加权多数表决。具体的,加大分类错误率低的分类器的权值,使其在表决中起较大作用,减少分类误率大的弱分类器的权值,使其在表决中起较小作用。

三部分组成:

(1)分类器权重更新公式

(2)样本分布(也就是样本权重一旦 FastCorrelativeScanMatcher 有足够好的建议(高于匹配分数),然后将其输入Ceres扫描匹配器以改进位姿。)更新公式

(3)加性模型。 最小化指数损失函数

优点:

很好的利用了弱分类器进行级联;

可以将不同的分类算法作为弱分类器;

AdaBoost 具有很高的精度;

不改变所给的训练数据,而不断改变训练数据的权值分布,使得训练数据在基本分类器的学习中起不同的作用。这是AdaBoost的一个特点;

利用基本分类器的加权线性组合构建最终分类器,是AdaBoost的另一个特点;

AdaBoost被实践证明是一种很好的防止过拟合的方法;

泛化错误率低,易编码,可以应用在大部分分类器上,无参数调整。

缺点:

AdaBoost 迭代次数也就是弱分类器数目不太好设定,可以使用交叉验证来进行确定;

数据不平衡导致分类精度下降;

训练比较耗时,每次重新选择当前分类器切分点;

AdaBoost只适用于二分类问题;

应用领域:

模式识别、计算机视觉领域,用于二分类和多分类场景。

自变量包括客户的性别、受教育水平、年龄、婚姻状况、信用额度、6个月的历史还款状态、账单金额以及还款金额,因变量y表示用户在下个月的还款是否存在违约的情况(1表示违约,9表示不违约)

违约客户比例占比22.1%,不违约客户占比77.9%,总体来说,两个类别的比例不算失衡。

使用模型默认参数,准确率为81.25%,预测客户违约(y=1)的率为68%,覆盖率为32%,绘制ROC曲线

面积AUC为0.78,不到0.8,通过调整参数,即交叉验证的方法来选择相对合理的参数值,并且可以进一步做特征筛选(按照重要因素)

取出重要性比较高的变量(Gradient Boosting Decision Tree梯度提升树) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终。与其他有监督算法一样,可用于分类问题的识别和预测问题的解决。再利用交叉验证选择参数建模

先对基础模型决策树DecisionTreeClassifier的参数进行调优

经过5重交叉验证,的树深度选择为3

再对提升树AdaBoostClassifier模型的参数调优

经过5重交叉验证,AdaBoost算法的基础模型个数为300,学习率为0..01

基于以上调参结果重新构造模型

准确率只提升了0.35%,可以考虑其他模型

与AdaBoost结果一致,说明GBDT采用一阶导函数的值近似残是合理的

Cartographer调参

无论哪种方式, CeresScanMatcher 都可以配置为给每个输入一定的权重。权重是衡量对数据的信任度,可以将其视为静态协方。重量参数的单位是无量纲的数量,不能在彼此之间进行比较。数据源的权重越大,Cartographer在进行扫描匹配时就会越强调这个数据源。数据来源包括占用空间(扫描点),位姿外推器(或 RealTimeCorrelativeScanMatcher )的平移和旋转

Cartographer是一个复杂的系统,调整它需要很好地理解其内部工作。此页面试图直观地概述Cartographer使用的不同子系统及其配置值。如果您对Cartographer的介绍不仅仅感兴趣,还应参考Cartographer论文。它仅描述了2D SLAM,但它严格定义了此处描述的大多数概念。这些概念通常也适用于3D。

更加具体的流程

W. Hess, D. Kohler, H. Rapp, and D. Andor, Real-Time Loop Closure in 2D LIDAR SLAM , in Robotics and Automation (ICRA), 2016 IEEE International Conference on . IEEE, 2016. pp. 1271–1278.

在更高的抽象上,LocalSLAM的工作是生成良好的子图,而全局SLAM的工作是将它们最一致地结合在一起。

测距传感器(例如:LIDAR)提供多个方向的深度信息。但是,有些测量与SLAM无关。如果传感器部分被灰尘覆盖或者如果它被引向机器人的一部分,则一些测量距离可被视为SLAM的噪声。另一方面,一些最远的测量也可能来自不需要的源(反射,传感器噪声),并且也与SLAM无关。为解决这些问题,Cartographer首先应用带通滤波器,并仅将范围值保持在某个最小和范围之间。应根据机器人和传感器的规格选择最小值和值。

在2D中,Cartographer将比max_range更换范围 TRAJECTORY_BUILDER_2D.missing_data_ray_length 。它还提供了将3D点云过滤为2D切割的值 max_z 和 min_z 值。

距离是在一段时间内测量的,而机器人实际上正在移动。但是,距离是由大型ROS消息中的“批量”传感器提供的。Cartographer可以考虑每个消息的时间戳,以考虑机器人运动引起的畸变。Cartographer进行测量频率越高,测量结果组合成一个可以立即捕获的单个相干扫描就越好。因此,强烈建议通过扫描提供尽可能多的 rangedata (ROS消息)。

较小的立方体大小将导致更密集的数据表示,从而导致更多计算。较大的立方体大小会导致数据丢失,但会更快。

在应用了固定尺寸的体素滤镜后,Cartographer还应用了 自适应体素滤镜 。此过滤器尝试确定体素大小(在长度下)以实现目标点数。在3D中,两个自适应体素滤波器用于生成高分辨率和低分辨率点云,它们的使用将在 LocalSLAM中 阐明。

有两种扫描匹配策略:

在3D中, occupied_space_weight_0 和 occupied_space_weight_1 参数分别与高分辨率和低分辨率滤波点云相关。

在 CeresScanMatcher 从得名 Ceres Solver ,以谷歌为解决非线性最小二乘问题的库。扫描匹配问题被建模为这样的问题的最小化,其中两个扫描之间的 运动 (变换矩阵)是要确定的参数。Ceres使用下降算法针对给定的迭代次数优化运动。Ceres可以配置为根据您自己的需要调整收敛速度。

该 RealTimeCorrelativeScanMatcher 可以根据您在传感器的信任进行切换。它的工作原理是在 搜索窗口中 搜索类似的扫描, 搜索窗口 由距离半径和角度半径定义。当使用此窗口中的扫描执行扫描匹配时,可以为平移和旋转组件选择不同的权重。例如,如果您知道机器人不会旋转很多,您可以使用这些权重。

为避免每个子图插入太多扫描,一旦扫描匹配器找到两次扫描之间的运动,它就会通过 运动滤波器 。如果导致它的运动不够重要,则扫描将被删除。仅当扫描的运动高于特定距离,角度或时间阈值时,才会将扫描插入到当前子图中。

概率网格将空间划分为2D或3D表格,其中每个单元格具有固定大小并包含被障碍物占有的概率。根据“ 命中 ”(测量范围数据)和“ 未命中 ”(传感器和测量点之间的自由空间)更新Odds。 命中 和 未命中 可以在占用概率计算不同的权重,赋予更多或更少的信任。

在2D中,每个子图仅存储一个概率网格。在3D中,出于扫描匹配性能的原因,使用两个 混合 概率网格。(术语“混合”仅指内部树状数据表示并被抽象给用户)

扫描匹配首先将低分辨率点云的远点与低分辨率混合网格对齐,然后通过将高分辨率点与高分辨率混合网格对齐来细化位姿。

CartographerROS提供了一个可视化子图的RViz插件。您可以从其编号中选择要查看的子图。在3D中,RViz仅显示3D混合概率网格的2D投影(灰度)。RViz左侧窗格中提供了选项,可在低分辨率和高分辨率混合网格可视化之间切换。

TODO : 记录TSDF配置

当LocalSLAM生成其连续的子图时,全局优化(通常称为“ 优化问题 ”或“ 稀疏位姿调整 ”)任务在后台运行。它的作用是重新安排彼此之间的子图,以便它们形成一个连贯的全局地图。例如,该优化负责改变当前构建的轨迹以正确地对准关于环闭合的子图。

一旦插入了一定数量的轨迹节点,就会批量运行优化。根据您运行它的频率,您可以调整这些批次的大小。

将 POSE_GRAPH.optimize_ry_n_nodes 设置为 0 是禁用全局SLAM并专注于LocalSLAM行为的便捷方法。这通常是调整Cartographer的件事。

全局SLAM是一种“ GraphSLAM ”,它本质上是一种位姿图优化,它通过在 节点 和子图之间构建 约束 然后优化得到的约束图来工作。可以直观地将约束视为将所有节点捆绑在一起的小绳索。稀疏位姿调整完全固定这些绳索。生成的网称为“ 位姿图 ”。

约束可以在RViz中可视化,调整全局SLAM非常方便。还可以切换 POSE_GRAPH.constraint_builder.log_matches 以获得格式化为直方图的约束构建器的常规报告。

实际上,全局约束不仅可以在单个轨迹上查找循环闭包。它们还可以对齐由多个机器人记录的不同轨迹,但我们将保留此用法以及与“全局本地化”相关的参数超出本文档的范围。

为了限制约束(和计算)的数量,Cartographer仅考虑构建约束的所有关闭节点的子采样集。这由采样率常数控制。采样太少的节点可能导致错过约束和无效的循环闭包。对太多节点进行采样会降低全局SLAM的速度并阻止实时循环关闭。

当考虑节点和子图建立约束时,它们会通过名为的个扫描匹配器 FastCorrelativeScanMatcher 。该扫描匹配器专为Cartographer设计,可实现实时循环闭合扫描匹配。在 FastCorrelativeScanMatcher 依靠“ 分支定界 ”机制在不同的格点分辨率的工作,有效地消除不正确匹配数。这种机制在本文件前面介绍的制图文章中有广泛的介绍。它适用于可以控制深度的探索树。

当Cartographer运行 优化问题时 ,Ceres用于根据多个 残 重新排列子图。残是使用 加权损失函数 计算的。全局优化具有成本函数以考虑大量数据源:全局(循环闭包)约束,非全局(匹配器)约束,IMU加速和旋转测量,局部SLAM粗略姿态估计,测距源或固定框架(如GPS系统)。可以按照 LocalSLAM 部分中的说明配置权重和Ceres选项。

通过切换,可以找到有关优化问题中使用的残的有用信息 POSE_GRAPH.max_num_f对离散点敏感。inal_iterations

作为其IMU残的一部分,优化问题为IMU姿态提供了一些灵活性,默认情况下,Ceres可以自由地优化IMU和跟踪帧之间的外部校准。如果您不信任您的IMU位姿,可以记录Ceres全局优化的结果并用于改进您的外部校准。如果Ceres没有正确优化您的IMU位姿并且您完全相信您的外在校准,则可以使此位姿保持不变。

在残中,异常值的影响由配置有某个Huber量表的 Huber损失 函数处理。Huber量表 越大 ,(潜在)异常值 的影响越大 。

一旦轨迹完成,Cartographer就会运行一个新的全局优化,通常比以前的全局优化要多得多。这样做是为了完善Cartographer的最终结果,通常不需要是实时的,所以大量的迭代通常是正确的选择。

损失函数一般多大算好

在Cartographer配置文件中,每个距离都以米为单位定义

没有一个损失函数可以适用于所有类型的数据。损失函数的选Gradient体现在:无论前面一颗树的cost function是什么,是均方还是均,只要它以误作为衡量标准,那么残向量都是它的全局方向,这就是Gradient。择取决于许多因素,包括是否有离群点,机器学习算法的选择,运行梯度下降的时间效率,是否易于找到函数的导数,以及预测结果的置信度。

回归损失:均方误,二次损失,L2损失平均误,L1损失MSE vs MAE,Huber Loss,平滑的平均误,Log-Cosh L组成随机森林的树可以并行生成(Bagging);GBDT只能串行生成(Boosting)oss,Quantile Loss

损失函数和代价函数一样吗

在注意slaRangedata通常从机器人上的单个点测量,但是以多个角度测量。这意味着靠近的表面(例如道路)经常被击中并提供许多点。相反,远处的物体不常被击中并且提供较少的点数。为了减少点处理的计算权重,我们通常需要对点云进行下采样。然而,简单的 随机抽样 将从我们已经具有低密度测量的区域移除点,并且高密度区域仍将具有比所需更多的点。为了解决这个密度问题,我们可以使用一个 体素滤波 ,将原始点下采样为一个恒定大小的立方体,并只保留每个立方体的质心。m中

损失函数(Lossfunction residual)

代价函数(Costfunction)

比如在优化的时候,由于无匹配等原因,把原本不应该加到图中的边给加进去了,误大的边梯度也大,意味着调整与它相关的变量会使目标函数下降更多。所以当误很大时,二范数增长得太快,二核函数保证每条边的误不会大得没边而掩盖掉其他的边。具体是将原先误的二范数度量替换成一个增长没那么快的代价函数类似于核函数?那什么是核函数?剔除外点函数,同时保证光滑性(不然没法求导),使优化结果更加稳健,所以又叫鲁棒核函数。常见的Huber核函数。

ceres中的核函数用来减小Outlier的影响,对应g2o中的edge->setRobustKernel()。

深度学习的核函数:

一般定义是将原始表达转换到一个隐式特征空间去,该空间具有更好的特征可分性质。

在机器学习中,(一层线性卷积结构+一层核函数)N的特殊结构,能拟合任何函数的原因。但如果只有N层的线性结构,那的组合还是线性结构,就相当于以前的感知机(perceptron)。使得类似神经网络结构从线性变成非线性的,就是每一层后加的核函数/激活函数。

从上边我们可以看出,核函数的作用,是将原始结果空间映射到一个新的输出空间,在这个映射过程中可以进行滤波,转换后的空间具有更好的特征可分性质。

Cartographer调参

注意

Cartographer是一个复杂的系统,调整它需要很好地理解其内部工作。此页面试图直观地概述Cartographer使用的不同子系统及其配置值。如果您对Cartographer的介绍不仅仅感兴趣,还应参考Cartographer论文。它仅描述了2D SLAM,但它严格定义了此处描述的大多数概念。这些概念通常也适用于3D。

拆分数据

W. Hess, D. Kohler, H. Rapp, and D. Andor, Real-Time Loop Closure in 2D LIDAR SLAM , in Robotics and Automation (ICRA), 2016 IEEE International Conference on . IEEE, 2016. pp. 1271–1278.

在更高的抽象上,LocalSLAM的工作是生成良好的子图,而全局SLAM的工作是将它们最一致地结合在一起。

测距传感器(例如:LIDAR)提供多个方向的深度信息。但是,有些测量与SLAM无关。如果传感器部分被灰尘覆盖或者如果它被引向机器人的一部分,则一些测量距离可被视为SLAM的噪声。另一方面,一些最远的测量也可能来自不需要的源(反射,传感器噪声),并且也与SLAM无关。为解决这些问题,Cartographer首先应用带通滤波器,并仅将范围值保持在某个最小和范围之间。应根据机器人和传感器的规格选择最小值和值。

在2D中,Cartographer将比max_range更换范围 TRAJECTORY_BUILDER_2D.missing_data_ray_length 。它还提供了将3D点云过滤为2D切割的值 max_z 和 min_z 值。

距离是在一段时间内测量的,而机器人实际上正在移动。但是,距离是由大型ROS消息中的“批量”传感器提供的。Cartographer可以考虑每个消息的时间戳,以考虑机器人运动引起的畸变。Cartographer进行测量频率越高,测量结果组合成一个可以立即捕获的单个相干扫描就越好。因此,强烈建议通过扫描提供尽可能多的 rangedata (ROS消息)。

较小的立方体大小将导致更密集的数据表示,从而导致更多计算。较大的立方体大小会导致数据丢失,但会更快。

在应用了固定尺寸的体素滤镜后,Cartographer还应用了 自适应体素滤镜 。此过滤器尝试确定体素大小(在长度下)以实现目标点数。在3D中,两个自适应体素滤波器用于生成高分辨率和低分辨率点云,它们的使用将在 LocalSLAM中 阐明。

有两种扫在普通优化问题中,为了抑制outlier对结果影响太大,往往需要加一个核函数,来禁止或降低那些离散点对最终结果的影响。描匹配策略:

在3D中, occupied_space_weight_0 和 occupied_space_weight_1 参数分别与高分辨率和低分辨率滤波点云相关。

在 CeresScanMatcher 从得名 Ceres Solver ,以谷歌为解决非线性最小二乘问题的库。扫描匹配问题被建模为这样的问题的最小化,其中两个扫描之间的 运动 (变换矩阵)是要确定的参数。Ceres使用下降算法针对给定的迭代次数优化运动。Ceres可以配置为根据您自己的需要调整收敛速度。

该 RealTimeCorrelativeScanMatcher 可以根据您在传感器的信任进行切换。它的工作原理是在 搜索窗口中 搜索类似的扫描, 搜索窗口 由距离半径和角度半径定义。当使用此窗口中的扫描执行扫描匹配时,可以为平移和旋转组件选择不同的权重。例如,如果您知道机器人不会旋转很多,您可以使用这些权重。

为避免每个子图插入太多扫描,一旦扫描匹配器找到两次扫描之间的运动,它就会通过 运动滤波器 。如果导致它的运动不够重要,则扫描将被删除。仅当扫描的运动高于特定距离,角度或时间阈值时,才会将扫描插入到当前子图中。

概率网格将空间划分为2D或3D表格,其中每个单元格具有固定大小并包含被障碍物占有的概率。根据“ 命中 ”(测量范围数据)和“ 未命中 ”(传感器和测量点之间的自由空间)更新Odds。 命中 和 未命中 可以在占用概率计算不同的权重,赋予更多或更少的信任。

在2D中,每个子图仅存储一个概率网格。在3D中,出于扫描匹配性能的原因,使用两个 混合 概率网格。(术语“混合”仅指内部树状数据表示并被抽象给用户)

扫描匹配首先将低分辨率点云的远点与低分辨率混合网格对齐,然后通过将高分辨率点与高分辨率混合网格对齐来细化位姿。

CartographerROS提供了一个可视化子图的RViz插件。您可以从其编号中选择要查看的子图。在3D中,RViz仅显示3D混合概率网格的2D投影(灰度)。RViz左侧窗格中提供了选项,可在低分辨率和高分辨率混合网格可视化之间切换。

TODO : 记录TSDF配置

当LocalSLAM生成其连续的子图时,全局优化(通常称为“ 优化问题 ”或“ 稀疏位姿调整 ”)任务在后台运行。它的作用是重新安排彼此之间的子图,以便它们形成一个连贯的全局地图。例如,该优化负责改变当前构建的轨迹以正确地对准关于环闭合的子图。

一旦插入了一定数量的轨迹节点,就会批量运行优化。根据您运行它的频率,您可以调整这些批次的大小。

将 POSE_GRAPH.optimize_ry_n_nodes 设置为 0 是禁用全局SLAM并专注于LocalSLAM行为的便捷方法。这通常是调整Cartographer的件事。

全局SLAM是一种“ GraphSLAM ”,它本质上是一种位姿图优化,它通过在 节点 和子图之间构建 约束 然后优化得到的约束图来工作。可以直观地将约束视为将所有节点捆绑在一起的小绳索。稀疏位姿调整完全固定这些绳索。生成的网称为“ 位姿图 ”。

约束可以在RViz中可视化,调整全局SLAM非常方便。还可以切换 POSE_GRAPH.constraint_builder.log_matches 以获得格式化为直方图的约束构建器的常规报告。

实际上,全局约束不仅可以在单个轨迹上查找循环闭包。它们还可以对齐由多个机器人记录的不同轨迹,但我们将保留此用法以及与“全局本地化”相关的参数超出本文档的范围。

为了限制约束(和计算)的数量,Cartographer仅考虑构建约束的所有关闭节点的子采样集。这由采样率常数控制。采样太少的节点可能导致错过约束和无效的循环闭包。对太多节点进行采样会降低全局SLAM的速度并阻止实时循环关闭。

当考虑节点和子图建立约束时,它们会通过名为的个扫描匹配器 FastCorrelativeScanMatcher 。该扫描匹配器专为Cartographer设计,可实现实时循环闭合扫描匹配。在 FastCorrelativeScanMatcher 依靠“ 分支定界 ”机制在不同的格点分辨率的工作,有效地消除不正确匹配数。这种机制在本文件前面介绍的制图文章中有广泛的介绍。它适用于可以控制深度的探索树。

当Cartographer运行 优化问题时 ,Ceres用于根据多个 残 重新排列子图。残是使用 加权损失函数 计算的。全局优化具有成本函数以考虑大量数据源:全局(循环闭包)约束,非全局(匹配器)约束,IMU加速和旋转测量,局部SLAM粗略姿态估计,测距源或固定框架(如GPS系统)。可以按照 LocalSLAM 部分中的说明配置权重和Ceres选项。

通过切换,可以找到有关优化问题中使用的残的有用信息 POSE_GRAPH.max_num_final_iterations

作为其IMU残的一部分,优化问题为IMU姿态提供了一些灵活性,默认情况下,Ceres可以自由地优化IMU和跟踪帧之间的外部校准。如果您不信任您的IMU位姿,可以记录Ceres全局优化的结果并用于改进您的外部校准。如果Ceres没有正确优化您的IMU位姿并且您完全相信您的外在校准,则可以使此位姿保持不变。

在残中,异常值的影响由配置有某个Huber量表的 Huber损失 函数处理。Huber量表 越大 ,(潜在)异常值 的影响越大 。

一旦轨迹完成,Cartographer就会运行一个新的全局优化,通常比以前的全局优化要多得多。这样做是为了完善Cartographer的最终结果,通常不需要是实时的,所以大量的迭代通常是正确的选择。

用AdaBoost和GBDT模型处理违约问题

可以理解为残是全局的方向,类似于求梯度。

以决策树为基函数的提升方法称为提升树(boosting tree),包括GBDT,xgboost,adaboost。

组成随机森林的树可以并行生成(Bagging);GBDT只能串行生成(Boosting)

Bootstrap是一种有放回的抽样方法思想。

该思想的应用有两方面:bagging和boosting

虽然都是有放回的抽样,但二者的区别在于:Bagging采用有放回的均匀取样,而Boosting根据错误率来取样(Boosting初始化时对每一个训练例赋相等的权重1/n,然后用该学算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重),因此Boosting的分类精度要优于Bagging。Bagging的训练集的选择是随机的,各轮训练集之间相互,而Boostlng的各轮训练集的选择与前面各轮的学习结果有关。

Bagging主要关注降低方,Boosting关注的主要是降低偏。

该集成算法体现了3方面的优势,分别是提升Boosting,梯度Gradient,和决策树Decision Tree。提升是指将多个弱分类器通过线下组合实现强分类器的过程,梯度是指算法在提升过程中求解损失函数时增强了灵活性和便捷性,决策树是指算法所使用的弱分类器为CART回归树。

先讨论决策树,随机森林是利用Bootstrap抽样技术生成多个数据集,然后通过这些数据集构造多棵决策树,进而运用投票或平均的思想实现分类和预测问题的解决,但是这样的随机性会导致树与树之间并没有太多的相关性,往往会导致随机森林算法在拟合效果上不好,于是有了“提升”的概念,即通过改变样本点的权值和各个弱分类器的权重,将这些弱分类器组合,实现预测准确性的突破,然后又为了求解损失函数容易和方便,又提出了GBDT。

GBDT的核心在于累加所有树的结果作为最终结果,回归树(预测实数值)是可以累加的,而分类树(分类标签值)是没办法累加的,所以GBDT中的树都是回归树,不是分类树,尽管GBDT调整后也可用于分类但不代表GBDT的树是分类树。即GDBT调整之后可以用于分类问题,但是内部还是回归树。

这部分和决策树中的是一样的,无非就是特征选择。回归树用的是最小化均方误,分类树是用的是最小化基尼指数(CART)

以年龄为例:

回归树在每个节点(不一定是叶子节点)都会得一个预测值,该预测值等于属于这个节点的所有人年龄的平均值。分枝时穷举每一个feature的每个阈值找的分割点,但衡量的标准不再是熵,而是最小化均方--即(每个人的年龄-预测年龄)^2 的总和 / N,或者说是每个人的预测误平方和 除以 N。这很好理解,被预测出错的人数越多,错的越离谱,均方就越大,通过最小化均方能够找到最靠谱的分枝依据。分枝直到每个叶子节点上人的年龄都或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不,则以该节点上所有人的平均年龄做为该叶子节点的预测年龄。

Boosting,迭代,即通过迭代多棵树来共同决策。他的思想来源是三个臭皮匠顶个诸葛亮,Boost是"提升"的意思,一般Boosting算法都是一个迭代的过程,每一次新的训练都是为了改进上一次的结果。 GBDT是把所有树的结论累加起来做最终结论的,每棵树的结论并不是年龄本身,而是年龄的一个累加量。GBDT的核心就在于,每一棵树学的是之前所有树结论和的残,这个残就是一个加预测值后能得真实值的累加量。 比如A的真实年龄是18岁,但棵树的预测年龄是12岁,了6岁,即残为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残,第三棵树里A的年龄就变成1岁,继续学。

是boosting,但不是Adaboost。GBDT不是Adaboost Decistion Tree。就像提到决策树大家会想起C4.5,提到boost多数人也会想到Adaboost。Adaboost是另一种boost方法,它按分类对错,分配不同的weight,计算cost function时使用这些weight,从而让“错分的样本权重越来越大,使它们更被重视”。Bootstrap也有类似思想,它在每一步迭代时不改变模型本身,也不计算残,而是从N个样本训练集中按一定概率重新抽取N个样本出来(单个样本可以被重复抽样),对这N个新的样本再训练一轮。由于数据集变了迭代模型训练结果也不一样,而一个样本被前面分错的越厉害,它的概率就被设的越高,这样就能同样达到逐步关注被分错的样本,逐步完善的效果。Adaboost的方法被实践证明是一种很好的防止过拟合的方法。Adaboost是一种代表的提升树。Adaboost也可以用于分类或者回归。

GBDT是提升算法的扩展板,在原始的提升算法中,如果损失函数为平方损失或指数损失,求解损失函数的最小值问题会很简单,但如果损失函数为更一般的函数(比如损失函数获Huber损失函数),目标值的求解会复杂,Freidman提出了梯度提升算法,即在第m轮基础模型中,利用损失函数的负梯度值作为该轮基础模型损失值的近似,并利用这个近似值构建下一轮基础模型。

GBDT适用范围:

GBDT可以适用于回归问题(线性和非线性),相对于logistic regression仅能用于线性回归,GBDT适用面更广。

GBDT也可用于二分类问题根据Cartographer_ros文档翻译(设定阈值,大于为正,否则为负)和多分类问题。

优点:

参数少,准确率高,运算时间少,对异常数据稳定。

GBDT和随机森林

GBDT和随机森林的相同点:

都是由多棵树组成

最终的结果都由多棵树共同决定

GBDT和随机森林的不同点:

组成随机森林的可以是分类树、回归树;组成GBDT只能是回归树

对于最终的输出结果而言,随机森林使用多数投票或者简均;而GBDT则是将所有结果累加起来,或者加权累加起来

随机森林对异常值不敏感,GBDT对异常值非常敏感

随机森林对训练集一视同仁权值一样,GBDT是基于权值的弱分类器的集成

随机森林通过减小模型的方提高性能,GBDT通过减少模型偏提高性能

GBDT相比于决策树有什么优点

泛化性能更好!GBDT的好处在于,每一步的残计算其实变相的增大了分错样本的权重,而已经分对的样本则都趋向于0。这样后面就更加专注于那些分错的样本。

Gradient体现在哪里?

通过组合多个分类器(可以不同)的分类结果,获得了比简单的分类器更好的效果。选择不同的分类器可以缓解同一分类器可能放大的过拟合问题。

有三种集成方法:Bagging、Boosting 和 Random Forset。Bagging通过随机抽样 S 次(有放回的抽样),得到 S 个与原数据集大小相同的数据集,作用到 S 个分类器上,根据投票决定分到哪一个类;Boosting 在 Bagging 上更进一步,它在数据集上顺序应用了多个不同的分类器。

Boosting 中的的一个算法是 AdaBoost,是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),以弱学习器作为基分类器,并且输入数据,使其通过权重向量进行加权。在次迭代中,所有数据等权重,在后续迭代中,前次迭代中分错的数据的权值增大,将修改过权值的新数据集送给下层分类器进行训练,将每次训练得到的分类器融合起来,作为的决策分类器。这种针对错误的调节能力正是 AdaBoost 的长处。

AdaBoost的具体做法:

(1)提高那些被前一轮弱分类器错误分类样本的权值,降低那些被正确分类的样本的权值。这样一来,那些没有得到正确分类的数据,由于其权值的加大而受到后一轮弱分类器的关注。

(2)采用加权多数表决。具体的,加大分类错误率低的分类器的权值,使其在表决中起较大作用,减少分类误率大的弱分类器的权值,使其在表决中起较小作用。

三部分组成:

(1)分类器权重更新公式

(2)样本分布(也就是样本权重)更新公式

(3)加性模型。 最小化指数损失函数

优点:

很好的利用了弱分类器进行级联;

可以将不同的分类算法作为弱分类器;

AdaBoost 具有很高的精度;

不改变所给的训练数据,而不断改变训练数据的权值分布,使得训练数据在基本分类器的学习中起不同的作用。这是AdaBoost的一个特点;

利用基本分类器的加权线性组合构建最终分类器,是AdaBoost的另一个特点;

AdaBoost被实践证明是一种很好的防止过拟合的方法;

泛化错误率低,易编码,可以应用在大部分分类器上,无参数调整。

缺点:

AdaBoost 迭代次数也就是弱分类器数目不太好设定,可以使用交叉验证来进行确定;

数据不平衡导致分类精度下降;

训练比较耗时,每次重新选择当前分类器切分点;

AdaBoost只适用于二分类问题;

应用领域:

模式识别、计算机视觉领域,用于二分类和多分类场景。

自变量包括客户的性别、受教育水平、年龄、婚姻状况、信用额度、6个月的历史还款状态、账单金额以及还款金额,因变量y表示用户在下个月的还款是否存在违约的情况(1表示违约,9表示不违约)

违约客户比例占比22.1%,不违约客户占比77.9%,总体来说,两个类别的比例不算失衡。

使用模型默认参数,准确率为81.25%,预测客户违约(y=1)的率为68%,覆盖率为32%,绘制ROC曲线

面积AUC为0.78,不到0.8,通过调整参数,即交叉验证的方法来选择相对合理的参数值,并且可以进一步做特征筛选(按照重要因素)

取出重要性比较高的变量再利用交叉验证选择参数建模

先对基础模型决策树DecisionTreeClassifier的参数进行调优

经过5重交叉验证,的树深度选择为3

再对提升树AdaBoostClassifier模型的参数调优

经过5重交叉验证,AdaBoost算法的基础模型个数为300,学习率为0..01

基于以上调参结果重新构造模型

准确率只提升了0.35%,可以考虑其他模型

与AdaBoost结果一致,说明GBDT采用一阶导函数的值近似残是合理的

Gradient Boosting Decision Tree梯度决策提升树

在Cartographer配置文件中,每次定义值都以秒为单位

GBDT = Gradient Boosting + Decision Tree

技术标签: Cartographer

先从Decision Tree开始讲,单个决策树容易过拟合,但我们可以通过各种方法,抑制决策树的复杂性,降低单颗决策树的拟合能力,然后通过其他手段来集成多个决策树,最终能够很好的解决过拟合的问题。

损失函数和代价函数是同一个东西,目标函数是一个与他们相关但更广的概念,对于目标函数来说在有约束条件下的最小化就是损失函数(化的不叫损失或代价函数)。

GBDT中的树都是回归树,不是分类树!!!

GBDT中的树都是回归树,不是分类树!!!

GBDT中的树都是回归树,不是分类树!!!

GBDT的核心在于 累加所有树的结果作为最终结果 ,而分类树的结果显然是没办法累加的,这点对理解GBDT相当重要(PS: 尽管GBDT调整后也可用于分类但不代表GBDT的树是分类树)。

上面说的手段就是Boosting。Boosting 是一族可将弱学习器提升为强学习器的算法,属于集成学习(ensemble learning)的范畴。

基于梯度提升算法的学习器 叫做 GBM(Gradient Boosting Machine)。理论上,GBM 可以选择各种不同的学习算法作为基学习器。GBDT 实际上是 GBM 的一种情况。

决策树可以认为是 if-then 规则的,易于理解,可解释性强,预测速度快。同时,决策树算法相比于其他的算法需要更少的特征工程,比如可以不用做特征标准化,可以很好的处理字段缺失的数据,也可以不用关心特征间是否相互依赖等。

弱决策树们通过梯度提升(Gradient Boosting)的方法,提升模型准确度。由此可见,梯度提升方法和决策树学习算法是一对完美的搭档。

GBDT 算法可以看成是由 K 棵树组成的加法模型。加法模型的通常表达:

其中, 为基函数, 为基函数的参数, 为基函数的系数。

在给定训练数据以及损失函数 的条件下,学习加法模型 成为 经验风险极小化即损失函数极小化问题 :

解决加法模型的优化问题,可以用前向分布算法(forward stagewise algorithm)因为学习的是加法模型,如果能够从前往后,每一步只学习一个基函数及其系数(结构),逐步逼近优化目标函数,那么就可以简化复杂度。具体地, 每步只需要优化如下损失函数:

提升树算法采用前向分步算法。首先确定初始提升树 , 第m步的模型是:

其中, 为当前模型,通过经验风险极小化确定下一棵决策树的参数

针对不同问题的提升树学习算法,损失函数的选择也不同。

在梯度提升算法中负梯度也被称为伪残(pseudo-residuals)。

提升树用加法模型与前向分布算法实现学习的优化过程。当损失函数为平方损失和指数损失函数时,每一步优化是很简单的。但对于一般损失函数而言,往往每一步都不那么容易。对于这问题,Freidman提出了梯度提升算法。这是利用最速下降法的近似方法, 其关键是利用损失函数的负梯度在当前模型的值:

作为回归问题在当前模型的残的近似值,拟合一个回归树。

为什么要拟合负梯度呢?这就涉及到泰勒公式和梯度下降法了。

公式:

一阶泰勒展开式:

在机器学习任务中,需要最小化损失函数 ,其中 是要求解的模型参数。梯度下降法常用来求解这种无约束化问题,它是一种迭代方法:选择初值 ,不断迭代更新 ,进行损失函数极小化。

迭代公式:

相对的,在函数空间里,有

此处把 看成提升树算法的第t步损失函数的值, 为第t-1步损失函数值,要使 ,则需要 , 此处 为当前模型的负梯度值,即第t步的回归树需要拟合的值。

对于Huber损失和分位数损失,主要用于健壮回归,也就是减少异常点对损失函数的影响。

总结一下 GBDT 的学习算法:

算法步骤解释:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 12345678@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息