重要blog
基础概念问题
Q1.分类和回归到区别
知乎回答一:
回归和分类的根本区别在于输出空间是否为一个度量空间
CSDN回答二:
从根本上说,分类是关于预测标签,而回归是关于预测数量。
回归问题和分类问题本质上都要建立一个映射关系
f ( x ) − > y , x ∈ A , y ∈ B f(x)->y, x\in{A}, y\in{B} f(x)−>y,x∈A,y∈B
1.回归问题的应用场景
回归问题通常是用来预测一个值,如预测房价、未来的天气情况等等,例如一个产品的实际价格为500元,通过回归分析预测值为499元,我们认为这是一个比较好的回归分析。一个比较常见的回归算法是线性回归算法(LR)。另外,回归分析用在神经网络上,其最上层是不需要加上softmax函数的,而是直接对前一层累加即可。回归是对真实值的一种逼近预测。
2.分类问题的应用场景
分类问题是用于将事物打上一个标签,通常结果为离散值。例如判断一幅图片上的动物是一只猫还是一只狗,分类通常是建立在回归之上,分类的最后一层通常要使用softmax函数进行判断其所属类别。分类并没有逼近的概念,最终正确结果只有一个,错误的就是错误的,不会有相近的概念。最常见的分类方法是逻辑回归,或者叫逻辑分类。
Q2. 为什么最后化目标函数都是使用梯度下降(上升)法
通过代价函数对参数求导,令其为零,得出参数为:
参数的结果给出两个信息,同时也是直接求导不可行的原因:
- X的转置乘以X必须要可逆,也就是X必须可逆,但是实际情况中并不一定都满足这个条件,因此直接求导不可行;
- 假设满足了上述条件,那么就需要去求X的转置乘以X这个整体的逆,线性代数中给出了求逆矩阵的方法,是非常复杂的(对计算机来说就是十分消耗性能的),数据量小时,还可行,一旦数据量大,计算机求矩阵的逆将会是一项非常艰巨的任务,消耗的性能以及时间巨大,而在机器学习中,数据量少者上千,多者上亿;因此直接求导不可行。
Q3. 梯度下降法
损失函数的直观理解
假设上述
J
(
θ
0
,
θ
1
)
J(\theta_{0},\theta_{1})
J(θ0,θ1)中
θ
0
\theta_{0}
θ0为0,那么随和
θ
1
\theta_{1}
θ1的变化我们可以得到下面左图所示的拟合曲线,那么随着参数的变化,损失函数的值也会改变。例如我们取
θ
1
\theta_{1}
θ1为0,那么损失函数就是2.3;取
θ
1
\theta_{1}
θ1为1,那么损失函数就是0。损失函数就如下图中右图所示。
如果我们把
θ
0
\theta_{0}
θ0也加入,整个的损失函数就如下图所示。我们的目标就是找出全局最小值。也就是下面这个三维图形的最凹点。
其等高线图就如下图中的右图所示
梯度下降法
梯度下降算法背后的原理:目标函数
J
(
θ
)
J(\theta)
J(θ) 关于参数
θ
\theta
θ 的梯度将是损失函数(loss function)上升最快的方向。而我们要最小化loss,只需要将参数沿着梯度相反的方向前进一个步长,就可以实现目标函数(loss function)的下降。这个步长
η
\eta
η 又称为学习速率。参数更新公式如下:
θ
=
θ
←
θ
−
η
⋅
∇
J
(
θ
)
\theta=\theta\leftarrow \theta-\eta \cdot \nabla J(\theta)
θ=θ←θ−η⋅∇J(θ)
其中
∇
J
(
θ
)
\nabla J(\theta)
∇J(θ) 是参数的梯度.
自适应梯度下降法
每一个参数都有一个自己的学习率并且随着训练的进行,该学习率也在不断的改变中
Q4. 如何理解交叉熵以及交叉熵损失函数
二分类交叉熵损失函数公式
针对所有样本的损失函数
L
=
−
1
N
∑
i
=
1
N
[
y
i
l
o
g
(
h
θ
(
x
i
)
)
+
(
1
−
y
i
)
l
o
g
(
1
−
h
θ
(
x
i
)
)
]
L=-\frac{1}{N}\sum{_{i=1}^N} [y_{i}log(h_{\theta}(x_i)) + (1-y_{i})log(1-h_{\theta}(x_i))]
L=−N1∑i=1N[yilog(hθ(xi))+(1−yi)log(1−hθ(xi))]
针对单个样本的损失函数
L = − y l o g ( h θ ( x ) ) − ( 1 − y ) l o g ( 1 − h θ ( x ) ) ] L= -ylog(h_{\theta}(x)) - (1-y)log(1-h_{\theta}(x))] L=−ylog(hθ(x))−(1−y)log(1−hθ(x))]
多分类交叉熵损失函数
L
=
1
N
∑
i
L
i
=
1
N
[
−
∑
c
=
1
M
y
i
c
l
o
g
(
h
θ
(
x
i
c
)
)
]
L = \frac{1}{N}\sum{_i}L_{i}=\frac{1}{N}[-\sum{_{c=1}^M}y_{ic}log(h_{\theta}(x_{ic}))]
L=N1∑iLi=N1[−∑c=1Myiclog(hθ(xic))]
其中M是类别的数量
Q5. 代价函数,损失函数,目标函数
- 损失函数是针对单个样本的,代价函数是针对所有的样本。因此损失函数是代价函数的一部分
- 目标函数(Object Function)定义为:最终需要优化的函数。等于经验风险+结构风险(也就是Cost Function + 正则化项)。
Q6. 极大似然估计
极大似然估计,通俗理解来说,就是利用已知的样本结果信息,反推最具有可能(最大概率)导致这些样本结果出现的模型参数值!换句话说,极大似然估计提供了一种给定观察数据来评估模型参数的方法,即:“模型已定,参数未知”。
对于这个函数:
P
(
x
∣
θ
)
P(x|θ)
P(x∣θ)
输入有两个:x表示某一个具体的数据;θ表示模型的参数。
- 如果θ是已知确定的,x是变量,这个函数叫做概率函数(probability function),它描述对于不同的样本点x,其出现概率是多少。
- 如果x是已知确定的,θ是变量,这个函数叫做似然函数(likelihood function), 它描述对于不同的模型参数,出现x这个样本点的概率是多少。
最大似然估计(MLE)
MLE的目标是找出一组参数,使得模型产生出观测数据的概率最大
这是一个统计问题,回想一下,解决统计问题需要什么? 数据!
于是我们拿这枚硬币抛了10次,得到的数据(
x
0
x_0
x0)是:反正正正正反正正正反。我们想求的正面概率θ是模型参数,而抛硬币模型我们可以假设是二项分布。
那么,出现实验结果
x
0
x_0
x0(即反正正正正反正正正反)的似然函数是多少呢?
f
(
x
0
,
θ
)
=
(
1
−
θ
)
×
θ
×
θ
×
θ
×
θ
×
(
1
−
θ
)
×
θ
×
θ
×
θ
×
(
1
−
θ
)
=
θ
7
(
1
−
θ
)
3
=
f
(
θ
)
f(x_0 ,\theta) = (1-\theta)\times\theta\times\theta\times\theta\times\theta\times(1-\theta)\times\theta\times\theta\times\theta\times(1-\theta) = \theta ^ 7(1 - \theta)^3 = f(\theta)
f(x0,θ)=(1−θ)×θ×θ×θ×θ×(1−θ)×θ×θ×θ×(1−θ)=θ7(1−θ)3=f(θ)
注意,这是个只关于θ的函数。而最大似然估计,顾名思义,就是要最大化这个函数.
第一章:统计学习方法概述
1.5 正则化和交叉验证
1.8 精确率 ( P ) (P) (P) / 召回率 ( R ) (R) (R) / F1值
举例子说明:
解释一:
假设一共有10篇文章,里面4篇是你要找的。根据你某个算法,你认为其中有5篇是你要找的,但是实际上在这5篇里面,只有3篇是真正你要找的。那么你的这个算法的precision是3/5=60%,也就是,你找的这5篇,有3篇是真正对的这个算法的recall是3/4=75%,也就是,一共有用的这4篇里面,你找到了其中三篇。
解释二:
准确率(P值)
假设我此时想吃香蕉,实验室里面每天都会安排10个水果,水果种类分别是6个香蕉,3个橘子,1个菠萝。哎,但是,实验室主任搞事情啊,为了提高我们吃水果的动力与趣味,告诉我们10个水果放在黑盒子中,每个人是看不到自己拿的什么,每次拿5个出来,哎,我去抽了,抽出了2个香蕉,2个橘子,1个菠萝。
下面我们来分别求求P值,R值,F值。按照一开始说的,精确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。这里我们的正样本就是我想吃的香蕉!
在预测结果中,有2个香蕉,总个数是我拿的5个,那么P值计算如下:
P
=
2
/
5
P = 2 / 5
P=2/5
召回率(R值)
召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。我们这里的正类是我想吃的香蕉,而在样本中的香蕉个数是6个,召回率的召回也可以这么理解,代表了,原始样本中正类召回了多少。R值计算如下:
R
=
2
/
6
R = 2 / 6
R=2/6
分母已经变成了样本中香蕉的个数啦
F值
可能很多人就会问了,有了召回率和准确率这俩个评价指标后,不就非常好了,为什么要有F值这个评价量的存在呢?
按照高中语文老师所说的,存在即合理的说法,既然F值存在了,那么一定有它存在的必要性,我们在评价的时候,当然是希望检索结果Precision越高越好,同时Recall也越高越好,但事实上这两者在某些情况下有矛盾的。比如极端情况下,在我们这个例子中,我们只搜索出了一个结果,且是香蕉,那么Precision就是100%,但是Recall为1/6就很低;而如果我们抽取10个水果,那么比如Recall是100%,但是Precision为6/10,相对来说就会比较低。
因此P和R指标有时候会出现的矛盾的情况,这样就需要综合考虑他们,最常见的方法就是F-Measure,通过计算F值来评价一个指标!
我这里给出最常见的F1计算方法,如下:
F
1
=
(
2
∗
P
∗
R
)
/
(
P
+
R
)
F1 = (2*P*R) / (P+R)
F1=(2∗P∗R)/(P+R)那么在我们这个例子中
F
1
=
(
2
∗
2
/
5
∗
2
/
6
)
/
(
2
/
5
+
2
/
6
)
F1 = (2*2/5*2/6)/(2/5+2/6)
F1=(2∗2/5∗2/6)/(2/5+2/6)
解释三:
假设我们手上有60个正样本,40个负样本,我们要找出所有的正样本,系统查找出50个,其中只有40个是真正的正样本,计算上述各指标。
TP: 将正类预测为正类数 40
FN: 将正类预测为负类数 20
FP: 将负类预测为正类数 10
TN: 将负类预测为负类数 30
准确率(accuracy) = 预测对的/所有 = (TP+TN)/(TP+FN+FP+TN) = 70%
精确率(precision) = TP/(TP+FP) = 80%
召回率(recall) = TP/(TP+FN) = 2/3
偏差与方差(bias-variance)
偏差与方差是解释泛化性的一种重要工具。偏差用来衡量模型的拟合能力,方差用来衡量一个模型是否容易过拟合。
第三章 K近邻算法
3.1 K近邻算法示例
kNN算法的核心思想是用距离最近的k个样本数据的分类来代表目标数据的分类。
- 当k=3时,距离最近的3个样本在实线内,具有2个红色三角和1个蓝色正方形,因此将它归为红色三角。
- 当k=5时,距离最近的5个样本在虚线内,具有2个红色三角和3个蓝色正方形,因此将它归为蓝色正方形。
此算法并没有损失函数,也不存在训练的问题,只是一个规则算法。看代码比较清楚。
3.2 K紧邻的算法思想
1.我们提出了k近邻算法,算法的核心思想是,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中。更通俗说一遍算法的过程,来了一个新的输入实例,我们算出该实例与每一个训练点的距离(这里的复杂度为0(n)比较大,所以引出了下文的kd树等结构),然后找到前k个,这k个哪个类别数最多,我们就判断新的输入实例就是哪类!
2.与该实例最近邻的k个实例,这个最近邻的定义是通过不同距离函数来定义,我们最常用的是欧式距离。
3.为了保证每个特征同等重要性,我们这里对每个特征进行归一化。
4.k值的选取,既不能太大,也不能太小,何值为最好,需要实验调整参数确定!
第四章 朴素贝叶斯算法
4.1 贝叶斯公式
贝叶斯公式:
换种解释:
朴素贝叶斯中的“朴素”的由来:因为朴素贝叶斯算法要求特征之间独立。
算法流程:
4.2 一个例子
如何求下面这个概率
根据朴素贝叶斯公式(要求特征之间相互独立),我们有:
根据上述的数据分布,我们就可以求出来在上述条件下“嫁”或者“不嫁的概率”,然后由此做分类
第五章 决策树
决策树算法采用树形结构,使用层层推理来实现最终的分类。决策树由下面几种元素构成:
- 根节点:包含样本的全集
- 内部节点:对应特征属性测试
- 叶节点:代表决策的结果
预测时,在树的内部节点处用某一属性值进行判断,根据判断结果决定进入哪个分支节点,直到到达叶节点处,得到分类结果。
例子
生成决策树的三个步骤:
- 特征选择
根据信息增益值选择依据特征进行判断 - 决策树生成
选择好特征后,就从根节点触发,对节点计算所有特征的信息增益,选择信息增益最大的特征作为节点特征,根据该特征的不同取值建立子节点;对每个子节点使用相同的方式生成新的子节点,直到信息增益很小或者没有特征可以选择为止。 - 剪枝
剪枝的主要目的是对抗过拟合,通过主动去掉部分分支来降低过拟合的风险。
三种典型的决策树算法:
1. ID3 算法
ID3 是最早提出的决策树算法,他就是利用信息增益来选择特征的。
2. C4.5 算法
他是 ID3 的改进版,他不是直接使用信息增益,而是引入“信息增益比”指标作为特征的选择依据。
3. CART(Classification and Regression Tree)
这种算法即可以用于分类,也可以用于回归问题。CART 算法使用了基尼系数取代了信息熵模型。
决策树的优缺点
优点
- 决策树易于理解和解释,可以可视化分析,容易提取出规则;
- 可以同时处理标称型和数值型数据;
- 比较适合处理有缺失属性的样本;
- 能够处理不相关的特征;
- 测试数据集时,运行速度比较快;
- 在相对短的时间内能够对大型数据源做出可行且效果良好的结果。
缺点
- 容易发生过拟合(随机森林可以很大程度上减少过拟合);
- 容易忽略数据集中属性的相互关联;
- 对于那些各类别样本数量不一致的数据,在决策树中,进行属性划分时,不同的判定准则会带来不同的属性选择倾向;信息增益准则对可取数目较多的属性有所偏好(典型代表ID3算法),而增益率准则(CART)则对可取数目较少的属性有所偏好,但CART进行属性划分时候不再简单地直接利用增益率尽心划分,而是采用一种启发式规则)(只要是使用了信息增益,都有这个缺点,如RF)。
- ID3算法计算信息增益时结果偏向数值比较多的特征。
5.5 决策树的预剪枝和后剪枝
如何判断是否要预剪枝?
- 把数据集划分为训练集和验证集。
- 根据信息增益(或者信息增益比)选择划分特征
- 利用验证集计算根据此特征进行划分前后的整棵决策树的精确度。如果上升则剪枝,如果下降则不剪枝。
如何判断是否要预剪枝?
对生成的完整的决策树,也是利用验证集判断剪纸前后整棵二叉树的准确度是否有提升。如果有提升就进行剪枝,否则则保留。
总结:对比预剪枝和后剪枝,能够发现,后剪枝决策树通常比预剪枝决策树保留了更多的分支,一般情形下,后剪枝决策树的欠拟合风险小,泛华性能往往也要优于预剪枝决策树。但后剪枝过程是在构建完全决策树之后进行的,并且要自底向上的对树中的所有非叶结点进行逐一考察,因此其训练时间开销要比未剪枝决策树和预剪枝决策树都大得多。
5.2 特征选择
通常特征选择选择的准则是信息增益或者信息增益比。
什么是熵?
什么是条件熵?
信息增益表示得知特征X的信息而使得类Y的不确定性减少的程度。
信息增益的算法:
信息增益比:
5.4 决策树的剪枝
在决策树学习的过程中对生成的决策树进行简化的过程称为剪枝。
1. 集成学习
1. 集成学习概述
1.1 集成学习概述
集成学习在机器学习算法中具有较高的准去率,不足之处就是模型的训练过程可能比较复杂,效率不是很高。目前接触较多的集成学习主要有2种:基于Boosting的和基于Bagging,前者的代表算法有Adaboost、GBDT、XGBOOST、后者的代表算法主要是随机森林。
1.2 集成学习的主要思想
集成学习的主要思想是利用一定的手段学习出多个分类器,而且这多个分类器要求是弱分类器,然后将多个分类器进行组合公共预测。核心思想就是如何训练处多个弱分类器以及如何将这些弱分类器进行组合。
1.3 集成学习中弱分类器选择
一般采用弱分类器的原因在于将误差进行均衡,因为一旦某个分类器太强了就会造成后面的结果受其影响太大,严重的会导致后面的分类器无法进行分类。常用的弱分类器可以采用误差率小于0.5的,比如说逻辑回归、SVM、神经网络。
2. 随机森林
随机森林属于bagging算法的一种, 他的原理就是构建大量的决策树,在进行预测的时候会由这些决策树得到多个预测结果。选择这些结果中的众数来作为最后的预测结果。
随机森林的构建算法:
- 假如有N个样本,则有放回的随机选择N个样本(每次随机选择一个样本,然后返回继续选择)。这选择好了的N个样本用来训练一个决策树,作为决策树根节点处的样本。
- 当每个样本有M个属性时,在决策树的每个节点需要分裂时,随机从这M个属性中选取出m个属性,满足条件m << M。然后从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的分裂属性。
- 决策树形成过程中每个节点都要按照步骤2来分裂(很容易理解,如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。一直到不能够再分裂为止。注意整个决策树形成过程中没有进行剪枝。
- 按照步骤1~3建立大量的决策树,这样就构成了随机森林了。
随机森林的优缺点
优点
- 它可以出来很高维度(特征很多)的数据,并且不用降维,无需做特征选择
- 它可以判断特征的重要程度
- 可以判断出不同特征之间的相互影响
- 不容易过拟合
- 训练速度比较快,容易做成并行方法
- 实现起来比较简单
- 对于不平衡的数据集来说,它可以平衡误差。
- 如果有很大一部分的特征遗失,仍可以维持准确度。
缺点
- 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合。
- 对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的
3. GBDT算法原理
首先明确一点,GBDT中拟合的是负梯度而不是残差,只不过损失函数采用平方损失时,负梯度恰好就是残差。
References
为什么提出了GBDT?
提升树利用加法模型与前向分歩算法实现学习的优化过程。当损失函数是平方误差损失函数和指数损失函数时,每一步优化是很简单的。但对一般损失函数而言,往往每一步优化并不那么容易。针对这一问题,Freidman提出了梯度提升(gradient boosting)算法。Gradient Boosting是Boosting中的一大类算法,它的思想借鉴于梯度下降法,其基本原理是根据当前模型损失函数的负梯度信息来训练新加入的弱分类器,然后将训练好的弱分类器以累加的形式结合到现有模型中。采用决策树作为弱分类器的Gradient Boosting算法被称为GBDT.
3.1 Decision Tree: CART回归树
CART回归树的原理以及实现:https://blog.csdn.net/xierhacker/article/details/64439601
首先,GBDT使用的决策树是CART回归树,无论是处理回归问题还是二分类以及多分类,GBDT使用的决策树通通都是都是CART回归树。为什么不用CART分类树呢?因为GBDT每次迭代要拟合的是梯度值,是连续值所以要用回归树。
对于回归树算法来说最重要的是寻找最佳的划分点,那么回归树中的可划分点包含了所有特征的所有可取的值。在分类树中最佳划分点的判别标准是熵或者基尼系数,都是用纯度来衡量的,但是在回归树中的样本标签是连续数值,所以再使用熵之类的指标不再合适,取而代之的是平方误差,它能很好的评判拟合程度。
回归树生成算法
输入: 训练数据集
D
D
D.
输出:回归树
f
(
x
)
f(x)
f(x).
在训练数据集所在的输入空间中,递归的将每个区域划分为两个子区域并决定每个子区域上的输出值,构成二叉决策树:
3.2 Gradient Boosting:拟合负梯度
梯度提升树(Gradient Boosting)是提升树(Boosting Tree)的一种改进算法,所以在讲梯度提升树之前先来说一下提升树。
先来个通俗理解:假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。最后将每次拟合的岁数加起来便是模型输出的结果。
————————————————
提升树算法:
- 初始化 f 0 ( x ) = 0 f_{0}(x) = 0 f0(x)=0
- 对
m
=
1
,
2
,
.
.
.
,
M
m=1,2,...,M
m=1,2,...,M
2.1 计算残差 r m i = y i − f m − 1 ( x ) , i = 1 , 2 , . . . , N r_{mi} = y_{i}-f_{m-1}(x), i=1,2,..., N rmi=yi−fm−1(x),i=1,2,...,N
2.2 拟合残差 r m i r_{mi} rmi学习一个回归树,得到 h m ( x ) h_{m}(x) hm(x)(这里拟合残差就是拟合梯度)
2.3 更新 f m ( x ) = f m − 1 + h m ( x ) f_{m}(x) = f_{m-1} + h_{m}(x) fm(x)=fm−1+hm(x) - 得到回归问题的提升树 f M ( x ) = ∑ m = 1 M h m ( x ) f_{M}(x) = \sum{_{m=1}^M}h_{m}(x) fM(x)=∑m=1Mhm(x)
上述问题中的残差是什么?
残差就是梯度
是当前模型拟合数据的残差(residual)所以,对于提升树来说只需要简单地拟合当前模型的残差。
3.3 GBDT算法
将Decision Tree和Gradient Boosting介绍完了,将这两部分组合在一起就是我们的GBDT了。
GBDT算法
-
初始化弱学习器 f 0 ( x ) = a r g m i n c ∑ i = 1 N L ( y i , c ) f_{0}(x) = arg min_{c}\sum{_{i=1}^N}L(y_{i},c) f0(x)=argminc∑i=1NL(yi,c)
-
对 m = 1 , 2 , . . . , M m=1,2,..., M m=1,2,...,M有:
待验证的理解:计算叶子区域的拟合值就是求其平均值 -
得到最终的学习器 f ( x ) = f M ( x ) = f 0 ( x ) + ∑ m = 1 M ∑ j = 1 J γ j m I ( x ∈ R j m ) f(x)=f_{M}(x)=f_{0}(x)+\sum{_{m=1}^M}\sum{_{j=1}^J}\gamma_{jm}I(x\in R_{jm}) f(x)=fM(x)=f0(x)+∑m=1M∑j=1JγjmI(x∈Rjm)
下面是GDBT的一个简单例子:判断用户是否会喜欢电脑游戏,特征有年龄,性别和职业。需要注意的是,GBDT无论是用于分类和回归,采用的都是回归树,分类问题最终是将拟合值转换为概率来进行分类的。
在上图中,每个用户的最后的拟合值为两棵树的结果相加。
模型公式推导
Gradient Boosting是Friedman提出的一套框架。其思想类似于数值优化中梯度下降求参方法,参数沿着梯度的负方向以小步长前进,最终逐步逼近参数的局部最优解。在GB中模型每次拟合残差,逐步逼近最终结果。
GBDT和泰勒一阶展开式的关系
3.4 个人总结
- GBDT就是梯度提升和提升树的结合。提升树本身就是对残差做拟合,但是由于GBDT中利用平方损失做损失函数,平方损失求导后(也就是梯度)就是残差,所以就利用回归树对残差做拟合,也就相当于对梯度做拟合。
如果利用的是其他损失函数,在求导后也近似为残差。 - GBDT在生成每一个回归树时都需要对叶结点(或者称为域)中的值做一个最佳拟合,也就是该节点的最佳输出值,这里就是对该叶结点中的数据对应的label取一个平均数。
- 为了防止过拟合,在GBDT中用到了Shrinkage–缩减,循序渐进:
Shrinkage的思想强调的是循序渐进,就好比不能一口吃出一个胖子。每次迭代只走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。在参考博文一中使用了这个技巧。也就是最后的强学习构造中给予了后面学到的每棵树一个权重。 f M ( x ) = f 0 ( x ) + l r ∗ ∑ i = 1 M ∑ j = 1 N T ( x , θ ) f_{M}(x) = f_{0}(x) + lr*\sum{_{i=1}^M}\sum{_{j=1}^N}T(x,\theta) fM(x)=f0(x)+lr∗∑i=1M∑j=1NT(x,θ)
3.5 可能的问题
Q1. GBDT为什么是拟合负梯度
GBDT本身就是一个回归算法,回归算法的本质就是最小化损失函数,而最小化损失函数的本质又是梯度下降。这里采用平方差和作为损失函数,其求导正好是残差,所以就相当于是利用提升树来集合残差。
Q2. 在GBDT中为什么使用泰勒公式推导梯度下降算法
泰勒公式推导只是一种方法
Q3. GBDT和提升树区别
提升树模型每一次的提升都是靠上次的预测结果与训练数据的label值差值作为新的训练数据进行重新训练,由于原始的回归树指定了平方损失函数所以可以直接计算残差,而梯度提升树针对一般损失函数,所以采用负梯度来近似求解残差,将残差计算替换成了损失函数的梯度方向,将上一次的预测结果带入梯度中求出本轮的训练数据。这两种模型就是在生成新的训练数据时采用了不同的方法。
3.6 GBDT拟合的为什么是负梯度
优化目标函数:
∑
i
=
1
N
L
(
y
i
,
h
m
−
1
(
x
i
)
+
f
m
(
x
i
)
)
\sum{_{i=1}^N}L(y_{i},h_{m-1}(x_{i})+f_{m}(x_{i}))
∑i=1NL(yi,hm−1(xi)+fm(xi))
最小化上述目标函数,也就是每添加一个弱分类器就使得损失函数下降一部分。利用泰勒公式对上述问题进行近似来回答为什么GBDT拟合的是负梯度
L
(
y
i
,
h
m
−
1
(
x
i
)
+
f
m
(
x
i
)
)
=
L
(
y
i
,
h
m
−
1
(
x
i
)
)
+
∂
L
(
y
i
,
f
m
−
1
(
x
i
)
)
∂
(
f
m
−
1
(
x
)
)
∗
f
m
(
x
i
)
L(y_{i},h_{m-1}(x_{i})+f_{m}(x_{i})) = \\L(y_{i},h_{m-1}(x_{i}))+ \frac{\partial{L(y_{i},f_{m-1}(x_{i}))}}{\partial(f_{m-1}(x))}*f_{m}(x_{i})
L(yi,hm−1(xi)+fm(xi))=L(yi,hm−1(xi))+∂(fm−1(x))∂L(yi,fm−1(xi))∗fm(xi)
当
f
m
(
x
i
)
=
−
∂
L
(
y
i
,
f
m
−
1
(
x
i
)
)
∂
(
f
m
−
1
(
x
)
)
f_{m}(x_{i}) = -\frac{\partial{L(y_{i},f_{m-1}(x_{i}))}}{\partial(f_{m-1}(x))}
fm(xi)=−∂(fm−1(x))∂L(yi,fm−1(xi))则肯定有
L
(
y
i
,
h
m
−
1
(
x
i
)
+
f
m
(
x
i
)
)
<
L
(
y
i
,
h
m
−
1
(
x
i
)
)
L(y_{i},h_{m-1}(x_{i})+f_{m}(x_{i})) <L(y_{i},h_{m-1}(x_{i}))
L(yi,hm−1(xi)+fm(xi))<L(yi,hm−1(xi))
也就是利用新的弱分类器取拟合当前损失函数的负梯度就会使得整个损失函数不断减小。当损失函数是平方损失的时候,负梯度就是残差,也就是说拟合残差是GBDT中的一种特殊情况。
关于GBDT中优化目标损失函数的另一种解释
4. XGBoost算法
1.Python机器学习笔记:XgBoost算法
2. XGBoost和GBDT的不同
3. XGBoost的详细公式推导
4. 目前看到的对XGBoost最好的解读
5. 20道XGBoost面试题
4.1 XGBoost和GBDT的区别
- 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
- 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
- xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
- 列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
- 对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
- xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
- 可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。
4.2 XGBoost详解
目标函数
其中正则项控制着模型的复杂度,包括了叶子节点数目T和leaf score的L2模的平方:
4.3 XGBoost和GBDT介绍
XGboost和GBDT是boosting算法的一种,XGBoost其本质上还是一个GBDT的工程实现,但是力争把速度和效率发挥到极致。
GBDT算法本身也是一种加法模型,是对提升树一种优化。他使得boosting算法可以拓展到应对任何损失函数类别。理论中,针对GBDT的损失函数做了一个一阶泰勒近似,一阶泰勒近似的结果就是一个一阶导数,也就是梯度。因此本质上GBDT是对损失函数的负梯度的一个拟合,当损失函数采用均方误差损失的时候,GBDT拟合的负梯度就是残差。在这个过程中,GBDT使用的基分类器是CART回归树。
对于XGBoost,是GBDT的一种优化。但是相对GBDT, XGBoot主要在以下几个方面做了优化:
- XGBoost的基分类器不仅支持CART回归树还支持线性分类器,并且XGBoot在其损失函数中添加了正则化项来控制模型的复杂度,正则化化项里面是包含了树的叶子节点个数。
- 在推导中,XGboost是对损失函数做了二阶泰勒近似,相对GBDT,XGBoost是使用了一阶和二阶两个信息。
- XGBoost借鉴了随机森林的做法,支持列抽样,这样不仅可以防止过拟合还可以降低计算量。
- XGBoot是支持并行的,这也是最主要优于GBDT的一点。XGBoost的并行并不是体现在tree的粒度上,而是体现在特征的粒度上。决策树学习最耗时的一个步骤就是对特征的排序,因为要确定最佳的分割点。但是XGBoost在训练之前预先对数据进行排序,然后保存为block结构,后面的迭代中重复使用这个结构,这就大大减少了计算量。在进行节点的分裂时,要计算每个特征的增益,最后选择大的增益去做分类,那么这里就可以开多线程来进行特征的增益计算。
为什么要使用二阶导数信息:
二阶信息本身就能让梯度收敛更快更准确
5. LightGBM算法
6. Adaboost, GBDT个XGBoost的区别
AdaBoos VS GBDT
Adaboost和GBDT模型都可以表示成:
F
(
x
)
=
∑
m
=
1
M
γ
m
h
m
(
x
)
F(x) = \sum{_{m=1}^M}\gamma_{m}h_{m}(x)
F(x)=∑m=1Mγmhm(x)
的形式。== AdaBoost ==在训练完一个
h
m
h_{m}
hm后会重新赋值样本的权重:分类错误的样本的权重会增大,而分类正确的样本的权重会减小。这样在训练
h
m
+
1
h_{m+1}
hm+1时会侧重对错误样本的训练,来提升模型的性能。但是Adaboot模型每个基分类器的损失函数优化目标是相同且独立的,都最优化当前样本(样本权重)的指数损失。
GBDT虽然也是一个加性模型,但是其通过不断的迭代拟合样本真实值与当前分类器的残差
y
−
y
^
h
m
−
1
y-\hat{y}_{h_{m-1}}
y−y^hm−1来逼近真实值,按照这个思路,第m个基分类器的预测结果为:
F
m
(
x
)
=
F
m
−
1
(
x
)
+
γ
m
h
m
(
x
)
F_{m}(x) = F_{m-1}(x)+\gamma_{m}h_{m}(x)
Fm(x)=Fm−1(x)+γmhm(x)
而
h
m
(
x
)
h_{m}(x)
hm(x)的优化目标就是最小化当前预测结果
F
m
−
1
(
x
i
)
+
h
(
x
i
)
F_{m-1}(x_{i})+h(x_{i})
Fm−1(xi)+h(xi)和
y
i
y_{i}
yi之间的差距。
h
m
=
a
r
g
m
i
n
h
∑
i
=
1
n
L
(
y
i
,
F
m
−
1
(
x
i
)
+
h
(
x
i
)
)
h_{m} = argmin_{h}\sum{_{i=1}^{n}}L(y_{i},F_{m-1}(x_{i})+h(x_{i}))
hm=argminh∑i=1nL(yi,Fm−1(xi)+h(xi))
GBDT VS XGBoost
如果不考虑工程实现、解决问题上的一些差异,xgboost与gbdt比较大的不同就是目标函数的定义。
XGBoot采用的是二阶泰勒展开式,GBDT采用的是一阶泰勒展开式。
注:红色箭头指向的l即为损失函数;红色方框为正则项,包括L1、L2;红色圆圈为常数项。xgboost利用泰勒展开三项,做一个近似,我们可以很清晰地看到,最终的目标函数只依赖于每个数据点的在误差函数上的一阶导数和二阶导数。
GBDT和提升树的区别
**对于梯度提升树,其学习流程与提升树类似只是不再使用残差作为新的训练数据而是使用损失函数的梯度作为新的新的训练数据的y值。**但是如果GBDT采用平方损失作为损失函数,其梯度就又是残差。
第六章 逻辑斯谛回归和最大熵模型
第七章 支持向量机
函数间隔
几何间隔
函数间隔决定了数据点被分为某一类的确信度,而几何间隔实际上就是点到(超)平面的距离。两者是一个||w||的线性关系。那些支持向量就是函数间隔(也可以说是几何间隔,因为作了归一化限制)的临界点。有了支持向量,就可以对未知点进行预测
7.1 线性可分问题
7.2 线性不可分问题
7.3 非线性问题
7.4损失函数
SVM的损失函数就是合页损失函数加上正则化项:
第八章 提升算法
把Adaboost和以指数函数为损失函数的加法模型等价,也就得到了Adaboost算法中的样本权重和分类器权重的更新公式。
8.1 Adaboost原理
8.1.1 什么是Adaboost
AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由Yoav Freund和Robert Schapire在1995年提出。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。
整个Adaboost 迭代算法就3步:
- 初始化训练数据的权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N。
- 训练弱分类器。具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被降低;相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
- 将各个训练得到的弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
8.1.2 Adaboost算法流程
给定一个训练数据集T={(x1,y1), (x2,y2)…(xN,yN)},yi属于标记集合{-1,+1},Adaboost的目的就是从训练数据中学习一系列弱分类器或基本分类器,然后将这些弱分类器组合成一个强分类器。
Adaboost的算法流程如下:
步骤1. 首先,初始化训练数据的权值分布。每一个训练样本最开始时都被赋予相同的权值:1/N。
步骤2. 进行多轮迭代,用m = 1,2, …, M表示迭代的第多少轮
a. 使用具有权值分布Dm的训练数据集学习,得到基本分类器(选取让误差率最低的阈值来设计基本分类器):
b. 计算Gm(x)在训练数据集上的分类误差率
由上述式子可知,Gm(x)在训练数据集上的误差率em就是被Gm(x)误分类样本的权值之和。
c. 计算Gm(x)的系数,am表示Gm(x)在最终分类器中的重要程度(目的:得到基本分类器在最终分类器中所占的权重。注:这个公式写成
α
m
=
1
/
2
l
n
(
(
1
−
e
m
)
/
e
m
)
\alpha_m=1/2ln((1-e_m)/e_m)
αm=1/2ln((1−em)/em)更准确,因为底数是自然对数e,故用In,写成log容易让人误以为底数是2或别的底数,下同):
由上述式子可知,
e
m
<
=
1
/
2
e_m <= 1/2
em<=1/2时,
α
m
>
=
0
\alpha_m >= 0
αm>=0,且
α
m
\alpha_m
αm随着
e
m
e_m
em的减小而增大,意味着分类误差率越小的基本分类器在最终分类器中的作用越大。
d. 更新训练数据集的权值分布(目的:得到样本的新的权值分布),用于下一轮迭代
使得被基本分类器Gm(x)误分类样本的权值增大,而被正确分类样本的权值减小。就这样,通过这样的方式,AdaBoost方法能“重点关注”或“聚焦于”那些较难分的样本上。
其中,Zm是规范化因子,使得Dm+1成为一个概率分布:
步骤3. 组合各个弱分类器
从而得到最终分类器,如下:
总结
- 训练决策树桩(深度为1的决策树)
- 样本权重的计算
- 基分类器权重的计算
- 标定训练的分类器的个数或者错误率低于某一个阈值
- 与基于指数函数损失的加法模型等价,可以利用前者得到Adaboost的样本权重更新公式和基分类器权重更新公式。
第3章 线性模型(西瓜书)
3.1 基本形式
f
(
x
)
=
w
T
x
+
b
f(x) = w^Tx+b
f(x)=wTx+b
其中
w
=
w
1
,
w
2
,
.
.
.
,
w
d
w = {w_1, w_2,...,w_d}
w=w1,w2,...,wd。wjiao和b学习以后,模型就确定啦。
3.2 线性回归
线性回归试图学得
f
(
x
i
)
=
w
x
i
+
b
f(x_i) = wx_i + b
f(xi)=wxi+b
使得
f
(
x
i
)
=
y
i
f(x_i) = y_i
f(xi)=yi
利用均方误差衡量模型