原创不易,转载请注明出处
机器学习中关于解决回归问题的总结
注:以下线性回归中,均可采用梯度下降、最小二乘(交替)、牛顿法(拟牛顿)、坐标轴下降、正规方程解析解、最小角回归法 求得。下面整理只给出每个算法最常用的解法。
关于机器学习&深度学习中,损失、代价、目标、成本含义解释
注:如以下涉及到的用词错误,敬请谅解
百度百科
一元线性回归是分析只有一个自变量(自变量x和因变量y)线性相关关系的方法。一个经济指标的数值往往受许多因素影响,若其中只有一个因素是主要的,起决定性作用,则可用一元线性回归进行预测分析。
白话原理
形如: y = w x + b y = wx + b y=wx+b 。只有一个自变量和一个因变量的直线方程,目的是找到最优的回归系数w和偏置b,使得预测值 y ^ \hat y y^ 和真实值 y y y 的损失最小。
代价函数
均方误差:
J ( θ ) = 1 2 m ∑ i = 0 m ( y i − h θ ( x i ) ) 2 J(\theta) = \frac{1}{2m}\sum_{i = 0} ^m(y^i - h_\theta (x^i))^2 J(θ)=2m1i=0∑m(yi−hθ(xi))2
很多教材上给出的是误差平方和,其实都可以,无非就是分母不一样。这里均方根多除一个2是方便梯度下降求偏导。
求解方式
梯度下降,直观理解就是代价函数曲线上的“下山过程”,其实就是对代价函数求偏导。又分为批量梯度下降BGD
、小批量梯度下降MBGD
、随机梯度下降SGD
。
批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新。优点是一次迭代是对所有样本进行计算,可以利用矩阵并行计算。缺点是当样本数量级很大时,整个训练过程会非常慢。
小批量梯度下降是机器学习和深度学习最为常用的优化方法。是对BGD和SGD的一个折中。其思想是每次迭代使用batch_size
个样本来对参数进行更新。优点是通过矩阵运算,每次在一个batch
上优化参数并不会比单个数据慢太多。其次是每使用一个batch
可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。缺点就是batch_size
阈值的选择。
随机梯度下降是每次迭代使用一个样本来对参数进行更新。使得训练速度加快。优点是由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。缺点是准确度下降,由于单个样本并不能代表全体样本的趋势,所以很可能会局部最优甚至无法做到线性收敛。
优缺点 & 适用场景
百度百科
在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。因此多元线性回归比一元线性回归的实用意义更大。
白话原理
形如: y = w 1 x 1 + w 2 x 2 + w 3 x 3 … + b y = w_1x_1 + w_2x_2 + w_3x_3 \ldots + b y=w1x1+w2x2+w3x3…+b 。相比于一元线性回归,多元线性回归(即多变量回归)更加符合实际,因为我们实际需求大多都是多个特征的。同样的我们需要求解一组参数 w w w 和 偏置 b b b,来使得预测值和真实值的误差最小。当w转成向量后可得预测函数如下:
h ( x ) = w T x + b h(x) = w^Tx + b h(x)=wTx+b
注:很多文献上都喜欢用 θ θ θ 表示权重向量,即上述的 w w w
代价函数
均方误差
求解方式
梯度下降、最小二乘
最小二乘的思想就是求多元函数极值,说白了就是对各个 w w w求偏导然后使偏导为0。这样P个参数就对应P个方程需要求解,可以说计算量比较大。而梯度下降可以看做是更简单的一种求最小二乘法最后一步解方程 的方法。
关于最小二乘、梯度下降、牛顿法的总结:
https://cloud.tencent.com/developer/article/1433814
优缺点 & 适用场景
优点是不需要对数据进行归一化处理,原始数据进行计算参数,不存在量纲的问题。
缺点是计算复杂度较高,在特征比较多的时候,计算量很大。
百度百科
局部加权线性回归(Local Weights Linear Regression)也是一种线性回归。不同的是,普通线性回归是全局线性回归,使用全部的样本计算回归系数。而局部加权线性回归,通过引入权值(核函数),在预测的时候,只使用与测试点相近的部分样本来计算回归系数。
白话原理
线性回归的一个问题是有可能出现欠拟合,因为它求的是具有最小均方误差的无偏估计,欠拟合是无法达到我们想要的预测效果,所以有些方法允许在估计中引入一些偏差,从而降低预测的均方误差。局部线性加权的思想是对待预测点附近的每个点赋予一个权重,然后在带权的样本上基于最小均方误差来进行回归。
换句话说,在局部加权线性回归中,我们在预测前对于每个点都赋予一个权重,离需要预测点越近的点权重越大,反之权重越小。其它思想和多元线性回归基本一致,加权体现在代价函数上。
代价函数
J ( θ ) = 1 2 m ∑ i = 0 m w ( i , i ) ( y i − h θ ( x i ) ) 2 J(\theta) = \frac{1}{2m}\sum_{i = 0} ^mw_{(i, i)}(y^i - h_\theta (x^i))^2 J(θ)=2m1i=0∑mw(i,i)(yi−hθ(xi))2
h θ ( x ) h_{θ}(x) hθ(x) 是我们的预测值,即: h θ ( x ) = θ T x i h_{θ}(x) = θ^Tx_i hθ(x)=θTxi
w ( i , i ) w_{(i, i)} w(i,i) 就是权重,我们一般使用高斯核函数:
w ( i , i ) = e x p ( − ( x i − x ) 2 2 k 2 ) w_{(i, i)} = exp(-\frac{(x_i - x)^2}{2k^2}) w(i,i)=exp(−2k2(xi−x)2)
局部
的大小究竟是多大。
求解方式
梯度下降、正规方程
优缺点 & 适用场景
优点就是通过核函数加权来预防欠拟合,缺点也很明显K需要调试。当多元线性回归过拟合的时候,可以尝试高斯核局部加权来预防过拟合。
百度百科
多项式回归,回归函数是回归变量多项式的回归。多项式回归模型是线性回归模型的一种,此时回归函数关于回归系数是线性的。由于任一函数都可以用多项式逼近,因此多项式回归有着广泛应用
研究一个因变量与一个或多个自变量间多项式的回归分析方法,称为多项式回归(Polynomial Regression)。如果自变量只有一个时,称为一元多项式回归;如果自变量有多个时,称为多元多项式回归。在一元回归分析中,如果依变量y与自变量x的关系为非线性的,但是又找不到适当的函数曲线来拟合,则可以采用一元多项式回归。
白话原理
多项式回归是一元线性回归及多元线性回归的扩展。在原有线性方程的基础上增加了自变量x的几次项,可以说是变相的增加了特征。譬如一元多项式回归,当多项式项数为n时,相当于多了n个特征。多元多项式也是这个道理,所以就有种特征交叉的意思了。
一元m次多项式回归方程如下:
y ^ = b + w 1 x + w 2 x 2 + … + w m x m \hat y = b + w_1x + w_2x^2 + \ldots + w_mx^m y^=b+w1x+w2x2+…+wmxm
二元二次多项式回归方程如下:
y ^ = b + w 1 x 1 + w 2 x 2 + w 3 x 1 2 + w 4 x 2 2 + w 5 x 1 x 2 \hat y = b + w_1x_1 + w_2x_2 + w_3x_1^2 + w_4x_2^2 + w_5x_1x_2 y^=b+w1x1+w2x2+w3x12+w4x22+w5x1x2
代价函数
均方误差
求解方式
梯度下降、最小二乘
优缺点 & 适用场景
当我们要拟合的是曲线而不是直线时,就可以用多项式回归。通过控制项数来用线性模型拟合非线性数据。相比于线性回归应用更加广泛,因为我们实际场景中的数据大多呈现非线性关系。因为项数的存在所以原始数据维度得到提高,使得方程更好的拟合高维的数据,提高模型的泛化能力。缺点就是多项式的项数是需要调试的。
百度百科
LASSO是由1996年Robert Tibshirani首次提出,全称Least absolute shrinkage and selection operator。该方法是一种压缩估计。它通过构造一个惩罚函数得到一个较为精炼的模型,使得它压缩一些回归系数,即强制系数绝对值之和小于某个固定值;同时设定一些回归系数为零。因此保留了子集收缩的优点,是一种处理具有复共线性数据的有偏估计。
白话原理
就是在线性回归的基础上,代价函数里加了L1正则。
代价函数
J ( θ ) = 1 2 m [ ∑ i = 0 m ( y i − h θ ( x i ) ) 2 + λ ∑ j = 0 n ∣ ∣ w ∣ ∣ 1 ] J(\theta) = \frac{1}{2m} \ [ \ \sum_{i = 0} ^m(y^i - h_\theta (x^i))^2 + \lambda \sum_{j=0}^n ||w||_1 \ \ ] J(θ)=2m1 [ i=0∑m(yi−hθ(xi))2+λj=0∑n∣∣w∣∣1 ]
求解方式
坐标轴下降法、最小角回归法
为什么lasso回归的求解方式不再是梯度下降、最小二乘?因为lasso回归对损失函数加了L1惩罚。L1范数用的是绝对值之和,导致损失函数有不可导的点,所以最小二乘、梯度下降、牛顿和拟牛顿就统统失效了。
因为实际应用中,不管是回归还是变量选择还是降维,lasso回归应用并不多,所以这里对坐标轴下降和最小角回归不做解释。
优缺点 & 适用场景
L1正则化可以使得一些特征的系数变小,甚至还使一些绝对值较小的系数直接变为0,所以对于高纬的特征数据,尤其是线性关系是稀疏的,就可以用lasso回归,也是起到一定的降维作用。
百度百科
岭回归(英文名:ridge regression, Tikhonov regularization)是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。
白话原理
就是在线性回归的基础上,代价函数里加了L2正则。
代价函数
J ( θ ) = 1 2 m [ ∑ i = 0 m ( y i − h θ ( x i ) ) 2 + λ ∑ j = 0 n ∣ ∣ w ∣ ∣ 2 2 ] J(\theta) = \frac{1}{2m} \ [ \ \sum_{i = 0} ^m(y^i - h_\theta (x^i))^2 + \lambda \sum_{j=0}^n ||w||_2^2 \ \ ] J(θ)=2m1 [ i=0∑m(yi−hθ(xi))2+λj=0∑n∣∣w∣∣22 ]
求解方式
最小二乘、梯度下降
关于lasso回归可以做降维的说法,请看下图:
左图对应lasso回归、右图对应岭回归。两图是对应于两种方法的等高线与约束。红色椭圆代表的是随着 λ \lambda λ 的变化所得到的残差平方和。 β ^ \hat β β^ 为椭圆的中心点,为对应线性模型的最小二乘估计。左右两个图的区别在于约束域,即对应的蓝色部分。
等高线和约束域的切点就是目标函数的最优价。岭回归对应方法的约束是圆,其切点只会存在于圆周上,不会与坐标轴相切,则在任一维度上的取值都不为0,因此没有稀疏。
对于lasso回归,其约束域是正方形,会存在坐标轴的切点,使得部分维度特征权重为0,因此很容易产生稀疏解。
所以lasso回归可以达到变量选择的效果,将不显著的变量系数直接压缩至0,而岭回归对原本的系数进行了一定程度的压缩,但是任一系数都不会压缩至0。
L1和L2是正则化项,是为了限制模型的参数,防止模型过拟合而加在损失函数后面的一项。
为什么只正则化参数,不再加上参数 呢?
因为通常是一个高维参数矢量,已经可以表达高偏差问题,可能包含有很多参数,我们不可能拟合所有参数,而只是单个数字,所以几乎涵盖所有参数,而不是,如果加了参数,其实也没太大影响,因为只是众多参数中的一个,所以通常可以省略不计,如果想加上这个参数,也是完全没问题的。
白话原理
弹性网络回归ElasticNet回归
的思想就是L1正则和L2正则结合来对参数进行更新。在线性回归的基础上,代价函数加了L1正则和L2正则,即lasso回归和岭回归的结合。
代价函数
J ( θ ) = 1 2 m [ ∑ i = 0 m ( y i − h θ ( x i ) ) 2 + λ ∑ j = 0 n ∣ ∣ w ∣ ∣ 1 + λ ∑ j = 0 n ∣ ∣ w ∣ ∣ 2 2 ] J(\theta) = \frac{1}{2m}[ \ \sum_{i = 0} ^m(y^i - h_\theta (x^i))^2 + \lambda \sum_{j=0}^n ||w||_1 + \lambda \sum_{j=0}^n ||w||_2^2 \ \ ] J(θ)=2m1[ i=0∑m(yi−hθ(xi))2+λj=0∑n∣∣w∣∣1+λj=0∑n∣∣w∣∣22 ]
求解方式
最小二乘、梯度下降
优缺点 & 适用场景
当我们发现用Lasso回归太过(太多特征被稀疏为0)
,而岭回归也正则化的不够(回归系数衰减太慢)
的时候,可以考虑使用ElasticNet回归来综合,得到比较好的结果。
百度百科
贝叶斯线性回归(Bayesian linear regression)是使用统计学中贝叶斯推断(Bayesian inference)方法求解的线性回归(linear regression)模型 [1-2] 。
贝叶斯线性回归将线性模型的参数视为随机变量(random variable),并通过模型参数(权重系数)的先验(prior)计算其后验(posterior)。贝叶斯线性回归可以使用数值方法求解,在一定条件下,也可得到解析型式的后验或其有关统计量。
贝叶斯线性回归具有贝叶斯统计模型的基本性质,可以求解权重系数的概率密度函数,进行在线学习以及基于贝叶斯因子(Bayes factor)的模型假设检验。
先来回顾涉及到的相关概念:
概率乘法公式
P ( A B ) = P ( A ∣ B ) ⋅ P ( B ) = P ( B ∣ A ) ⋅ P ( A ) P(AB) = P(A|B) \cdot P(B) = P(B|A) \cdot P(A) P(AB)=P(A∣B)⋅P(B)=P(B∣A)⋅P(A)
全概率公式
设 A 1 A_1 A1 ~ A i A_i Ai 是 Ω 的一个划分
P ( B ) = ∑ i = 1 n P ( A i ) ⋅ P ( B ∣ A i ) P(B) = \sum_{i=1}^n P(A_i) \cdot P(B|A_i) P(B)=i=1∑nP(Ai)⋅P(B∣Ai)
贝叶斯公式
P ( A i ∣ B ) = P ( B ∣ A i ) ⋅ P ( A i ) ∑ i = 1 n P ( A i ) ⋅ P ( B ∣ A i ) P(A_i|B) = \frac{P(B|A_i) \cdot P(A_i)}{\sum_{i=1}^n P(A_i) \cdot P(B|A_i)} P(Ai∣B)=∑i=1nP(Ai)⋅P(B∣Ai)P(B∣Ai)⋅P(Ai)
贝叶斯定理
P ( A ∣ B ) = P ( A ) P ( B ∣ A ) P ( B ) P(A|B) = \frac{P(A)P(B|A)}{P(B)} P(A∣B)=P(B)P(A)P(B∣A)
它的意思就是:在事件B发生的情况下,事件A发生的概率。
其中,P(A)叫做先验概率,P(B|A)叫做似然,P(B)叫做证据因子,P(A|B)叫做后验概率。
朴素贝叶斯
一般情况下 P ( A ) ≠ P ( A ∣ B ) P(A) ≠ P(A|B) P(A)=P(A∣B) ,若 P ( A ) = P ( A ∣ B ) P(A) = P(A|B) P(A)=P(A∣B) 则称A与B相互独立,即 P ( A B ) = P ( A ) ⋅ P ( B ∣ A ) = P ( A ) ⋅ P ( B ) P(AB) = P(A) \cdot P(B|A) = P(A) \cdot P(B) P(AB)=P(A)⋅P(B∣A)=P(A)⋅P(B) 相互独立时成立。
朴素贝叶斯的”朴素“就在于它假设特征间是独立的,从而变成了“低配版的贝叶斯”。相较于贝叶斯来说,优点就是可以减少需要估计的参数,缺点就是会牺牲一定的准确率。
注:关于朴素贝叶斯这里不再详细阐述,有兴趣可以查一下,包括其中知识点如 拉普拉斯平滑、多项式朴素贝叶斯、伯努利朴素贝叶斯、高斯朴素贝叶斯等。
极大似然估计
似然估计:给定结果的情况下发生的概率
极大似然:事情已经发生了,当未知参数等于多少时,能让这个事情发生的概率最大,本质意义上是我们在很多参数中选择一个能使数据出现概率最大的参数。
共轭先验
贝叶斯线性回归公式引入
D a t a = ( x i , y i ) i = 1 N x i ∈ R p y i ∈ R Data = {(x_i, y_i)}_{i=1}^N \\ x_i ∈ R^p \\ y_i ∈ R Data=(xi,yi)i=1Nxi∈Rpyi∈R
由于求解过程太麻烦,所以笔者就略过。详细求后验推导请见:
https://www.bilibili.com/video/BV1St411m7XJ?p=3
详细
Prediction
推导请见:https://www.bilibili.com/video/BV1St411m7XJ?p=4
优缺点 & 适用场景
贝叶斯回归的优点就是对数据有自适应能力,可以重复利用数据并防止过拟合,因为我们在估计的过程中可以引入正则项,比如在贝叶斯线性回归的基础上引入L2正则就是贝叶斯岭回归。缺点就是学习过程开销太大。当特征数在10个以为,可以尝试贝叶斯回归。
白话原理
对于回归问题一般采用MSE作为代价函数,但是如果我们数据中异常值比较严重,导致训练后模型给出的 y ^ \hat y y^ 和真实的 y y y 偏差较大,这样在用平方作为loss,模型很容易过拟合,并带偏最后指标。
所以为了增加平方损失对噪声点的鲁棒性,Huber损失应运而生。Huber回归就是在线性回归的基础上,将损失函数替换为Huber损失。
代价函数
先来回顾一下L1损失和L2损失:
损 失 函 数 取 残 差 平 方 , 记 为 l 2 损 失 : L ( y , y ^ ) = ( y − y ^ ) 2 = r 2 损失函数取残差平方,记为 \ l2 \ 损失: \\ L(y, \hat y) = (y - \hat y)^2 = r^2 损失函数取残差平方,记为 l2 损失:L(y,y^)=(y−y^)2=r2
2损失处处可导,计算方便,但是对噪声敏感。
损 失 函 数 取 残 差 绝 对 值 时 , 记 为 l 1 损 失 : L ( y , y ^ ) = ∣ y − y ^ ∣ = ∣ r ∣ 损失函数取残差绝对值时,记为 \ l1 \ 损失: \\ L(y, \hat y) = |y - \hat y| = |r| 损失函数取残差绝对值时,记为 l1 损失:L(y,y^)=∣y−y^∣=∣r∣
L1损失虽然对噪声不敏感,但是在0处不可导,计算不方便。
综合L1和L2的优点,得到Huber损失:
式中的 δ 可以理解为一个边界,用于判断离群点。当在这个边界内的数据默认使用MSE损失,大于这个边界的数据将loss减小,使用线性函数。这种方法能降低离群点对于loss计算的权重,避免过拟合。
求解方式
梯度下降、最小二乘
优缺点 & 适用场景
结合了L1损失和L2损失的优点,适用于异常点比较严重的数据集。同时缺点就是超参δ是需要调整的,当δ趋向于0时,Huber损失会趋向于MSE;当δ趋向于无穷时,Huber损失会趋向于MAE。
百度百科
邻近算法,或者说K最近邻(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的K个邻近值来代表。近邻算法就是将数据集合中每一个记录进行分类的方法。KNN算法的核心思想是,如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法在类别决策时,只与极少量的相邻样本有关。
白话原理
本着物以类聚人以群分的思想,KNN的原理也非常简单。要判断一个新样本的类别,就要看它的邻居是谁。K个邻居即为新样本在样本空间中距离最近的K个点。KNN有三个基本要素:距离度量、K值选择、决策规则。算法步骤就是首先计算已知类别数据集中的点与当前点之间的聚类,然后对距离进行升序排序,返回K个邻近点的下标。如果是分类问题那就是少数服从多数原则。如果是回归问题,直接对K个近邻的y取均值即可,所以KNN不需要训练,只要对于一个新样本点利用距离最近的K个点的标签就可以得出结果。
距离度量
假设有两个样本点 x 1 x_1 x1 x 2 x_2 x2,它们两者间的闵可夫斯基距离 L p L_p Lp 定义为:
L p ( x 1 , x 2 ) = ( ∑ l = 1 n ∣ x 1 ( l ) − x 2 ( l ) ∣ p ) 1 p L_p(x_1, x_2) = (\sum_{l=1}^n |x_1^{(l)} - x_2^{(l)}|^p)^{\frac{1}{p}} Lp(x1,x2)=(l=1∑n∣x1(l)−x2(l)∣p)p1
当 p = 1 p=1 p=1 时,称为曼哈顿距离(坐标轴距离的绝对值和)
L p ( x 1 , x 2 ) = ∑ l = 1 n ∣ x 1 ( l ) − x 2 ( l ) ∣ L_p(x_1,x_2) = \sum_{l=1}^n |x_1^{(l)} - x_2^{(l)}| Lp(x1,x2)=l=1∑n∣x1(l)−x2(l)∣
当 p = 2 p=2 p=2 时,称为欧式距离(两点间直线距离)
L p ( x 1 , x 2 ) = ∑ l = 1 n ( x 1 ( l ) − x 2 ( l ) ) 2 L_p(x_1,x_2) = \sqrt{\sum_{l=1}^n (x_1^{(l)} - x_2^{(l)})^2} Lp(x1,x2)=l=1∑n(x1(l)−x2(l))2
K值选择
决策规则
优缺点 & 适用场景
K值的调试是需要花费时间的。普通的KNN计算时间较长,因为要线性扫描样本空间来计算新样本与所有样本的距离,所以数据越多效率越低。当然改进的方法如KD树、球树等。对于普通的预测场景建议放弃KNN。对于需要一个特别容易解释的模型的时候,可以尝试一下。比如需要向用户解释原因的推荐算法、比如将文本分词,统计词频后判断文章类型、比如电商 视频网站找到与你类似的用户,根据它们的选择推荐你可能感兴趣的物品(类似于协同过滤)。
百度百科
支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)。
SVM使用铰链损失函数(hinge loss)计算经验风险(empirical risk)并在求解系统中加入了正则化项以优化结构风险(structural risk),是一个具有稀疏性和稳健性的分类器 [2] 。SVM可以通过核方法(kernel method)进行非线性分类,是常见的核学习(kernel learning)方法之一 [4] 。
SVR:即支持向量机回归。我们通常所说的SVM,它其实就是在特征空间中找间隔最大的超平面的广义线性分类器。对于线性可分和线性不可分问题都有着求硬间隔最大和软间隔最大的方法。SVM在这里不再过多阐述,有兴趣的读者可以查阅相关书籍。
先来回顾一下SVM相关知识
上面也提到了,SVM是在特征空间中找间隔最大的超平面,以此来进行分类的。对于线性可分问题,我们需要求硬间隔最大即可。对于非线性可分问题,我们需要通过核函数映射到高维空间,计算软间隔最大即可。下面以线性可分为例,我们来看一下SVM的形式化表示。
支持向量定义为:距超平面距离最近的那些点。如上图所示到超平面距离为 d 1 d_1 d1、 d 2 d_2 d2的点。支持向量平面就是恰好过这些点的平面。二分类有两个支持向量平面,这两个平面是平行的。超平面是位于这两个平面中间的。如下图所示, a a a、 b b b 即为支持向量平面, c c c 为超平面。我们只需要使 a a a、 b b b 的间隔最大,那么超平面的分隔效果就越好。
c = w T x + b 设 : w T x + b = 0 c = w^Tx + b \\ 设:\ w^Tx + b = 0 c=wTx+b设: wTx+b=0
w w w 为超平面 c c c 的法向量,即垂直于超平面的向量,它能决定超平面的方向。b就是截距,能确定超平面的位置。
a : w T x + b = 1 b : w T x + b = − 1 a: \ w^Tx + b = 1 \\ b: \ w^Tx + b = -1 a: wTx+b=1b: wTx+b=−1
算最大间隔
假设 a a a上有一点 x 1 x_1 x1, b b b上有一点 x 2 x_2 x2,如下图所示分别做原点到 x 1 x_1 x1、 x 2 x_2 x2的向量。那么我们可以求得两向量的差: x 1 ⃗ − x 2 ⃗ \vec{x_1} - \vec{x_2} x1−x2。所以我们的间隔就可以表示成: ∣ ∣ x 1 ⃗ − x 2 ⃗ ∣ ∣ c o s θ ||\vec{x_1} - \vec{x_2}|| \ cosθ ∣∣x1−x2∣∣ cosθ。
我们需要求得距离 d d d 最大。
和回归问题一样,我们都是通过训练样本 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x m , y m ) } , y i ∈ R D = \{(x_1, y_1), (x_2, y_2), \ldots, (x_m, y_m)\},y_i ∈ R D={ (x1,y1),(x2,y2),…,(xm,ym)},yi∈R ,想要学到我们的回归模型 f ( x ) = w T x + b f(x) = w^T x + b f(x)=wTx+b ,使得 f ( x ) f(x) f(x) 与 y y y 近可能接近。
和SVM原理基本一致,SVR也是要找出一个超平面,使得所有数据到这个超平面的距离最小。对样本 ( x , y ) (x, y) (x,y),传统回归模型通常是直接基于模型输出 f ( x ) f(x) f(x) 与 真实 y y y 之间的差别来计算损失。当且仅当 f ( x ) = = y f(x) == y f(x)==y 的时候损失才为0。SVR与此不同,它假设我们能容忍 f ( x ) f(x) f(x) 与 y y y 之间最多有 ϵ \epsilon ϵ 的偏差。当且仅当 f ( x ) f(x) f(x) 与 y y y 之间的差别绝对值大于 ϵ \epsilon ϵ 时才计算损失。如下图所示,这相当于以超平面 f ( x ) f(x) f(x) 为中心,构建了一个宽度为 2 ϵ 2 \epsilon 2ϵ 的间隔带,若训练样本落入此间隔带,则认为是被预测正确的。
CART树介绍
在决策树的几个算法中,只有CART树既能做回归又能做分类,并且既能处理连续值又能处理离散值。其核心思想与ID3和C4.5相同,主要的不同处在于CART在每一个节点上都采用二分法,即每个节点都只能有两个子节点,最后构成的是二叉树,所以CART树通常是集成学习树模型的默认基分类器。回归问题中,目标值是连续的,所以CART树最后输出的是划分到叶子节点的训练样本的标签的均值。
回归树的数学表示
f ( x ) = ∑ m = 1 M c m I ( x ∈ R m ) , 其 中 x ∈ R m , I ( x ∈ R m ) = 1 f(x) = \sum_{m=1}^M c_m I \ \ (x∈R_m),其中x∈R_m,I(x∈R_m)=1 f(x)=m=1∑McmI (x∈Rm),其中x∈Rm,I(x∈Rm)=1
一个回归树对应着一个特征空间的一个划分及在划分单元上的是输出值,说白了就是对应着一个左右子树的划分和在叶子结点的预测值。假设已输入特征空间划分为 M M M 个单元 R 1 、 R 2 … R m R1、R2 \ldots R_m R1、R2…Rm ,并且在每个单元 R m R_m Rm 上有一个固定的输出类别 C m C_m Cm ,这就是以上回归树的数学表示。
损失函数
很多书上的公式都给的是SSE,实际sklearn的底层用的是MSE,因为实际上是要除m的,否则会我们计算的会很大。
优化函数(分裂过程)
j , s = a r g m i n j , s [ m i n c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + m i n c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] j,s = argmin_{j,s}[min_{c_1} \sum_{x_i∈R_1(j, s)}(y_i - c_1)^2 + min_{c_2}\sum_{x_i∈R_2(j, s)}(y_i - c_2)^2] j,s=argminj,s[minc1xi∈R1(j,s)∑(yi−c1)2+minc2xi∈R2(j,s)∑(yi−c2)2]
白话分裂过程
我们对于每个特征,将特征值排序,计算特征值两两间的均值作为分割点。小于分割点的去左子树,大于分割点的去右子树。即m个特征,m-1个分隔点。遍历每个特征,再遍历每个分割点。计算以每个分隔点划分的左右子树的SSE。SSE最小的特征和分割点作为最优特征和最优分裂点。
伪代码表示如下:
for j in 特征:
for s in 分隔点:
Loss = 左子树SSE + 右子树SSE
dict[(j,s)] = Loss
均方误差目标函数的最优值为什么是均值?
剪枝
经过算法构建的决策树非常详细,并且分叉可能会多,深度也可能很深,也就是说对于每个特征都被详细的加以考虑,最终叶子节点的训练样本都是纯的,很容易过拟合。并且树模型越复杂,过拟合程度会越高,为了提高决策树的泛化能力,我们采用剪枝来防止过拟合。
百度百科
在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。随机森林指的是利用多棵树对样本进行训练并预测的一种分类器。
bagging思想
随机森林是基分类器为决策树的bagging算法,bagging是集成学习的思想之一。bagging思想首先是采用M轮的bootstrap自助采样,每轮采样对应训练一个弱分类器,并且训练的时候是并行计算的,最后将这M个弱分类器进行组合来实现预测的。由于自助采样,所以bagging是通过样本扰动的方式来增加基分类器的差异性,差异性越大,集成效果越好。因此bagging的基学习器应为对训练样本扰动敏感的算法,这就是bagging思想。
受样本扰动敏感:LR、NN、决策树
白话原理
随机森林在bagging样本随机的基础上,增加了特征随机。默认的基分类器就是CART树。它相比于单颗决策树,RF的预测结果更加准确,并且可以输出特征的重要性排序。因为要保证若分类器之间的差异性,所以随机森林的每个弱分类器都不需要剪枝。由于两个随机的思想,即使不剪枝也不容易发生过拟合。由于并行训练和特征随机所以RF的训练速度要比决策树快。RF的构建流程大致分为这几步:
1.根据自助采样抽取M个样本集。每个样本集从原来的N个训练样本中有放回的随机抽取N个样本。未被抽取到的36.8%的样本组成袋外数据用于测试。
2.从候选特征中随机的无放回的抽取K个特征。
3.用每个样本集和特征集并行的构建弱分类器。
4.这样M个样本集一共训练出M课决策树,组成随机森林。
RF比较适用于可解释性要求不高,准去率要求较高的场合。其实当森林中决策树很多时,虽然是并行训练,它的训练时间也挺大。
为什么随机抽样?
为什么要有放回的抽样?
为什么不用全样本训练?
为什么要随机特征?
RF为什么比bagging效率高?
为什么自助采样会有36.8%的概率没有被采样到?
Boosting一族是可将弱学习器提升为强学习器的算法,它的思想就是每一个基分类器纠正前一个基分类器的错误,至于纠正的方式不同所以有不同的boosting算法。算法思想如下:
在boosting思想的基础上,adaboost思想如下:
提升树其实就是加法模型,它每一步产生一个弱学习器,并加权累加到总模型中。如果每一步的弱学习器生成都是依据损失函数的负梯度方向,则称之为梯度提升。在GBDT中,提升树在构建树的每一步过程中,都去拟合上一步获得模型在训练集的残差,这个残差正好是损失函数的负梯度方向。也就是提升算法通过迭代的选择一个负梯度方向上的基函数来逐渐逼近局部极小值。分类问题时,提升树其实就是基学习器为CART分类树的adaboost。回归问题时,提升树是基学习器为CART回归树的adaboost。
严格意义来讲,做回归时称为GBRT,做分类时称为GBDT。以下统称为GBDT。
白话原理
GBDT全称是梯度提升决策树,是boosting家族的一员,它的叫法有很多,如TreeLink、GBRT、TreeNet。其实本质就是加法模型,通过多棵树的累加和不断的减小训练过程产生的残差来达到预测的目的。
拆开来看,它分为GB和DT。
(Grandient Boosting):
梯度提升的意思:梯度提升是指对损失函数求导,损失函数的负梯度方向就是近似残差,每轮的CART树拟合上一次的残差,通过梯度下降使残差越来越小。(Decision tree):
决策树:默认的基分类器是CART回归树。因为每次迭代要拟合的是梯度值,也就是连续值,而且最后累加所有树的预测结果作为最终结果,分类树的结果没有办法累加,所有要用回归树
。GBDT是建立在提升树的思想基础上,即每次迭代都学习一棵CART树来拟合前t-1棵树在训练集上的残差。
拟合残差就是逐步逼近的过程,数学角度来讲本质就是对损失函数一阶泰勒展开。泰勒公式逼近任何一个多项式,求它的近似值。
对于GBDT而言,这个残差正好是损失函数的负梯度,要让损失函数(均方误差)
最小,就要在负梯度的方向上进行梯度下降。说的再直白一点,GBDT的每个基分类器都是对残差进行预测,每一次的计算都是为了减少上一次的残差,所以为了消除残差,在残差减小的梯度方向上建立模型进行梯度下降,这与传统的Boosting中关注样本和基分类器的权重有着很大的区别。所以GBDT的构建步骤可以分为两步,首先就是根据损失函数计算残差,然后就是训练回归树拟合残差。
GBDT里也用了学习率,是Shrinkage的一个思想,如果每棵树的结果直接全部加起来很容易一步学到位导致过拟合,所以基于Shrinkage的思想,为每棵树设置了一个权重,累加的时候要乘上这个权重,主要是为了削弱每棵树的影响,让后面有更大的学习空间。所以将每棵回归树对应的结果乘学习率(第一棵树不乘),加总就是最终预测值。
关键点就是利用损失函数的负梯度去拟合残差,对于损失函数求一阶导数
GBDT对弱分类器的要求一般是低方差和高偏差的,因为训练过程是通过不断降低偏差(残差)来提高分类器的精度
举个例子
优缺点 & 适用场景
梯度提升,梯度体现在哪?
GBDT过拟合了怎么办?
树的复杂度由哪方面体现?
树的层数
叶子节点个数
L1、L2
GBDT输出
GBDT与RF之间的区别
从集成学习的角度来讲:
RF属于bagging思想,而GBDT是boosting思想从权衡方差偏差角度来讲:
RF不断的降低模型的方差,而GBDT不断的降低模型的偏差从训练样本角度来讲:
RF每次迭代的样本是从全部训练集中有放回抽样形成的,而GBDT每次使用全部样本从树的生成角度来讲:
RF的树是并行生成,而GBDT只能顺序生成(需要等上一棵树完全生成)
从结果角度来讲:
分类问题随机森林的结果是多棵树投票表决,回归问题是多棵树算术平均。而GBDT是加权融合从数据敏感性角度来讲:``随机森林对异常值不敏感。GBDT对异常值比较敏感
从泛化能力来看:
RF不易过拟合,而GBDT容易过拟合随机森林不需要进行特征归一化。GBDT最好进行特征归一化,梯度下降收敛快一些
GBDT和Adaboost的区别
Adaboost
每次迭代提升错误样本权重来弥补模型的不足;Adaboost
目标函数为指数损失函数Adaboost
都有Adaboost
分类为多数表决,回归为取平均值Adaboost
可有其他类型分类器GBDT和LR的区别
GBDT为什么要拟合前面几轮的残差?
GBDT通过什么方式减少误差?
为什么只能用CART回归树?
GBDT为什么要用梯度下降?
GBDT如何做特征选择?
为什么GBDT的树深度较RF浅?
GBDT如何加速训练?
GBDT哪些部分可以并行?
GBDT为什么要归一化?
XGBOOST是在GBDT的基础上做的改进和优化,GBDT对损失函数梯度下降,XGB对损失函数二阶泰勒展开,运算速度和准确度都相对高一些。
XGBOOST的boosting策略和GBDT基本一样,都是通过加法模型,不断拟合残差来达到预测效果的。不同点在于:
(牛顿法)
,同时用到了一阶和二阶导数。可以更为精准的逼近真实的损失函数。XGBOOST还支持自定义代价函数,只要代价函数一阶和二阶可导就可以。XGBOOST差不多就对GBDT做了这些优化,它在可扩展性和训练速度和精度上都有了巨大的提升,但是核心思想是没有发生太大变化的。
XGBoost为什么使用泰勒二阶展开?
XGBoost为什么快?
XGBoost防止过拟合的方法?
GBDT、XGBoost中的一棵树的停止生长条件?
XGBoost如何处理不平衡数据?
第一种,如果你在意AUC,采用AUC来评估模型的性能,那你可以通过设置scale_pos_weight来平衡正样本和负样本的权重。例如,当正负样本比例为1:10时, scale_pos_weight可以取10;
第二种,如果你在意概率(预测得分的合理性),你不能重新平衡数据集(会破坏数据的真实分布),应该设置max_delta_step为一个有限数字来帮助收敛(基模型为LR时有效)。
除此之外,还可以通过上采样、下采样、SMOTE算法或者自定义代价函数的方式解决正负样本不平衡的问题。
XGBoost中如何对树进行剪枝?
XGBoost如何寻找最优特征(最佳分裂点)?
XGBooost参数调优的一般步骤?
代码角度讲,XGBooost过拟合了怎么办?
为什么XGBoost相比某些模型对缺失值不敏感?
XGB的原理是什么,学习的目标是什么,每个学习器学习的是什么?
优缺点 & 适用场景
常用的机器学习算法,例如线性回归、神经网络等,都可以以mini-batch的方式训练,训练数据的大小不会受到内存限制。而GBDT家族在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。尤其面对工业级海量的数据,GBDT、XGBOOST是不能满足其需求的。所以LightGBM应运而生。原理上它和GBDT及XGBoost类似,都采用损失函数的负梯度作为当前决策树的残差近似值,去拟合新的决策树。
上面也提到过XGB是基于预排序方法的决策树算法。这种构建决策树的算法基本思想是:首先,对所有特征都按照特征的数值进行预排序。其次,在遍历分割点的时候用 O ( d a t a ) O(data) O(data)的代价找到一个特征上的最好分割点。最后,在找到一个特征的最好分割点后,将数据分裂成左右子节点。这样的预排序算法的优点是能精确地找到分割点。但是缺点也很明显:
为了避免上述XGBoost的缺陷,并且能够在不降低准确率的条件下加快XGB模型的训练速度,lightGBM在XGB算法上进行了如下优化:
Gradient-based One-Side Sampling(GOSS)
:使用GOSS可以减少大量只具有小梯度的数据实例,这样在计算信息增益的时候只利用剩下的具有高梯度的数据就可以了,相比XGBoost遍历所有特征值节省了不少时间和空间上的开销。Exclusive Feature Bundling(EFB)
:使用EFB可以将许多互斥的特征绑定为一个特征,这样达到了降维的目的。(Categorical Feature)
直方图算法
Histogram algorithm
应该翻译为直方图算法,直方图算法的基本思想是:先把连续的浮点特征值离散化成 k k k 个整数,同时构造一个宽度为 k k k 的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。
直方图算法简单理解为:首先确定对于每一个特征需要多少个箱子(bin)并为每一个箱子分配一个整数;然后将浮点数的范围均分成若干区间,区间个数与箱子个数相等,将属于该箱子的样本数据更新为箱子的值;最后用直方图(#bins)表示。看起来很高大上,其实就是直方图统计,将大规模的数据放在了直方图中。说白了就是连续特征经过分桶使其离散化。
我们知道特征离散化具有很多优点,如存储方便、运算更快、鲁棒性强、模型更加稳定等。对于直方图算法来说最直接的有以下两个优点:
当然,Histogram算法并不是完美的。由于特征被离散化后,找到的并不是很精确的分割点,所以会对结果产生影响。但在不同的数据集上的结果表明,离散化的分割点对最终的精度影响并不是很大,甚至有时候会更好一点。原因是单个决策树在这是弱模型,分割点是不是精确并不是太重要;较粗的分割点也有正则化的效果,可以有效地防止过拟合;即使单棵树的训练误差比精确分割的算法稍大,但在梯度提升的框架下没有太大的影响。
直方图做差加速
LightGBM另一个优化是Histogram(直方图)做差加速。一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到,在速度上可以提升一倍。通常构造直方图时,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。在实际构建树的过程中,LightGBM还可以先计算直方图小的叶子节点,然后利用直方图做差来获得直方图大的叶子节点,这样就可以用非常微小的代价得到它兄弟叶子的直方图。
XGBoost 在进行预排序时只考虑非零值进行加速,而 LightGBM 也采用类似策略:只用非零特征构建直方图。
在Histogram算法之上,LightGBM进行进一步的优化。首先它抛弃了大多数GBDT工具使用的按层生长(level-wise)
的决策树生长策略,而使用了带有深度限制的按叶子生长(leaf-wise)
算法。
XGBoost 采用Level-wise
的增长策略,该策略遍历一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上Level-wise
是一种低效的算法,因为它不加区分的对待同一层的叶子,实际上很多叶子的分裂增益较低,没必要进行搜索和分裂,因此带来了很多没必要的计算开销。
LightGBM采用Leaf-wise
的增长策略,该策略每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise
相比,Leaf-wise
的优点是:在分裂次数相同的情况下,Leaf-wise
可以降低更多的误差,得到更好的精度;Leaf-wise
的缺点是:可能会长出比较深的决策树,产生过拟合。因此LightGBM会在Leaf-wise
之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。
Gradient-based One-Side Sampling
应该被翻译为单边梯度采样(GOSS)
。GOSS算法从减少样本的角度出发,排除大部分小梯度的样本,仅用剩下的样本计算信息增益,它是一种在减少数据量和保证精度上平衡的算法。
AdaBoost中,样本权重是数据重要性的指标。然而在GBDT中没有原始样本权重,不能应用权重采样。幸运的是,我们观察到GBDT中每个数据都有不同的梯度值,对采样十分有用。即梯度小的样本,训练误差也比较小,说明数据已经被模型学习得很好了,直接想法就是丢掉这部分梯度小的数据。然而这样做会改变数据的分布,将会影响训练模型的精确度,为了避免此问题,提出了GOSS算法。
GOSS是一个样本的采样算法,目的是丢弃一些对计算信息增益没有帮助的样本留下有帮助的。根据计算信息增益的定义,梯度大的样本对信息增益有更大的影响。因此,GOSS在进行数据采样的时候只保留了梯度较大的数据,但是如果直接将所有梯度较小的数据都丢弃掉势必会影响数据的总体分布。所以,GOSS首先将要进行分裂的特征的所有取值按照绝对值大小降序排序`(XGBoost一样也进行了排序,但是LightGBM不用保存排序后的结果)。选取绝对值最大的 a ∗ 100 % a * 100\% a∗100% 个数据。然后在剩下的较小梯度数据中随机选择 $b * 100% $个数据。接着将这 $ b * 100% $ 个数据乘以一个常数 1 − a b \frac{1 - a}{b} b1−a,这样算法就会更关注训练不足的样本,而不会过多改变原数据集的分布。最后使用这 ( a + b ) ∗ 100 % (a+b) * 100\% (a+b)∗100% 个数据来计算信息增益。
高维度的数据往往是稀疏的,这种稀疏性启发我们设计一种无损的方法来减少特征的维度。通常被捆绑的特征都是互斥的(即特征不会同时为非零值,像one-hot),这样两个特征捆绑起来才不会丢失信息。如果两个特征并不是完全互斥(部分情况下两个特征都是非零值),可以用一个指标对特征不互斥程度进行衡量,称之为冲突比率,当这个值较小时,我们可以选择把不完全互斥的两个特征捆绑,而不影响最后的精度。互斥特征捆绑算法(Exclusive Feature Bundling, EFB)
指出如果将一些特征进行融合绑定,则可以降低特征数量。这样在构建直方图时的时间复杂度从 O ( # d a t a ∗ # f e a t u r e ) O(\#data * \#feature) O(#data∗#feature) 变为 O ( # d a t a ∗ # b u n d l e ) O(\#data * \#bundle) O(#data∗#bundle) ,这里 # b u n d l e \#bundle #bundle 指特征融合绑定后特征包的个数,且 # b u n d l e < < # f e a t u r e \#bundle << \#feature #bundle<<#feature。
针对这种想法,我们会遇到两个问题:
解决哪些特征应该绑在一起
将相互独立的特征进行绑定是一个 NP难题,LightGBM的EFB算法将这个问题转化为图着色的问题来求解,将所有的特征视为图的各个顶点,将不是相互独立的特征用一条边连接起来,边的权重就是两个相连接的特征的总冲突值,这样需要绑定的特征就是在图着色问题中要涂上同一种颜色的那些点(特征)。此外,我们注意到通常有很多特征,尽管不是100%相互排斥,但也很少同时取非零值。 如果我们的算法可以允许一小部分的冲突,我们可以得到更少的特征包,进一步提高计算效率。具体步骤可以总结如下:
解决怎么把特征绑为一捆
特征合并算法,其关键在于原始特征能从合并的特征中分离出来。绑定几个特征在同一个bundle里需要保证绑定前的原始特征的值可以在bundle中识别,考虑到histogram-based
算法将连续的值保存为离散的bins,我们可以使得不同特征的值分到bundle中的不同bin(箱子)中,这可以通过在特征值中加一个偏置常量来解决。比如,我们在bundle中绑定了两个特征A和B,A特征的原始取值为区间[0,10),B特征的原始取值为区间[0,20),我们可以在B特征的取值上加一个偏置常量10,将其取值范围变为[10,30),绑定后的特征取值范围为 [0, 30),这样就可以放心的融合特征A和B了。
实际上大多数机器学习工具都无法直接支持类别特征,一般需要把类别特征,通过 one-hot 编码,转化到多维的0/1特征,降低了空间和时间的效率。但我们知道对于决策树来说并不推荐使用 one-hot 编码,尤其当类别特征中类别个数很多的情况下,会存在以下问题:
而类别特征的使用在实践中是很常见的。且为了解决one-hot编码处理类别特征的不足,LightGBM优化了对类别特征的支持,可以直接输入类别特征,不需要额外的0/1展开。LightGBM采用 many-vs-many 的切分方式将类别特征分为两个子集,实现类别特征的最优切分。假设某维特征有 k k k 个类别,则有 2 ( k − 1 ) − 1 2^{(k-1)} - 1 2(k−1)−1 种可能,时间复杂度为 O ( 2 k ) O(2^k) O(2k) ,LightGBM实现了 O ( k l o g k ) O(klogk) O(klogk) 的时间复杂度。算法流程如下图所示,在枚举分割点之前,先把直方图按照每个类别对应的label均值进行排序;然后按照排序的结果依次枚举最优分割点。从下图可以看到, s u m ( y ) c o u n t ( y ) \frac{sum(y)}{count(y)} count(y)sum(y) ,为类别的均值。当然,这个方法很容易过拟合,所以LightGBM里面还增加了很多对于这个方法的约束和正则化。
特征并行
特征并行的主要思想是不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。XGBoost使用的就是这种特征并行方法。这种特征并行方法有个很大的缺点:就是对数据进行垂直划分,每台机器所含数据不同,然后使用不同机器找到不同特征的最优分裂点,划分结果需要通过通信告知每台机器,增加了额外的复杂度。
LightGBM 则不进行数据垂直划分,而是在每台机器上保存全部训练数据,在得到最佳划分方案后可在本地执行划分而减少了不必要的通信。具体过程如下图所示。
传统的数据并行策略主要为水平划分数据,让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。这种数据划分有一个很大的缺点:通讯开销过大。如果使用点对点通信,一台机器的通讯开销大约为 O ( # m a c h i n e ∗ # f e a t u r e ∗ # b i n ) O(\#machine * \#feature * \#bin) O(#machine∗#feature∗#bin),如果使用集成的通信,则通讯开销为 ( 2 ∗ # f e a t u r e ∗ # b i n ) (2*\#feature * \#bin) (2∗#feature∗#bin)。LightGBM在数据并行中使用分散规约(Reduce scatter)
把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。具体过程如下图所示。
投票并行
基于投票的数据并行则进一步优化数据并行中的通信代价,使通信代价变成常数级别。在数据量很大的时候,使用投票并行的方式只合并部分特征的直方图从而达到降低通信量的目的,可以得到非常好的加速效果。具体过程如下图所示。
大致步骤为两步:
XGBoost对cache优化不友好,如下图所示。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。为了解决缓存命中率低的问题,XGBoost 提出了缓存访问算法进行改进。
优点
(1)速度更快
(2)内存更小
缺点
(1)LightGBM使用了基于histogram的决策树算法,这一点不同于XGBoost中的贪心算法和近似算法,histogram算法在内存和计算代价上都有不小优势。
(2)XGBoost采用的是level-wise
的分裂策略,而LightGBM采用了leaf-wise
的策略,区别是XGBoost对每一层所有节点做无差别分裂,可能有些节点的增益非常小,对结果影响不大,但是XGBoost也进行了分裂,带来了不必要的开销。leaft-wise
的做法是在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行,很明显leaf-wise
这种做法容易过拟合,因为容易陷入比较高的深度中,因此需要对最大深度做限制,从而避免过拟合。
(3)XGBoost在每一层都动态构建直方图,因为XGBoost的直方图算法不是针对某个特定的特征,而是所有特征共享一个直方图(每个样本的权重是二阶导),所以每一层都要重新构建直方图,而LightGBM中对每个特征都有一个直方图,所以构建一次直方图就够了。
(4)LightGBM使用直方图做差加速,一个子节点的直方图可以通过父节点的直方图减去兄弟节点的直方图得到,从而加速计算。
(5)LightGBM支持类别特征,不需要进行独热编码处理。
(6)LightGBM优化了特征并行和数据并行算法,除此之外还添加了投票并行方案。
(7)LightGBM采用基于梯度的单边采样来减少训练样本并保持数据分布不变,减少模型因数据分布发生变化而造成的模型精度下降。
(8)特征捆绑转化为图着色问题,减少特征数量。
关于时间序列及时间序列分析,这里只围绕ARIMA介绍,有兴趣的朋友可以看王艳的应用时间序列分析这本书。
百度百科
时间序列(或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。时间序列分析的主要目的是根据已有的历史数据对未来进行预测。经济数据中大多数以时间序列的形式给出。根据观察时间的不同,时间序列中的时间可以是年份、季度、月份或其他任何时间形式。
时间序列数据
时序数据就是在时间上分布的一系列数值。生活中常见的时序数据包括,股票价格、广告数据、气温变化、网站的PV/UV、个人健康数据、工业传感器数据、服务器系统监控数据(比如CPU和内存占用率)、车联网等。
数据平稳性
平稳性就是要求经由样本时间序列所得到的拟合曲线在未来的一段期间内仍能顺着现有的形态“惯性”地延续下去。平稳性要求序列的均值和方差不发生明显变化。我们的时序数据可以分为以下三个种类:
(纯随机序列)
的时候我们就可以停止我们的分析。AR(自回归模型)
描述当前值与历史值之间的关系,用变量自身的历史时间数据对自身进行预测,所以只适用于预测与自身前期相关的现象
自回归模型必须满足平稳性的要求,且必须有自相关性
p p p阶自回归过程的公式定义:
y t = μ + ∑ i = 1 p γ i y t − i + ϵ t y_t = \mu + \sum_{i=1}^{p} \gamma_i y_{t-i} + \epsilon _t yt=μ+i=1∑pγiyt−i+ϵt
(今天和昨天)
,表示当前值和前 p p p个值是有关系的MA(移动平均模型)
它关注的是自回归模型中的误差项的累加
目的是消除预测中的随即波动,让误差越均衡越好
q q q阶自回归过程的公式定义:
y t = μ + ϵ t + ∑ i = 1 q θ i ϵ t − i y_t = \mu + \epsilon_t + \sum_{i=1}^q \theta_i \epsilon_{t-i} yt=μ+ϵt+i=1∑qθiϵt−i
ARMA(自回归移动平均模型)
自回归与移动平均的结合
公式定义:
y t = μ + ∑ i = 1 p + γ i y t − i + ϵ t + ∑ i = 1 q θ i ϵ t − i y_t = \mu + \sum_{i=1}^p + \gamma_i y_{t-i} + \epsilon_t + \sum_{i=1} ^q \theta_i \epsilon_{t-i} yt=μ+i=1∑p+γiyt−i+ϵt+i=1∑qθiϵt−i
ARIMA(p,d,q)(差分自回归移动平均模型)
(阶数)
以及随机误差项的现值和滞后值进行回归所建立的模型ACF和PACF是帮助我们选择超参 p 、 q p、q p、q的。
ACF(自相关函数)
PACF(偏自相关函数)
经常地,对一堆数据进行建模的时候,特别是分类和回归模型,我们有很多的变量可供使用,选择不同的变量组合可以得到不同的模型,例如我们有5个变量,2的5次方,我们将有32个变量组合,可以训练出32个模型。但是哪个模型更加的好呢?目前常用有如下方法:
三个模型A, B, C,在通过这些规则计算后,我们知道B模型是三个模型中最好的,但是不能保证B这个模型就能够很好地刻画数据,因为很有可能这三个模型都是非常糟糕的,B只是烂苹果中的相对好的苹果而已。
这些规则理论上是比较漂亮的,但是实际在模型选择中应用起来还是有些困难的,我们不可能对所有这些模型进行一一验证AIC, BIC,HQ规则来选择模型,工作量太大。关于AIC、BIC详细阐述见:https://zhuanlan.zhihu.com/p/142489599
平稳性检验
平稳性检验是整个时间序列分析的第一步,也就是说当我们拿到时序数据后的第一件事就是做平稳性检验。通常平稳性检验的方法有:单位根检验,来检验我们的序列是否符合平稳性。对于不符合平稳性的,我们需要将其转为平稳的数据,最常用的方法就是差分。对于已经符合平稳性检验的时序数据,那就可以跳过差分直接寻找最合适的模型参数即可。
通过平稳性检验后,发现它不满足平稳性要求,那就要通过差分变换来转平。
差分变换
一阶差分,即一次差分完后,再进行平稳性检验,如还不满足平稳性要求,在一阶差分的基础上进行二阶差分,以此类推知道满足平稳性要求。
当满足平稳性要求后,我们就需要进行白噪声检验。
白噪声检验
实际上就是纯随机性检验,比如通过Box-Pierce检验来判断我们的序列是否为白噪声:如果一个时间序列是纯随机的,得到一个观察期数为n的观察序列,那么该序列的延迟非零期的样本自相关系数将近似服从均值为0,方差为序列观察期数倒数的正态分布。
定阶
通过平稳性、白噪声检验之后,我们就可以确定ARIMA模型的参数,即通过ACF和PACF确定 p 、 q p、q p、q。当肉眼观察ACF、PACF图时,多数情况下会有多组值满足几阶后的点都趋向于0。可以使用ACI、BIC,来求得使模型更好的参数。
建模预测
在参数有了之后,我们就可以训练ARIMA模型进行预测了。
优缺点&使用场景
分享一篇好文章:https://ask.hellobi.com/blog/Tonysong2013/10964
马尔科夫链定义本身比较简单,它假设某一时刻状态转移的概率只依赖于它的前一个状态。举个形象的比喻,假如每天的天气是一个状态的话,那个今天是不是晴天只依赖于昨天的天气,而和前天的天气没有任何关系。当然这么说可能有些武断,但是这样做可以大大简化模型的复杂度,因此马尔科夫链在很多时间序列模型中得到广泛的应用,比如循环神经网络RNN,隐式马尔科夫模型HMM等。
如果用精确的数学定义来描述,则假设我们的序列状态是: … X t − 2 , X t − 1 , X t , X t + 1 , … \ldots X_{t-2},X_{t-1},X_t,X_{t+1},\ldots …Xt−2,Xt−1,Xt,Xt+1,…,那么我们在时刻 X t + 1 X_{t+1} Xt+1的状态的条件概率仅仅依赖于时刻 X t X_t Xt,即:
P ( X t + 1 ∣ … X t − 2 , X t − 1 , X t ) = P ( X t + 1 ∣ X t ) P(X_{t+1} | \ldots X_{t-2},X_{t-1},X_{t}) = P(X_{t+1} | X_t) P(Xt+1∣…Xt−2,Xt−1,Xt)=P(Xt+1∣Xt)
既然某一时刻状态转移的概率只依赖于它的前一个状态,那么我们只要能求出系统中任意两个状态之间的转换概率,这个马尔科夫链的模型就定了。我们来看看下图这个马尔科夫链模型的具体的例子(来源于维基百科)。
这个马尔科夫链是表示股市模型的,共有三种状态:牛市(Bull market), 熊市(Bear market)和横盘(Stagnant market)。每一个状态都以一定的概率转化到下一个状态。比如,牛市以0.025的概率转化到横盘的状态。这个状态概率转化图可以以矩阵的形式表示。如果我们定义矩阵 P P P某一位置 P ( i , j ) P(i,j) P(i,j) 的值为 P ( j ∣ i ) P(j|i) P(j∣i) ,即从状态 i i i 转化到状态 j j j 的概率,并定义牛市为状态0,熊市为状态1,横盘为状态2,这样我们得到了马尔科夫链模型的状态转移矩阵为:
0.9 0.075 0.025 0.15 0.8 0.05 0.25 0.25 0.5 (1) \begin{matrix} 0.9 & 0.075 & 0.025 \\ 0.15 & 0.8 & 0.05 \\ 0.25 & 0.25 & 0.5 \end{matrix} \tag{1} 0.90.150.250.0750.80.250.0250.050.5(1)
首先我们来看看什么样的问题解决可以用HMM模型。使用HMM模型时我们的问题一般有这两个特征:
1)我们的问题是基于序列的,比如时间序列,或者状态序列。
2)我们的问题中有两类数据,一类序列数据是可以观测到的,即观测序列;而另一类数据是不能观察到的,即隐藏状态序列,简称状态序列。
有了这两个特征,那么这个问题一般可以用HMM模型来尝试解决。这样的问题在实际生活中是很多的。比如:我现在在打字写博客,我在键盘上敲出来的一系列字符就是观测序列,而我实际想写的一段话就是隐藏序列,输入法的任务就是从敲入的一系列字符尽可能的猜测我要写的一段话,并把最可能的词语放在最前面让我选择,这就可以看做一个HMM模型了。再举一个,我在和你说话,我发出的一串连续的声音就是观测序列,而我实际要表达的一段话就是状态序列,你大脑的任务,就是从这一串连续的声音中判断出我最可能要表达的话的内容。
对于HMM模型,首先我们假设 Q Q Q是所有可能的隐藏状态的集合, V V V是所有可能的观测状态的集合,即:
Q = { q 1 , q 2 , … , q N } V = { v 1 , v 2 , … , v M } Q = \{q_1,q_2,\ldots,q_N\} \\ V = \{v_1,v_2,\ldots,v_M\} Q={ q1,q2,…,qN}V={ v1,v2,…,vM}
对于一个长度为 T T T的序列, I I I是对应的状态序列, O O O是对应的观察序列,即:
I = { i 1 , i 2 , … , i T } O = { o 1 , o 2 , … , o T } I = \{i_1,i_2,\ldots,i_T\} \\ O = \{o_1,o_2,\ldots,o_T\} I={ i1,i2,…,iT}O={ o1,o2,…,oT}
HMM模型做了两个很重要的假设:
a i j = P ( i t + 1 = q j ∣ i t = q i ) a_{ij} = P(i_{t+1} = q_j | i_t = q_i) aij=P(it+1=qj∣it=qi)
这样 a i j a_ij aij可以组成马尔科夫链的状态转移矩阵A:
A = [ a i j ] N ∗ N A = [a_{ij}]_{N*N} A=[aij]N∗N
g j ( k ) = P ( o t = v k ∣ i t = q j ) g_j(k) = P(o_t = v_k | i_t = q_j) gj(k)=P(ot=vk∣it=qj)
这样 b j ( k ) b_{j}(k) bj(k)可以组成观测状态生成的概率矩阵B:
B = [ b j ( k ) ] N ∗ M B = [b_{j}(k)]_{N*M} B=[bj(k)]N∗M
除此之外,我们需要一组在时刻 t = 1 t=1 t=1的隐藏状态概率分布 ∏ \prod ∏:
∏ = [ π ( i ) ] N , 其 中 π ( i ) = P ( i 1 = q i ) \prod = [π(i)]_N,其中 π(i) = P(i_1 = q_i) ∏=[π(i)]N,其中π(i)=P(i1=qi)
一个HMM模型,可以由隐藏状态初始概率分布 ∏ \prod ∏,状态转移概率矩阵A,观测状态概率矩阵B决定。 ∏ \prod ∏、A决定状态序列,B决定观测序列。因此HMM模型可以由一个三元组 λ \lambda λ表示:
λ = ( A , B , ∏ ) \lambda = (A, B, \prod) λ=(A,B,∏)
下面我们用一个简单的实例来描述上面抽象出的HMM模型。这是一个盒子与球的模型,例子来源于李航的《统计学习方法》。假设我们有3个盒子,每个盒子里都有红色和白色两种球,这三个盒子里球的数量分别是:
盒子 | 1 | 2 | 3 |
---|---|---|---|
红球数 | 5 | 4 | 7 |
白球数 | 5 | 6 | 3 |
按照下面的方法从盒子里抽球,开始的时候,从第一个盒子抽球的概率是0.2,从第二个盒子抽球的概率是0.4,从第三个盒子抽球的概率是0.4。以这个概率抽一次球后,将球放回。然后从当前盒子转移到下一个盒子进行抽球。规则是:如果当前抽球的盒子是第一个盒子,则以0.5的概率仍然留在第一个盒子继续抽球,以0.2的概率去第二个盒子抽球,以0.3的概率去第三个盒子抽球。如果当前抽球的盒子是第二个盒子,则以0.5的概率仍然留在第二个盒子继续抽球,以0.3的概率去第一个盒子抽球,以0.2的概率去第三个盒子抽球。如果当前抽球的盒子是第三个盒子,则以0.5的概率仍然留在第三个盒子继续抽球,以0.2的概率去第一个盒子抽球,以0.3的概率去第二个盒子抽球。如此下去,直到重复三次,得到一个球的颜色的观测序列:
O = { 红 白 , 白 , 红 } O = \{红白,白,红\} O={ 红白,白,红}
注意在这个过程中,观察者只能看到球的颜色序列,却不能看到球是从那个盒子里取出的。
那么我们按照上面HMM模型的定义,我们的观测集合是:
V = { 红 , 白 } , M = 2 V = \{红,白\},M=2 V={ 红,白},M=2
我们的状态集合是:
Q = { 盒 子 1 , 盒 子 2 , 盒 子 3 } , N = 3 Q=\{盒子1,盒子2,盒子3\},N=3 Q={ 盒子1,盒子2,盒子3},N=3
而观测序列和状态序列的长度为3
初始状态分布为:
∏ = ( 0.2 , 0.4 , 0.4 ) T \prod = (0.2,0.4,0.4)^T ∏=(0.2,0.4,0.4)T
状态转移概率分布矩阵为:
A = 0.5 0.2 0.3 0.3 0.5 0.2 0.2 0.3 0.5 (1) A = \begin{matrix} 0.5 & 0.2 & 0.3 \\ 0.3 & 0.5 & 0.2 \\ 0.2 & 0.3 & 0.5 \end{matrix} \tag{1} A=0.50.30.20.20.50.30.30.20.5(1)
观测状态概率矩阵为:
B = 0.5 0.5 0.4 0.6 0.7 0.3 (1) B = \begin{matrix} 0.5 & 0.5\\ 0.4 & 0.6\\ 0.7 & 0.3 \end{matrix} \tag{1} B=0.50.40.70.50.60.3(1)
从这个例子中,我们也可以抽象出HMM观测序列生成的过程。
评估观测序列的概率。
即给定模型 λ = ( A , B , ∏ ) \lambda=(A,B,\prod) λ=(A,B,∏)和观测序列 O = { o 1 , o 2 , … , o T } O=\{o_1,o_2,\ldots,o_T\} O={ o1,o2,…,oT},计算在模型 λ \lambda λ下观测序列 O O O出现的概率 P ( O ∣ λ ) P(O|\lambda) P(O∣λ)。这个问题的求解需要用到前向后向算法。
有关前向后向算法推荐文章:https://www.cnblogs.com/pinard/p/6955871.html
模型参数学习问题。
即给定观测序列 O O O,估计模型 λ \lambda λ的参数,使该模型下观测序列的条件概率 P ( O ∣ λ ) P(O|\lambda) P(O∣λ)最大。这个问题的求解需要用到基于EM的鲍姆-韦尔奇算法。
有关基于EM的鲍姆-韦尔奇算法推荐文章:https://www.cnblogs.com/pinard/p/6972299.html
预测问题,也成解码问题。
即给定模型 λ \lambda λ和观测序列 O O O,求给定观测序列条件下,最可能出现的对应的状态序列。这个问题求解需要用到基于动态规划的维比特算法
有关基于动态规划的维比特算法推荐:https://www.cnblogs.com/pinard/p/6991852.html
推荐复旦有关隐马尔科夫的白板推导:https://www.bilibili.com/video/BV1qC4y1H7RA?from=search&seid=8633811429380460161&spm_id_from=333.337.0.0
原创不易,转载请注明出处