决策树
type
status
date
slug
summary
tags
category
icon
password
Property

原理

决策树理解

假如现在有一个母亲给女儿找相亲对象的这么一段对话:
那么转换成图便是这样:
notion image
以上这个就是决策树的原理。通过不断的划分条件来进行分类。其中决策树最关键的,是找出那些对结果影响最大的条件,放到前面。比如以上如果年龄是女儿最看重的,那么就应该把年龄放到最前面,这样可以节省查找的次数
 
 
 
 

代码

 
集成学习
type
status
date
slug
summary
tags
category
icon
password
Property

集成学习概述

集成学习的思想:对于训练集数据,通过训练若干个个体学习器,通过一定的结合策略,就可以最终形成一个强学习器,以达到博采众长的目的。
notion image
集成学习有两个主要的问题:第一是如何得到若干个个体学习器,第二是如何选择一种结合策略,将这些个体学习器集合成一个强学习器。
 

集成学习之个体学习器

如何得到若干个个体学习器,这里有两种选择:
  1. 第一种就是所有的个体学习器都是一个种类的,或者说是同质的,比如都是决策树个体学习器,或者都是神经网络个体学习器。
  1. 第二种是所有的个体学习器不全是一个种类的,或者说是异质的。比如一个分类问题,对训练集采用支持向量机个体学习器,逻辑回归个体学习器和朴素贝叶斯个体学习器来学习,再通过某种结合策略来确定最终的分类强学习器。
 
目前来说,同质个体学习器的应用是最广泛的,一般常说的集成学习的方法都是指的同质个体学习器。而同质个体学习器使用最多的模型是CART决策树和神经网络。同质个体学习器按照个体学习器之间是否存在依赖关系可以分为两类:
  • 第一个是个体学习器之间存在强依赖关系,一系列个体学习器基本都需要串行生成,代表算法是boosting系列算法
Adaboost
type
status
date
slug
summary
tags
category
icon
password
Property

原理

回顾boosting

notion image
Boosting算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目,最终将这个弱学习器通过集合策略进行整合,得到最终的强学习器。
不过有几个具体的问题Boosting算法没有详细说明:
  1. 如何计算学习误差率?
  1. 如何得到弱学习器权重系数?
  1. 如何更新样本权重D?
  1. 使用何种结合策略?
 

代码

 
梯度提升树(GBDT)
type
status
date
slug
summary
tags
category
icon
password
Property

原理

GBDT概述

GBDT也是集成学习Boosting家族的成员,但是却和传统的Adaboost有很大的不同。Adaboost利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT也是迭代,使用了前向分布算法,但弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。无论是GBDT分类树还是GBDT回归树,底层使用的都是CART回归树,并没有使用CART分类树。
在GBDT的迭代中,假设前一轮迭代得到的强学习器是,损失函数是,本轮迭代的目标是找到一个CART回归树模型的弱学习器,让本轮的损失函数最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。
GBDT的思想可以用一个通俗的例子解释:假如有个人30岁,首先用20岁去拟合,发现损失有10岁,这时用6岁去拟合剩下的损失,发现差距还有4岁,第三轮用3岁拟合剩下的差距,差距就只有一岁了。如果迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。
从例子看这个思想还是蛮简单的,但是有个问题是这个损失的拟合不好度量,损失函数各种各样,怎么找到一种通用的拟合方法呢?

GBDT的负梯度拟合

针对这个问题,大牛Freidman提出了用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树。第轮的第个样本的损失函数的负梯度表示为
 

代码

XGBoost
type
status
date
slug
summary
tags
category
icon
password
Property

原理

从GBDT到XGBoost

作为GBDT的高效实现,XGBoost是一个上限特别高的算法,因此在算法竞赛中比较受欢迎。简单来说,对比原算法GBDT,XGBoost主要从下面三个方面做了优化:
  • 一是算法本身的优化:在算法的弱学习器模型选择上,对比GBDT只支持决策树,还可以直接很多其他的弱学习器。在算法的损失函数上,除了本身的损失,还加上了正则化部分。在算法的优化方式上,GBDT的损失函数只对误差部分做负梯度(一阶泰勒)展开,而XGBoost损失函数对误差部分做二阶泰勒展开,更加准确。算法本身的优化是重点也是难点
  • 二是算法运行效率的优化:对每个弱学习器,比如决策树建立的过程做并行选择,找到合适的子树分裂特征和特征值。在并行选择之前,先对所有的特征的值进行排序分组,方便前面说的并行选择。对分组的特征,选择合适的分组大小,使用CPU缓存进行读取加速。将各个分组保存到多个硬盘以提高IO速度
  • 三是算法健壮性的优化:对于缺失值的特征,通过枚举所有缺失值在当前节点是进入左子树还是右子树来决定缺失值的处理方式。算法本身加入了L1和L2正则化项,可以防止过拟合,泛化能力更强

XGBoost损失函数

在看XGBoost本身的优化内容前,先回顾下GBDT的回归算法迭代的流程,对于GBDT的第颗决策树,主要是走下面4步:

代码

 
 
LightGBM
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
LightGBM
microsoftUpdated Dec 27, 2023
LightGBM (Light Gradient Boosting Machine)是一个实现GBDT算法的框架,支持高效率的并行训练。
LightGBM在Higgs数据集上LightGBM比XGBoost快将近10倍,内存占用率大约为XGBoost的1/6,并且准确率也有提升。GBDT在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。尤其面对工业级海量的数据,普通的GBDT算法是不能满足其需求的。
LightGBM提出的主要原因就是为了解决GBDT在海量数据遇到的问题,让GBDT可以更好更快地用于工业实践。
 

LightGBM在哪些地方进行了优化 (区别XGBoost)?

  • 基于Histogram的决策树算法
  • 带深度限制的Leaf-wise的叶子生长策略
  • 直方图做差加速直接
Bagging与随机森林
type
status
date
slug
summary
tags
category
icon
password
Property

原理

bagging的原理

notion image
从上图可以看出,Bagging的弱学习器之间的确没有boosting那样的联系。它的特点在“随机采样”。那么什么是随机采样?
随机采样(bootsrap)就是从训练集里面采集固定个数的样本,但是每采集一个样本后,都将样本放回。也就是说,之前采集到的样本在放回后有可能继续被采集到。对于Bagging算法,一般会随机采集和训练集样本数一样个数的样本。这样得到的采样集和训练集样本的个数相同,但是样本内容不同。如果我们对有 个样本训练集做次的随机采样,则由于随机性, 个采样集各不相同。
注:这和GBDT的子采样是不同的。GBDT的子采样是无放回采样,而Bagging的子采样是放回采样。bootstap的目的是减少样本的方差(当然也有可能增加偏倚),重采后的分布比样本表现出的分布对于真实分布而言更稳定, 从而得到防止过拟合的目的。子采样的分布改变了原样本数据集的分布,准确说是更好的模拟了样本数据分布背后的真实分布。
 
 

代码

 
 
 
层次聚类
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
层次聚类hierarchical clustering (hierarchical cluster analysis or HCA )
层次聚类可以划分为两类:
  1. agglomerative Hierarchical clustering(AHC)自底向上,这里主要写的是这种方法
  1. divisive Hierarchical clustering 自顶向下,一开始所有数据为一类,每次把一个类分开,因为把类分开算法较为复杂,所以这种方法关注度不高,
 
step1:先让各个样本各自成一类,
step2:距离最近的两类合并成一个新类
step3:反复执行step2
step4:根据需要,或根据距离临界值(阈值)确定分类数和分类结果
 
K-Means聚类
type
status
date
slug
summary
tags
category
icon
password
Property

原理

K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛。K-Means算法有大量的优化变体方法,包括初始化优化K-Means++ ,距离计算优化elkan K-Means算法和大数据情况下的优化Mini Batch K-Means算法。
 

传统K-Means原理

K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。
如果用数据表达式表示,假设簇划分为 ,则目标是最小化平方误差
是簇的均值向量,有时也称为质心,表达式为:
 
 

代码

高斯混合模型GMM
type
status
date
slug
summary
tags
category
icon
password
Property
 
高斯混合模型(Gaussian Mixed Model,GMM)也是一种常见的聚类算法,与K均值算法类似,同样使用了EM算法进行迭代计算。高斯混合模型假设每个簇的数据都是符合高斯分布(正态分布)的,当前数据呈现的分布就是各个簇的高斯分布叠加在一起的结果。
 
 
notion image
notion image
第一张图是一个数据分布的样例,如果只用一个高斯分布来拟合图中的数据,图中所示的椭圆即为高斯分布的二倍标准差所对应的椭圆。直观来说,图中的数据明显分为两簇,因此只用一个高斯分布来拟和是不太合理的,需要推广到用多个高斯分布的叠加来对数据进行拟合。第二张图是用两个高斯分布的叠加来拟合得到的结果。这就引出了高斯混合模型,即用多个高斯分布函数的线形组合来对数据分布进行拟合。理论上,高斯混合模型可以拟合出任意类型的分布。
 
 
高斯混合模型的核心思想是,假设数据可以看作从多个高斯分布中生成出来 的。在该假设下,每个单独的分模型都是标准高斯模型,其均值 和方差 是待估计的参数。此外,每个分模型都还有一个参数 ,可以理解为权重或生成数据的概率。高斯混合模型的公式为:
通常并不能直接得到高斯混合模型的参数,而是观察到了一系列数据点,给出一个类别的数量K后,希望求得最佳的K个高斯分模型。因此,高斯混合模型的计算,便成了最佳的均值,方差、权重的寻找,这类问题通常通过 最大似然估计来求解。遗憾的是,此问题中直接使用最大似然估计,得到的是一 个复杂的非凸函数,目标函数是和的对数,难以展开和对其求偏导。
模糊C均值聚类
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
 
BIRCH聚类
type
status
date
slug
summary
tags
category
icon
password
Property

原理

BIRCH概述

BIRCH的全称是利用层次方法的平衡迭代规约和聚类(Balanced Iterative Reducing and Clustering Using Hierarchies)。BIRCH只需要单遍扫描数据集就能进行聚类,那它是怎么做到的呢?
BIRCH算法利用了一个树结构来帮助我们快速的聚类,这个数结构类似于平衡B+树,一般将它称之为聚类特征树(Clustering Feature Tree,CF Tree)。这颗树的每一个节点是由若干个聚类特征(Clustering Feature,CF)组成。从下图可以看看聚类特征树是什么样子的:每个节点包括叶子节点都有若干个CF,而内部节点的CF有指向孩子节点的指针,所有的叶子节点用一个双向链表链接起来。
notion image
 

聚类特征CF与聚类特征树CF Tree

在聚类特征树中,一个聚类特征CF是这样定义的:每一个CF是一个三元组,可以用(N,LS,SS)表示。其中N代表了这个CF中拥有的样本点的数量;LS代表了这个CF中拥有的样本点各特征维度的和向量,SS代表了这个CF中拥有的样本点各特征维度的平方和。
如下图,在CF Tree中的某一个节点的某一个CF中,有下面5个样本。则它对应的N=5, LS=, SS =
notion image
 

代码