朴素贝叶斯是贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入 x x x,利用贝叶斯定理求出后验概率最大的输出 y y y。
- 首先利用极大似然估计计算类别的先验概率和特征条件关于类别条件概率。
ps:其中可能会出现估计的概率值为0的情况,可以使用贝叶斯估计解决,当
λ = 1 \lambda=1 λ=1时为拉普拉斯平滑
- 利用特征条件独立和贝叶斯定理计算后验概率
- 最大化后验概率确定特征的类别
ps: 最大化后验概率等价于期望风险最小化,在《统计学习方法》中有过程的推导P49页,不过该推导过程使用的是0-1损失。 朴素贝叶斯是一种多分类的算法,损失函数通常选用对数损失。最大概率中有连乘,使用对数损失可以将其变为加法(个人理解)
朴素贝叶斯是基于统计概率的,因此不需要使用归一化
(1)先验概率和条件概率:
p ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) N , k = 1 , 2 , ⋅ ⋅ ⋅ , K p(Y=c_k) = \frac{\sum_{i=1}^NI(y_i=c_k)}{N}, k = 1, 2, \cdot\cdot\cdot, K p(Y=ck)=N∑i=1NI(yi=ck),k=1,2,⋅⋅⋅,K
p ( X ( j ) = a j l ∣ Y = c k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) ∑ i = 1 N I ( y i = c k ) , j = 1 , 2 , ⋅ ⋅ ⋅ , n ; l = 1 , 2 , ⋅ ⋅ ⋅ , S j ; k = 1 , 2 , ⋅ ⋅ ⋅ , K p(X^{(j)}=a_{jl} | Y=c_k) = \frac{\sum_{i=1}^NI(x_i^{(j)}=a_{jl}, y_i=c_k)}{\sum_{i=1}^NI(y_i=c_k)} , j = 1, 2, \cdot\cdot\cdot,n; l=1,2,\cdot\cdot\cdot,S_j; k=1,2,\cdot\cdot\cdot,K p(X(j)=ajl∣Y=ck)=∑i=1NI(yi=ck)∑i=1NI(xi(j)=ajl,yi=ck),j=1,2,⋅⋅⋅,n;l=1,2,⋅⋅⋅,Sj;k=1,2,⋅⋅⋅,K
(2)对于给定实例 x = ( x ( 1 ) , x ( 2 ) , ⋅ ⋅ ⋅ , x ( n ) ) x=(x^{(1)}, x^{(2)},\cdot\cdot\cdot,x^{(n)}) x=(x(1),x(2),⋅⋅⋅,x(n)),计算
P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) , k = 1 , 2 , ⋅ ⋅ ⋅ , K P(Y=c_k)\prod_{j=1}^nP(X^{(j)}=x^{(j)} | Y=c_k), k=1, 2, \cdot\cdot\cdot,K P(Y=ck)j=1∏nP(X(j)=x(j)∣Y=ck),k=1,2,⋅⋅⋅,K
(3)确定实例x的类
y = a r g m a x c k P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) , k = 1 , 2 , ⋅ ⋅ ⋅ , K y=argmax_{c_k}P(Y=c_k)\prod_{j=1}^nP(X^{(j)}=x^{(j)} | Y=c_k), k=1, 2, \cdot\cdot\cdot,K y=argmaxckP(Y=ck)j=1∏nP(X(j)=x(j)∣Y=ck),k=1,2,⋅⋅⋅,K
朴素贝叶斯的公式可表示为:
y = P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) ∑ k P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) , k = 1 , 2 , ⋅ ⋅ ⋅ , K y=\frac{P(Y=c_k)\prod_{j=1}^nP(X^{(j)}=x^{(j)} | Y=c_k)}{\sum_kP(Y=c_k)\prod_{j=1}^nP(X^{(j)}=x^{(j)} | Y=c_k)}, k=1, 2, \cdot\cdot\cdot,K y=∑kP(Y=ck)∏j=1nP(X(j)=x(j)∣Y=ck)P(Y=ck)∏j=1nP(X(j)=x(j)∣Y=ck),k=1,2,⋅⋅⋅,K
优点:
缺点:
优化:
① 将计算先验概率时使用的极大似然估计替换为贝叶斯估计,其中典型的是分子上加1的拉普拉斯概率, 减少0出现的概率
② (选答,不追问就不答出来吧)在做文本分类时可以进行 关键字的提取(TF-IDF, 建立词库等)、进行词语组合
决策树可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。它是一种对实例进行分类的树形结构。决策树由结点和有向边组成。结点有两种类型:内部结点和叶结点。内部结点表示一个特征或属性,叶结点表示一个类。 学习室,利用训练数据,根据损失函数最小化的原则建立决策树模型;预测时,对新的数据,利用决策树模型进行分类。 它主要包括3个步骤:特征选择、决策树的生成和决策树的修减。
优点:模型具有可读性、分类速度快
信息增益: 表示得知特征X的信息而使得类Y的信息的不确定性减少程度。决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征。(举个栗子:极端情况时,当某一个特征的取值情况等于样本个数时,此时该特征便可以将数据集完全划分,而当某一特征取值只有一种情况时,此时便对分类没有任何帮助。数学语言描述的话就是取值较多的特征的熵值较大)
信息增益比: 特征 A A A对训练数据集 D D D的信息增益比 g R ( D , A ) g_R(D,A) gR(D,A)定义为其信息增益 g ( D , A ) g(D,A) g(D,A)与训练数据集 D D D关于特征 A A A的值的熵 H A ( D ) H_A(D) HA(D)之比,即 g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D,A) = \frac{g(D,A)}{H_A(D)} gR(D,A)=HA(D)g(D,A)其中, H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ l o g 2 ∣ D i ∣ ∣ D ∣ H_A(D)=-\sum_{i=1}^n\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|} HA(D)=−∑i=1n∣D∣∣Di∣log2∣D∣∣Di∣, n n n是特征 A A A取值的个数。
需要注意的是,信息增益比对可取值数目较少的属性有所偏好,因此, C 4.5 C4.5 C4.5算法并不是直接选择信息增益比最大的候选划分属性,而是使用一个启发式:先从候选划分属性中选出信息增益高于平均水平的属性,再从中选择信息增益比最高的。
在信息论与概率统计中,熵是表示随机变量不确定性的度量。设X是一个取有限个值的离散随机变量,其概率分布为: P ( X = x i ) = p i , i = 1 , 2 , . . . , n P(X=x_i) = p_i, i = 1, 2, ..., n P(X=xi)=pi,i=1,2,...,n,则随机变量X的熵定义为 H ( X ) = − ∑ i = 1 n p i l o g p i H(X)=-\sum_{i=1}^np_ilogp_i H(X)=−∑i=1npilogpi。熵只依赖于X的分布,而与X的取值无关,所以也可将X的熵记作H§,即 H ( p ) = − ∑ i = 1 n p i l o g p i H(p)=-\sum_{i=1}^np_ilogp_i H(p)=−∑i=1npilogpi。熵越大,随机变量的不确定性就越大。
条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X)表示在已知随机变量 X X X的条件下随机变量 Y Y Y的不确定性。随机变量 X X X给定的条件随机变量 Y Y Y的条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X)定义为 X X X给定条件下 Y Y Y的条件概率分布的熵对 X X X的数学期望。 H ( Y ∣ X ) = ∑ i = 1 n p i H ( Y ∣ X = x i ) = − ∑ x , y p ( x , y ) l o g p ( y ∣ x ) H(Y|X)=\sum_{i=1}^np_iH(Y|X=x_i)=-\sum_{x,y}p(x,y)logp(y|x) H(Y∣X)=∑i=1npiH(Y∣X=xi)=−∑x,yp(x,y)logp(y∣x)
特征选择的目的在于选取对训练数据能够正确分类的特征。特征选择的关键是其准则。常用的准则如下:
- (1)样本集合的信息增益(ID3)
{ g ( D , A ) = H ( D ) − H ( D ∣ A ) H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ l o g 2 ∣ C k ∣ ∣ D ∣ H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H ( D i ) \left\{ \begin{array}{c} g(D,A) = H(D) - H(D|A) \\ H(D) = -\sum_{k = 1} ^ K \frac{|C_k|}{|D|}log_2\frac{|C_k|}{|D|} \\ H(D|A) = \sum_{i = 1} ^ n \frac{|D_i|}{|D|}H(D_i) \end{array} \right. ⎩⎪⎨⎪⎧g(D,A)=H(D)−H(D∣A)H(D)=−∑k=1K∣D∣∣Ck∣log2∣D∣∣Ck∣H(D∣A)=∑i=1n∣D∣∣Di∣H(Di)
其中 H ( D ) H(D) H(D)是数据集D的熵, H ( D i ) H(D_i) H(Di)是数据集 D i D_i Di的熵, H ( D ∣ A ) H(D|A) H(D∣A)是数据集D对特征A的条件熵. D i D_i Di是 D D D中特征A取第 i i i个值的样本子集, C k C_k Ck是 D D D中属于第 k k k类的样本子集。 n n n是特征 A A A取值的个数, K K K是类的个数
- (2) 样本集合D对特征A的信息增益比(C4.5)
g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D,A)=\frac{g(D,A)}{H_A(D)} gR(D,A)=HA(D)g(D,A)
H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ log ∣ D i ∣ ∣ D ∣ H_A(D) = -\sum_{i=1}^n \frac{|D_i|}{|D|} \log \frac{|D_i|}{|D|} HA(D)=−i=1∑n∣D∣∣Di∣log∣D∣∣Di∣
其中 g ( D , A ) g(D,A) g(D,A)是信息增益, H A ( D ) H_A(D) HA(D)是 D D D关于特征A的值的熵- (3) 样本集合D的基尼指数(CART)
G i n i ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(D) = 1-\sum_{k=1}^K \left (\frac{|C_k|}{|D|} \right)^2 Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2
特征A条件下集合D的基尼指数:
G i n i ( D , A ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ G i n i ( D 2 ) Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1) + \frac{|D_2|}{|D|}Gini(D_2) Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)
决策树的生成通常使用信息增益最大、信息增益比最大或基尼指数最小作为特征选择的准则。决策树的生成往往通过计算每个特征的信息增益或者其他指标,从根结点开始,递归产生决策树。决策树的生成往往产生一个局部最优的树。
CART分类树使用的是基尼指数(见上一题)
CART回归树使用的是平方误差最小化准则
构建回归树选择最优切分变量j和切分点s,求解
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 ] (1) min_{j, s}\bigg[ min_{c_1}\sum_{x_i \in R_1(j, s)}(y_i - c_1)^2 + min_{c_2} \sum_{x_i \in R_2(j, s)} (y_i - c_2)^2 \bigg] \tag 1 minj,s[minc1xi∈R1(j,s)∑(yi−c1)2+minc2xi∈R2(j,s)∑(yi−c2)2](1) 遍历变量 j j j,对固定的切分变量 j j j扫描切分点 s s s,选择使得式(1)达到最小值的对 ( j , s ) (j, s) (j,s)
c 1 ^ = a v g ( y i ∣ x i ∈ R 1 ( j , s ) ) c 2 ^ = a v g ( y i ∣ x i ∈ R 2 ( j , s ) ) \hat{c_1} = avg(y_i | x_i \in R_1(j,s)) \\ \hat{c_2} = avg(y_i | x_i \in R_2(j,s)) c1^=avg(yi∣xi∈R1(j,s))c2^=avg(yi∣xi∈R2(j,s))
- 没有特征可以选择了
- 所有特征的信息增益均很小(小于某个阈值)或者样本集的基尼指数小于预定阈值(样本基本属于同一类),或所有样例都具有相同的目标属性值(即训练数据子集被正确分类了)
- 结点中的样本个数小于预定阈值
《机器学习》: 决策树的剪枝策略有“预剪枝”和“后剪枝”。预剪枝是指在决策树生成过程中,对每个结点在划分前先进行评估,若当前节点的划分不会带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点;后剪枝则是先从训练集生成一颗完整的决策树然后自底向上地对非叶结点进行考察,若将该节点对应的子树替换为叶结点能带来泛化性能提升,则将该子树替换为叶结点。
预剪枝使得决策树的很多分支都没有展开,这不仅降低了过拟合的风险,也显著减少了决策树的训练时间开销和测试时间开销。但另一方面,有些分支虽不能提升泛化性能、甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致性能显著提高;预剪枝基于“贪心”本质禁止这些分支展开,给预剪枝决策树带来了欠拟合的风险。
后剪枝决策树通常比预剪枝决策树保留了很多的分支。一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大很多。
《统计学习方法》则是从损失函数的角度进行了回答。决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现。设树 T T T的叶结点个数为 ∣ T ∣ |T| ∣T∣, t t t是树 T T T的叶结点,该叶结点有 N t N_t Nt个样本点,其中 k k k类的样本点有 N t k N_{tk} Ntk个, k = 1 , 2 , . . . , k k=1, 2, ..., k k=1,2,...,k, H t ( T ) H_t(T) Ht(T)位叶结点 t t t上的经验熵, α ≥ 0 \alpha \geq 0 α≥0为参数,则决策树学习的损失函数可以定义为 C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ C_{\alpha}(T) = \sum_{t=1}^{|T|}N_tH_t(T) + \alpha|T| Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣
其中经验熵为 H t ( T ) = − ∑ k N t k N t l o g N t k N t H_t(T) = -\sum_k\frac{N_{tk}}{N_t}log\frac{N_{tk}}{N_t} Ht(T)=−k∑NtNtklogNtNtk
在损失函数中,将第一项记作: C ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) = − ∑ t = 1 ∣ T ∣ ∑ k = 1 K N t k l o g N t k N t C(T) = \sum_{t=1}^{|T|}N_tH_t(T) = -\sum_{t=1}^{|T|}\sum_{k=1}^K N_{tk}log\frac{N_{tk}}{N_t} C(T)=t=1∑∣T∣NtHt(T)=−t=1∑∣T∣k=1∑KNtklogNtNtk
这是有:
C α ( T ) = C ( T ) + α ∣ T ∣ C_{\alpha}(T)=C(T) + \alpha |T| Cα(T)=C(T)+α∣T∣
C ( T ) C(T) C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度, ∣ T ∣ |T| ∣T∣表示模型复杂度,参数 α ≥ 0 \alpha \geq 0 α≥0控制两者之间的影响。较大的 α \alpha α促使选择较简单的模型,较小的 α \alpha α促使选择较复杂的模型。当 α \alpha α确定,选择损失函数最小的模型。损失函数用来平衡模型复杂度和与训练数据拟合程度。
损失函数的极小化等价于正则化的极大似然估计,所以,利用损失函数最小原则进行剪枝就是用正则化极大似然估计进行模型选择。
CART树的剪枝
CART剪枝算法:1. 从生成算法产生的决策树 T 0 T_0 T0底端开始不断剪枝,直到 T 0 T_0 T0的根结点,形成一个子树序列 { T 0 , T 1 , ⋯ , T n } \{ T_0, T_1, \cdots, T_n \} {T0,T1,⋯,Tn}; 2. 通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。
损失函数: C α ( T ) = C ( T ) + α ∣ T ∣ C_{\alpha}(T) = C(T) + \alpha|T| Cα(T)=C(T)+α∣T∣, α \alpha α权衡训练数据的拟合程度与模型的复杂度。
从整体树 T 0 T_0 T0开始剪枝。对 T 0 T_0 T0的任意内部结点 t t t,以 t t t为单结点树的损失函数是 C α = C ( t ) + α C_{\alpha} = C(t) + \alpha Cα=C(t)+α
以 t t t为根结点的子树 T t T_t Tt的损失函数是 C α ( T t ) = C ( T t ) + α ∣ T t ∣ C_{\alpha}(T_t) = C(T_t) + \alpha|T_t| Cα(Tt)=C(Tt)+α∣Tt∣
当 α = 0 \alpha=0 α=0及 α \alpha α充分小时,有不等式 C α ( T t ) < C α ( t ) (1) C_{\alpha}(T_t) < C_{\alpha}(t) \tag{1} Cα(Tt)<Cα(t)(1)
当 α \alpha α增大时,在某一 α \alpha α有 C α ( T t ) = C α ( t ) C_{\alpha}(T_t) = C_{\alpha}(t) Cα(Tt)=Cα(t)
当 α \alpha α再增大时,不等式(1)反向。只要 α = C ( t ) − C ( T t ) ∣ T t ∣ − 1 \alpha=\frac{C(t)-C(T_t)}{|T_t|-1} α=∣Tt∣−1C(t)−C(Tt), T t T_t Tt与 t t t有相同的损失函数值,而 t t t的节点少,因此 t t t比 T t T_t Tt更可取,对 T t T_t Tt进行剪枝。(损失函数相同时,偏向于选择结点少的树【奥姆剃刀原理】)
为此,对 T 0 T_0 T0中每一内部结点 t t t,计算 g ( t ) = C ( t ) − C ( T t ) ∣ T t ∣ − 1 g(t)=\frac{C(t)-C(T_t)}{|T_t|-1} g(t)=∣Tt∣−1C(t)−C(Tt)它表示剪枝后整体损失函数减少的程度。在 T 0 T_0 T0中减去 g ( t ) g(t) g(t)最小的 T t T_t Tt,将得到的子树作为 T 1 T_1 T1,同时将最小的 g ( t ) g(t) g(t)设为 α 1 \alpha_1 α1. T 1 T_1 T1为区间 [ α 1 , α 2 ) [\alpha_1, \alpha_2) [α1,α2)的最优子树。
如此剪枝下去,直至得到根结点。在这个过程中,不断增加 α \alpha α的值,产生新的区间。
连续属性的可取值不再有限,不能像处理离散属性那样进行枚举来对结点进行划分,需要将连续属性离散化。常用的离散化策略是二分法。虽然本质上属性的取值是连续的,但对于有限的采样数据它是离散的。
- 首先对特征的取值进行排序。
选取其中的一个点t作为划分点,左子树满足该属性值小于等于t,右子树满足该属性值大于t。
- 两个特征取值之间的中位点作为可能的分裂点,将数据集分成两部分,计算每个可能的分裂点的信息增益或者信息增益比或者Gini指数。
- 如同处理离散属性值那样考虑这个划分点,选择最优的划分点对样本集合的划分
【注意:与离散属性不同的是,若当前结点划分属性为连续属性,该属性还可以作为其后代结点的划分属性。
抛弃缺失值: 如果样本数量很多,包含缺失值的样本数量较少的情况下可以考虑直接将哪些含有缺失值的样本直接丢弃,当然这种情况很少发生。
概率化缺失值。
- 特征的选择(如何计算信息增益或者信息增益比)。 在选择分裂属性的时候,训练样本存在缺失值,如何处理?(计算分裂损失减少值时,忽略特征缺失的样本,最终计算的增益值乘以没有缺失值样例占总样例的比例(实际参与计算的样本数除以总的样本数))
假如你使用ID3算法,那么选择分类属性时,就要计算所有属性的熵增(信息增益,Gain)。假设10个样本,属性是a,b,c。在计算a属性熵时发现,第10个样本的a属性缺失,那么就把第10个样本去掉,前9个样本组成新的样本集,在新样本集上按正常方法计算a属性的熵增。然后结果乘0.9(新样本占raw样本的比例),就是a属性最终的熵。- 对于缺失值样本的处理。 分类属性选择完成,对训练样本分类,发现样本属性缺失怎么办?(将该样本分配到所有子节点中,权重由1变为具有属性a的样本被划分成的子集样本个数的相对比率,计算错误率的时候,需要考虑到样本权重)
比如该节点是根据a属性划分,但是待分类样本a属性缺失,怎么办呢?假设a属性离散,有1,2两种取值,那么就把该样本分配到两个子节点中去,但是权重由1变为相应离散值个数占样本的比例。然后计算错误率的时候,注意,不是每个样本都是权重为1,存在分数。- 测试样本属性也有缺失值。 训练完成,给测试集样本分类,有缺失值怎么办?(分类时,如果待分类样本有缺失变量,而决策树决策过程中没有用到这些变量,则决策过程和没有缺失的数据一样;否则,如果决策要用到缺失变量,决策树也可以在当前节点做多数投票来决定(选择样本数最多的特征值方向)。)
- (1)如果有单独的缺失分支,使用此分支。
- (2)把待分类的样本的属性a值分配一个最常出现的a的属性值,然后进行分支预测。
- (3)根据其他属性为该待分类样本填充一个属性a值,然后进行分支处理。
- (4)在决策树中属性a节点的分支上,遍历属性a节点的所有分支,探索可能所有的分类结果,然后把这些分类结果结合起来一起考虑,按照概率决定一个分类。
- (5)待分类样本在到达属性a节点时就终止分类,然后根据此时a节点所覆盖的叶子节点类别状况为其分配一个发生概率最高的类。
信息熵: H ( p ) = − ∑ i = 1 K p i log p i H(p) = -\sum_{i=1}^Kp_i\log{p_i} H(p)=−∑i=1Kpilogpi
泰勒一阶展开: f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + o ( x 0 ) f(x) = f(x_0) + f^{\prime}(x_0)(x-x_0) + o(x_0) f(x)=f(x0)+f′(x0)(x−x0)+o(x0)
f ( x ) = − log x f(x)=-\log x f(x)=−logx在 x = 1 x=1 x=1处的泰勒一阶展开为: − log x = − ( 0 + 1 ∗ ( x − 1 ) + o ( 1 ) ) = 1 − x -\log x = -(0 + 1 * (x-1) + o(1)) = 1-x −logx=−(0+1∗(x−1)+o(1))=1−x将该式代入信息熵中:
H ( p ) = − ∑ i = 1 K p i log p i = ∑ i = 1 K p i ( − log p i ) = − ∑ i = 1 K p i ( 1 − p i ) H(p) = -\sum_{i=1}^Kp_i\log{p_i} = \sum_{i=1}^Kp_i(-\log{p_i}) = -\sum_{i=1}^Kp_i(1-p_i) H(p)=−∑i=1Kpilogpi=∑i=1Kpi(−logpi)=−∑i=1Kpi(1−pi)
基尼指数: G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(p) = \sum_{k=1}^Kp_k(1-p_k) = 1-\sum_{k=1}^Kp_k^2 = 1 - \sum_{k=1}^K(\frac{|C_k|}{|D|})^2 Gini(p)=∑k=1Kpk(1−pk)=1−∑k=1Kpk2=1−∑k=1K(∣D∣∣Ck∣)2
基尼指数是信息熵在 x = 1 x=1 x=1处的一阶泰勒展开
bagging方法是一种在原始数据集上采用自助采样法(其实就是有放回的采用,这种方式大约会有 ( 1 − 1 m ) m = 1 e (1 - \frac{1}{m})^m = \frac{1}{e} (1−m1)m=e1的数据不被采样到)训练基学习器,在将基学习器进行结合。分类任务使用投票的方式集成,而回归任务通过平均的方式集成。常见的bagging算法有RF
Boosting是一种可将弱学习器提升为强学习器的算法。它是一种高度自适应的方法顺序地学习这些弱学习器(每个基础模型都依赖于前面的模型),并且按照某种确定性的侧率将它们组合起来。关于Boosting的两个核心问题:
1. 在每一轮如何改变训练数据的权值或概率分布?
通过提高那些在前一轮被弱分类器分错样本的权值,减小前一轮分对样本的权值,而误分的样本在后续收到更多的关注。
2. 通过什么方式来组合弱分类器?
通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。
常见的boosting算法有AdaBoost,梯度提升决策树GBDT,XGBoost以及LightGBM
Stacking是一种结合策略,它不是对弱学习器的结果做简单的投票或者平均处理,而是再加上一层学习器,是将训练集弱学习器的学习结果作为输入,将训练集的输出作为输出,重新训练一个学习器来得到最终的结果。
基于串行策略:初级学习器与次级学习器之间存在依赖关系,初学习器的输出作为次级学习器的输入。
基本思路:
先从初始训练集训练T个不同的初级学习器
利用每个初级学习器的输出构建一个次级数据集,该数据集依然使用初始数据集的标签
根据新的数据集训练次级学习器
多级学习器的构建过程类似
approach | 优点 |
---|---|
Bagging | 1.训练一个Bagging集成与直接使用基分类器算法训练一个学习器的复杂度同阶,说明bagging是一个高效的集成学习算法 2. Bagging能不经过修改直接用于多分类、回归等任务 3. 每个基学习器只使用63.2%的数据,所以剩下的36.8%的数据可以用来做验证集来对泛化性能进行“包外估计” |
Boosting | 1. boosting往往具有更高的准确性 |
从偏差——方差的角度来说,boosting主要关注减小偏差,而Bagging主要关注降低方差
树集成模型主要有两种实现方式,分别是Bagging和Boosting。二者的区别主要有以下四点:
1)样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的.
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化.而权值是根据上一轮的分类结果进行调整.
2)样例权重:
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大.
3)预测函数:
Bagging:所有预测函数的权重相等.
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重.
4)并行计算:
Bagging:各个预测函数可以并行生成
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果.
方差的定义: V a r ( X ) = E [ ( X − E [ X ] ) 2 ] Var(X) = E[(X-E[X])^2] Var(X)=E[(X−E[X])2],表示X与平均值 E [ X ] E[X] E[X]之间差异的平方的期望值,用于刻画 X X X取值的散布程度
方差的两个重要的性质:
通常降低模型方差的方法之一是将多个模型平均起来。假设有n个独立同分布的模型,每个模型的方差均为 σ 2 \sigma^{2} σ2,则利用方差的两个性质可得:
Var ( 1 n ∑ i = 1 n X i ) = 1 n 2 Var ( ∑ i = 1 n X i ) = σ 2 n \operatorname{Var}\left(\frac{1}{n} \sum_{i=1}^{n} X_{i}\right)=\frac{1}{n^{2}} \operatorname{Var}\left(\sum_{i=1}^{n} X_{i}\right)=\frac{\sigma^{2}}{n} Var(n1i=1∑nXi)=n21Var(i=1∑nXi)=nσ2
这样模型均值的方差仅为单模型方差的 1 n \frac{1}{n} n1。然而在只有一个数据集的情况下只能训练出一个模型,没有办法取平均。所以为了缓解这个问题,可以采用有放回抽样来模拟生成多个数据集,将每个数据集训练得到的模型平均来降低方差,这就是Bagging的思想。
Bagging
设单模型的期望为 μ \mu μ ,则Bagging的期望预测为
E ( 1 n ∑ i = 1 n X i ) = 1 n E ( ∑ i = 1 n X i ) = E ( X i ) ≈ μ E\left(\frac{1}{n} \sum_{i=1}^{n} X_{i}\right)=\frac{1}{n} E\left(\sum_{i=1}^{n} X_{i}\right)=E\left(X_{i}\right) \approx \mu E(n1i=1∑nXi)=n1E(i=1∑nXi)=E(Xi)≈μ
说明Bagging整体模型的期望近似于单模型的期望,这意味整体模型的偏差也与单模型的偏差近似,所以Bagging通常选用偏差低的强学习器。
Bagging的抽样是有放回抽样,这样数据集之间会有重复的样本,因为违反了独立性的假设。在这种情况下设但模型之间具有相关系数 0 < ρ < 1 0<\rho<1 0<ρ<1,则模型均值的方差为:
Var ( 1 n ∑ i = 1 n X i ) = σ 2 n + n − 1 n ρ σ 2 = 1 + ( n − 1 ) ρ n σ 2 < σ 2 \operatorname{Var}\left(\frac{1}{n} \sum_{i=1}^{n} X_{i}\right)=\frac{\sigma^{2}}{n}+\frac{n-1}{n} \rho \sigma^{2}=\frac{1+(n-1)\rho}{n} \sigma^2 < \sigma^2 Var(n1i=1∑nXi)=nσ2+nn−1ρσ2=n1+(n−1)ρσ2<σ2
上式中随着n增大,第一项趋于0,第二项趋向于 ρ σ 2 \rho \sigma^2 ρσ2,所以Bagging能够降低整体的方差。而Bagging的拓展算法——随机森林,则在通过在树内部结点分类过程中,随机选取固定数量的特征纳入分裂的候选项,这样就进一步降低了单模型之间相关性,总体模型的方差也比Bagging更低。
强烈推荐: https://www.cnblogs.com/massquantity/p/9174746.html
GBDT中梯度提升其实是去预估残差值的
GBDT: 利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值
GBDT基本原理是通过多轮迭代,每轮迭代产生一个弱学习器(利用CART回归树构建),每个学习器在上一轮的分类器的残差基础上进行训练。
GBDT利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值,拟合一个回归树
L ( y , f t ( x ) ) = L ( y , f t − 1 ( x ) + h t ( x ) ) L(y,f_t(x))=L(y,f_{t−1}(x)+h_t(x)) L(y,ft(x))=L(y,ft−1(x)+ht(x))
r t i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f t − 1 ( x ) r_{ti}=−\bigg [\frac{∂L(y_i,f(x_i))}{∂f(x_i)}\bigg ]_{f(x)=f_{t−1}(x)} rti=−[∂f(xi)∂L(yi,f(xi))]f(x)=ft−1(x)
因为函数空间的梯度下降。
函数空间的梯度下降
首先回顾一下梯度下降,机器学习的一大主要步骤是通过优化方法最小化损失函数 L ( θ ) L(\theta) L(θ),进而求出对应的参数 θ \theta θ。梯度下降的景点的数值优化方法,其参数更新公式:
θ = θ − α ⋅ ∂ ∂ θ L ( θ ) \theta=\theta-\alpha \cdot \frac{\partial}{\partial \theta} L(\theta) θ=θ−α⋅∂θ∂L(θ)
Gradient Boosting 采用和AdaBoost同样的加法模型,在第m次迭代中,前m-1个基学习器都是固定的,即
f m ( x ) = f m − 1 ( x ) + ρ m h m ( x ) f_{m}(x)=f_{m-1}(x)+\rho_{m} h_{m}(x) fm(x)=fm−1(x)+ρmhm(x)
因而在第m步我们的目标是最小化损失函数 L ( f ) = ∑ i = 1 N L ( y i , f m ( x i ) ) L(f)=\sum_{i=1}^{N} L\left(y_{i}, f_{m}\left(x_{i}\right)\right) L(f)=∑i=1NL(yi,fm(xi)),进而求得相应的基学习器。若将 f ( x ) f(x) f(x)当成参数,则同样可以使用梯度下降法:
f m ( x ) = f m − 1 ( x ) − ρ m ⋅ ∂ ∂ f m − 1 ( x ) L ( y , f m − 1 ( x ) ) f_{m}(x)=f_{m-1}(x)-\rho_{m} \cdot \frac{\partial}{\partial f_{m-1}(x)} L\left(y, f_{m-1}(x)\right) fm(x)=fm−1(x)−ρm⋅∂fm−1(x)∂L(y,fm−1(x))
将 h m ( x ) ≈ − ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) h_{m}(x) \approx-\frac{\partial L\left(y, f_{m-1}(x)\right)}{\partial f_{m-1}^{(x)}} hm(x)≈−∂fm−1(x)∂L(y,fm−1(x)),即用基学习器 h m ( x ) h_m(x) hm(x)拟合前一轮模型损失函数的负梯度,就是通过梯度下降法最小化 L ( f ) L(f) L(f)。由于 f ( x ) f(x) f(x)实际为函数,所以该方法被认为是函数空间的梯度下降。
负梯度也被称为“响应”或“伪残差”,从名字可以看出是一个与残差接近的概念。直觉上来看,残差 r = y − f ( x ) r=y-f(x) r=y−f(x)越大,表明前一轮学习器 f ( x ) f(x) f(x)的结果与真实值 y y y相差较大,那么下一轮学习器通过拟合残差或负梯度,就能纠正之前学习器犯错较大的地方。
GBDT分裂会选取使得误差下降最多的特征进行分类。因为GBDT使用的基学习器是CART回归树,因此是根据分裂结点的CART回归树的平方误差最小化来选择特征进行分裂的。CART回归树使用的是平方误差最小化准则来选择分裂结点的。如果这棵树拟合不好,要么就通过负梯度计算出新的残差向量来拟合新的cart回归树
如何停止分裂?
设置 1. 结点分裂时最小样本数 2.树的最大深度 3. 最大叶子节点数 4. loss满足约束条件 5.子树的残差和阈值等
GBDT如何进行选择特征
GBDT中特征j的全局重要度通过特征j在单棵树中的重要度的平均值来衡量。通过遍历来寻找最优的切分变量和最优分割点。
在构建CART树是使用了损失函数的负梯度。使用损失函数的梯度可以保证损失函数的最小值。因此GBDT的梯度提升体现在构建CART树所需的负梯度阶段
GBDT是拟合残差,需要将每次拟合残差的基学习器组合起来
GBDT主要是利用残差逼近的方式,这就意味每棵树的值是连续的可叠加的,这一点和回归树输出连续值是一致的;如果采用分类树,那么残差逼近进行叠加就会没有意义,这个是GBDT的基础原理决定。
- Shrinkage:其实对应的就是学习率啦,是在每一轮迭代获取最终学习器的时候按照一定的步长进行更新。因此这样往往需要更多的学习器。
- 子采样(subsample),采用的是不放回采样。该值取值范围(0,1],选择小于1的比例可以减少方差,防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。
使用了子采样的GBDT有时也称作随机梯度提升树(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采样,程序可以通过采样分发到不同的任务去做boosting的迭代过程,最后形成新树,从而减少弱学习器难以并行迭代的弱点。 (因此GBDT的并行化是在特征上的)- CART回归树进行正则化剪枝(详情需要参考CART树剪枝)
- Early Stopping, 将数据集划分为训练集和测试集,在训练过程中不断检查测试集上的表现,如果测试集上的准确率下降到一定阈值之下,则停止训练,选用当前的迭代次数m
- 限制数的复杂度, 常用的方法是限制树的深度,以及设定叶子结点个数
GBDT的并行是在特征层面上来做的
- 计算每个样本的负梯度;
- 分裂挑选最佳特征及其分割点时,对特征计算相应的误差及均值时;
- 更新每个样本的负梯度时;
(1)不是,因为生成单棵决策树时,损失函数极小值与样本数量N不是线性相关的
(2)不是 因为每个树的成型时间复杂度O(N)不同
(3)不是, 叶子结点数和每棵树的生成的时间复杂度O(N)不成正比
在生成树的过程中,加入树不平衡的约束条件。这种约束条件可以是用户自定义的。例如对样本集中分到某个节点,而另一个节点的样本很少的情况进行惩罚
(1)归一化后加快了梯度下降求最优解的速度
(2) 归一化有可能提高精度
因为采用的是CART回归树,使用的是平方差损失,如果不进行归一化,因为量纲的不同会偏向于值较大的那个特征,影响模型的精度
未压缩的决策树的时间复杂度为: O ( m ∗ n l o g n ) O(m * nlogn) O(m∗nlogn),n是样本数,m是特征数量。随机森林选用mtry个特征,如果串行的构建ntree棵树的话,那么时间复杂度为 O ( n t r e e ∗ m t r y ∗ n l o g n ) O(ntree*mtry*nlogn) O(ntree∗mtry∗nlogn),从结果中看出,随机森林的时间复杂度与训练样本数量是有关的。
随机性主要表现在两个方面: 一个是样本抽样的随机,另一个是特征抽样的随机
推荐: https://www.cnblogs.com/massquantity/p/9794480.html
KaTeX parse error: Undefined control sequence: \cal at position 1: \̲c̲a̲l̲{L}(\phi) = \su…
将目标函数改写KaTeX parse error: Undefined control sequence: \cal at position 1: \̲c̲a̲l̲{L}(\phi) = \su…
使用平方差损失,按照公式展开,其中与 f t ( x i ) f_t(x_i) ft(xi)无关的项 c o n s t a n t constant constant常数
KaTeX parse error: Undefined control sequence: \cal at position 2: \̲c̲a̲l̲{L}(\phi) = \s…
主要使用的思想是泰勒二阶展开 f ( x + Δ x ) ≃ f ( x ) + f ′ ( x ) Δ x + 1 2 f ′ ′ ( x ) Δ x 2 f(x+\Delta x) \simeq f(x)+f^{\prime}(x) \Delta x+\frac{1}{2} f^{\prime \prime}(x) \Delta x^{2} f(x+Δx)≃f(x)+f′(x)Δx+21f′′(x)Δx2
定义每个数据点在误差函数上的一阶导数和二阶导数:
g i = ∂ y ^ ( t − 1 ) l ( y i , y ^ ( t − 1 ) ) , h i = ∂ y ^ ( t − 1 ) 2 l ( y i , y ^ ( t − 1 ) ) g_{i}=\partial_{\hat{y}^{(t-1)}} l\left(y_{i}, \hat{y}^{(t-1)}\right), \quad h_{i}=\partial_{\hat{y}^{(t-1)}}^{2} l\left(y_{i}, \hat{y}^{(t-1)}\right) gi=∂y^(t−1)l(yi,y^(t−1)),hi=∂y^(t−1)2l(yi,y^(t−1))
目标函数写作
L ( t ) ≃ ∑ i = 1 n [ l ( y i , y ^ ( t − 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) \mathcal{L}^{(t)} \simeq \sum_{i=1}^{n}\left[l\left(y_{i}, \hat{y}^{(t-1)}\right)+g_{i} f_{t}\left(\mathbf{x}_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(\mathbf{x}_{i}\right)\right]+\Omega\left(f_{t}\right) L(t)≃i=1∑n[l(yi,y^(t−1))+gift(xi)+21hift2(xi)]+Ω(ft)
如果损失定义为平方损失的话:
g i = ∂ y ^ ( t − 1 ) ( y ^ ( t − 1 ) − y i ) 2 = 2 ( y ^ ( t − 1 ) − y i ) h i = ∂ y ^ ( t − 1 ) 2 ( y i − y ^ ( t − 1 ) ) 2 = 2 g_{i}=\partial_{\hat{y}^{(t-1)}}\left(\hat{y}^{(t-1)}-y_{i}\right)^{2}=2\left(\hat{y}^{(t-1)}-y_{i}\right) \quad h_{i}=\partial_{\hat{y}^{(t-1)}}^{2}\left(y_{i}-\hat{y}^{(t-1)}\right)^{2}=2 gi=∂y^(t−1)(y^(t−1)−yi)2=2(y^(t−1)−yi)hi=∂y^(t−1)2(yi−y^(t−1))2=2
为什么只用到二阶泰勒展开,是因为在平方损失的时候,三阶展开已经为0了。引入二阶导数的一大好处是推导出一种新的增益计算方法,该方法在优化目标函数上更加有效,精度上也胜过传统的GBDT.
对于XGBoost来说,每一个样本只会落到一个叶子节点上,因而对于单棵决策树可表示为 f ( x ) = ∑ j = 1 J w j I ( x ∈ R j ) f(x)=\sum_{j=1}^{J} w_{j} I\left(x \in R_{j}\right) f(x)=∑j=1JwjI(x∈Rj),那么所有的样本加起来,则可表示为 ∑ i = 1 N f ( x i ) = ∑ j = 1 J ∑ x ∈ R j w j \sum_{i=1}^{N} f\left(x_{i}\right)=\sum_{j=1}^{J} \sum_{x \in R_{j}} w_{j} ∑i=1Nf(xi)=∑j=1J∑x∈Rjwj
代入到目标函数中,将常数项移去
L ( t ) = ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + γ T + 1 2 λ ∑ j = 1 J w j 2 = ∑ j = 1 T [ ∑ x i ∈ R j g i w j + 1 2 ∑ x i ∈ R j h i w j 2 ] + γ T + 1 2 λ ∑ j = 1 J w j 2 = ∑ j = 1 T [ ∑ x i ∈ R j g i w j + 1 2 ( ∑ x i ∈ R j h i + λ ) w j 2 ] + γ T = ∑ j = 1 J ( G j b j + 1 2 ( H j + λ ) b j 2 ) + γ T \begin{aligned} \mathcal{L}^{(t)} &=\sum_{i=1}^{n}\left[g_{i} f_{t}\left(x_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(x_{i}\right)\right]+\gamma T+\frac{1}{2} \lambda \sum_{j=1}^{J} w_{j}^{2} \\ &=\sum_{j=1}^{T}\left[\sum_{x_{i} \in R_{j}} g_{i} w_{j}+\frac{1}{2} \sum_{x_{i} \in R_{j}} h_{i} w_{j}^{2}\right]+\gamma T+\frac{1}{2} \lambda \sum_{j=1}^{J} w_{j}^{2} \\ &=\sum_{j=1}^{T}\left[\sum_{x_{i} \in R_{j}} g_{i} w_{j}+\frac{1}{2}\left(\sum_{x_{i} \in R_{j}} h_{i}+\lambda\right) w_{j}^{2}\right]+\gamma T \\ &=\sum_{j=1}^{J}\left(G_{j} b_{j}+\frac{1}{2}\left(H_{j}+\lambda\right) b_{j}^{2}\right)+\gamma T \end{aligned} L(t)=i=1∑n[gift(xi)+21hift2(xi)]+γT+21λj=1∑Jwj2=j=1∑T⎣⎡xi∈Rj∑giwj+21xi∈Rj∑hiwj2⎦⎤+γT+21λj=1∑Jwj2=j=1∑T⎣⎡xi∈Rj∑giwj+21⎝⎛xi∈Rj∑hi+λ⎠⎞wj2⎦⎤+γT=j=1∑J(Gjbj+21(Hj+λ)bj2)+γT
其中 G j = ∑ x i ∈ R j g i , H j = ∑ x i ∈ R j h i G_{j}=\sum_{x_{i} \in R_{j}} g_{i}, \quad H_{j}=\sum_{x_{i} \in R_{j}} h_{i} Gj=∑xi∈Rjgi,Hj=∑xi∈Rjhi
对上式进行求导,最优值为:
w j ∗ = − G j H j + λ w_{j}^{*}=-\frac{G_{j}}{H_{j}+\lambda} wj∗=−Hj+λGj
代入目标函数,则目标函数变为:
L ( t ) = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T \mathcal{L}^{(t)}=-\frac{1}{2} \sum_{j=1}^{T} \frac{G_{j}^{2}}{H_{j}+\lambda}+\gamma T L(t)=−21j=1∑THj+λGj2+γT
XGBoost认为目标函数的值越小越好,因此得到一个简单的决定是否可以进行分裂的判断标准即分裂之后两边的目标函数之和是否能够大于不分裂的目标函数值。
G a i n = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ ] − γ G a i n=\frac{1}{2} \left[\frac{G_{L}^{2}}{H_{L}+\lambda}+\frac{G_{R}^{2}}{H_{R}+\lambda}-\frac{\left(G_{L}+G_{R}\right)^{2}}{H_{L}+H_{R}+\lambda} \right]-\gamma Gain=21[HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2]−γ
γ \gamma γ是一个超参数,具有双重含义,一个是对叶结点数目进行控制的参数,另个是分列前后 G a i n Gain Gain增大的阈值,但目的都是为了防止过拟合。
一种办法是贪心算法,遍历一个节点内的所有特征和取值,按照公式计算出按照每一个特征的分割点的信息增益,找到信息增益最大的特征和取值进行分裂。增加的新叶子惩罚项对应了树的剪枝,当gain小于某个阈值的时候,我们可以剪掉这个分割。
但当数据量大时,很难将所有数据加进内存并进行选择。因此采用近似分类算法,不仅解决了问题,同时能提升训练速度。
近似分裂算法其实就是对连续性特征进行离散化,对于某个特征 k k k,算法首先根据特征分布找到 l l l个分位点的候选集合 S k = { s k 1 , s k 2 , ⋯ , s k l } S_k=\{s_{k1}, s_{k2} , \cdots, s_{kl}\} Sk={sk1,sk2,⋯,skl},然后根据集合 S k S_k Sk中的分位点将相应样本划分到桶中。在遍历该特征时,只需遍历各个分位点,对每个桶内的样本统计值 g 、 h g、h g、h进行累加统计,寻找最佳分裂点进行分裂,该算法分为global近似和local近似,global就是在新生成一棵树之前就对各个特征计算分位点并划分样本,之后在每次分裂过程中都重复利用这些分位点进行划分,而local就是每一次结点分裂时都要重新计算分位点。
(1)是在建立第k棵树的时候利用样本的二阶梯度对样本进行离散化,每一维的特征都建立buckets。在建树过程中重复使用这些buckets。(全局选择)
(2)每一次进行分支时,重新计算每个样本的二阶梯度并重新构建buckets,再进行分支判断。(局部选择)
XGBoost在寻找splitpoint的时候,不会枚举所有的特征值,而会对特征值进行聚合统计,按照特征值的密度分布,构造直方图计算特征值分布的面积,然后划分分布形成若干个bucket(桶),每个bucket的面积相同,将bucket边界上的特征值作为split point的候选,遍历所有的候选分裂点来找到最佳分裂点。
上图近似算法公式的解释:将特征k的特征值进行排序,计算特征值分布, r k ( z ) r_k(z) rk(z)表示的是对于特征k而言,其特征值小于z的权重之和占总权重的比例,代表了这些特征值的重要程度,我们按照这个比例计算公式,将特征值分成若干个bucket,每个bucket的比例相同,选取这几类特征值的边界作为划分候选点,构成候选集;选择候选集的条件是要使得相邻的两个候选分裂节点差值小于某个阈值
XGBoost并行不是树粒度,而是在特征粒度上。决策树最耗时的一个步骤是对特征的值进行排序(确认最佳分割点),xgboost在训练前,预先对特征取值进行排序,然后保存为block结构,后面迭代中重复使用这个结构。block结构使得并行成为可能。并行处理每个特征,计算他们的信息增益。
xgb_test = xgb.DMatrix(X_test)
# XGBoost训练过程
xgb_params = {'booster': 'gbtree',
'eta': 0.005, # 学习率
'max_depth': 6, # 树的最大深度,用来避免过拟合
'subsample': 0.9, # 随机采样训练样本
'colsample_bytree': 0.8, # 生成树时进行的列采样
'objective': 'reg:linear',
'eval_metric': 'rmse',
'silent': True, # 训练过程中是否回打印出信息
'nthread': 24, # cpu的线程数
'lambda': 2,
'seed': 1000
}
# 单调性约束
increasing_constraint = list(np.zeros(X_train.shape[1], dtype=np.int64))
increasing_constraint[5] = 1
xgb_params['monotone_constraints'] = str(tuple(increasing_constraint))
plst = list(xgb_params.items())
num_rounds = 2500 # 迭代次数
watchlist = [(xgb_train, 'train'), (xgb_val, 'val')]
model = xgb.train(plst, xgb_train, num_rounds, watchlist, early_stopping_rounds=500)
GOSS 保留所有的梯度较大的实例,在梯度小的实例上使用随机采样。为了抵消对数据分布的影响,计算信息增益的时候,GOSS 对小梯度的数据引入常量乘数。GOSS 首先根据数据的梯度绝对值排序,选取 top a 个实例。然后在剩余的数据中随机采样 b个实例。接着计算信息增益时为采样出的小梯度数据乘以(1-a)/b, 这样算法就会更关注训练不足的实例,而不会过多改变原数据集的分布。
LightGBM支持特征并行、数据并行和投票并行。
- 对于特征并行来说,适用于数据少,但是特征比较多的情况。 LightGBM的每个worker 保存所有的数据集,并在其特征子集上寻找最优切分点。随后,worker之间互相通信,找到全局最佳切分点。最后每个worker都在全局最佳切分点进行节点分裂。这样做的好处主要是减小网络通信量,但是当数据量比较大的时候,由于每个 worker 都存储的是全量数据,因此数据存储代价高。
- 数据并行适用于数据量大,特征比较少的情况。 数据并行对数据进行水平切分,每个 worker 上的数据先建立起局部的直方图,然后合并成全局的直方图,之后找到最优的分割点。
- 投票并行适用于数据量大,特征也比较大的情况。 投票并行主要是对数据并行的一个优化。数据并行中合并直方图的时候通信代价比较大。给予投票的方式,我们只会合并部分的特征的直方图。具体来说,每个worker首先会找到它们数据中最优的一些特征,然后进行全局的投票,根据投票的结果,选择top的特征的直方图进行合并,在寻求全局的最优分割点。
##LightGBM参数
train_data = lgb.Dataset(x_train, label=y_train,categorical_feature=categorical_feature)
valid_data = lgb.Dataset(x_valid, label=y_valid,categorical_feature=categorical_feature)
increasing_constraint = list(np.zeros(x_train.shape[1], dtype=np.int64))
increasing_constraint[5] = 1
mc = tuple(increasing_constraint)
print(mc)
lgb_params = {"boosting": "gbdt",
'objective': 'gamma',
'learning_rate': 0.05,
'num_threads': 24, # lightGBM的线程数
'max_depth': -1, # 限制树模型的最大深度
# 'min_data_in_leaf':20
'num_leaves': 60,
# 'n_estimators':2000,
'lambda_l2': 1, # L2正则
'lambda_l1': 0,
'metric': 'feval', # 度量参数,查看mse与auc
# 'is_unbalance': 'true',
'feature_fraction': 0.9, # 通过设置 feature_fraction 来使用特征子抽样
'bagging_fraction': 0.9, # 类似于 feature_fraction, 但是它将在不进行重采样的情况下随机选择部分数据
'bagging_freq': 10, # 比较重要
'mc': mc
}
model = lgb.train(lgb_params, train_data, valid_sets=valid_data, num_boost_round=5000, early_stopping_rounds=100,feval=myveal)
相同点:
- GBDT与RF都是采用多棵树组合作为最终结果;这是两者共同点。
不同点:
- RF的树可以是回归树也可以是分类树,而GBDT只能是回归树。
- RF中树是独立的,相互之间不影响,可以并行;而GBDT树之间有依赖,是串行。
- RF最终的结果是有多棵树表决决定,而GBDT是有多棵树叠加组合最终的结果。
- RF对异常值不敏感,原因是多棵树表决,而GBDT对异常值比较敏感,原因是当前的错误会延续给下一棵树。
- 相较而言,GBDT比RF更容易产生过拟合。原因:**RF是通过减少模型的方差来提高性能,而GBDT是减少模型的偏差来提高性能的。**对于RF的每个基分类器来说,目标就是如何降低这个偏差,所以会采用深度很深甚至不剪枝的决策树。而GBDT对于每个基分类器来说,问题就是如何选择方差更小的分类器,即更简单的分类器,所以通常选择深度较浅的决策树。
- RF不需要进行数据预处理,即特征归一化。而GBDT则需要进行特征归一化。
- 传统GBDT以CART回归树作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)
- 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
- xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子结点个数、每个叶子结点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则化降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
- 列抽样。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
- 对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
- 并行化处理, 由于 Boosting 本身的特性,无法像随机森林那样树与树之间的并行化。XGBoost 的并行主要体现在特征粒度上,在对结点进行分裂时,由于已预先对特征排序并保存为block 结构,每个特征的增益计算就可以开多线程进行,极大提升了训练速度。
- 传统的GBDT采用的是均方误差作为内部分裂的增益计算指标,而XGBoost使用的是经过优化推到之后的式子
- Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子结点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(传统GBDT其实也是有学习速率的)
- 可并行的近似直方图方法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点
- 由于决策树在每一次选择结点特征的过程中,要遍历所有的属性的所有取值并选择一个较好的进行分裂。XGBoost使用的是近似算法,先对特征值进行排序Pre-sort,然后根据二阶梯度进行分桶,能够更精确的找到数据的分隔点,但是复杂度较高。LightGBM使用的是histogram算法,这种只需要将数据分割成不同的段即可,不需要进行预先的排序。占用的内存更低,数据分割的复杂度更低。
- 决策树生长策略,XGBoost采用的是Level-wise的树生长策略,LightGBM采用的是left-wise的生长策略。
- 并行策略对比。XGBoost的并行主要集中在特征并行上,而LightGBM的并行策略分特征并行、数据并行以及投票并行。
逻辑回归为概率型非线性回归模型。其实从本质上来讲是线性回归函数,然后使用非线性激活函数sigmoid函数 π ( x ) = 1 1 + e − x \pi(x) = \frac{1}{1+e^{-x}} π(x)=1+e−x1或者softmax函数进行激活,简单地说,逻辑回归就是一个被logistic方程归一化后的线性回归。损失函数是由最大似然估计求出来的
逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的
设 P ( Y = 1 ∣ x ) = π ( x ) = e x p ( w ⋅ x + b ) 1 + e x p ( w ⋅ x + b ) , P ( Y = 0 ∣ x ) = 1 − π ( x ) = 1 1 + e x p ( w ⋅ x + b ) P(Y=1|x) = \pi(x)=\frac{exp(w\cdot x+b)}{1 + exp(w\cdot x+b)}, P(Y=0|x) = 1 - \pi(x) = \frac{1}{1 + exp(w\cdot x+b)} P(Y=1∣x)=π(x)=1+exp(w⋅x+b)exp(w⋅x+b),P(Y=0∣x)=1−π(x)=1+exp(w⋅x+b)1
似然函数为: ∏ i = 1 N [ π ( x i ) ] y i [ 1 − π ( x i ) ] 1 − y i \prod_{i=1}^N[\pi(x_i)]^{y_i}[1-\pi(x_i)]^{1-y_i} i=1∏N[π(xi)]yi[1−π(xi)]1−yi
对数似然函数(损失函数)为:
L ( w ) = ∑ i = 1 N [ y i log π ( x i ) + ( 1 − y i ) log ( 1 − π ( x i ) ) ] = ∑ i = 1 N [ y i log π ( x i ) 1 − π ( x i ) + log ( 1 − π ( x i ) ) ] = ∑ i = 1 N [ y i ( w ⋅ x i ) − log ( 1 + exp ( w ⋅ x i ) ) ] L(w) =\sum_{i=1}^{N}\left[y_{i} \log \pi\left(x_{i}\right)+\left(1-y_{i}\right) \log \left(1-\pi\left(x_{i}\right)\right)\right] \\ =\sum_{i=1}^{N}\left[y_{i} \log \frac{\pi\left(x_{i}\right)}{1-\pi\left(x_{i}\right)}+\log \left(1-\pi\left(x_{i}\right)\right)\right] \\ =\sum_{i=1}^{N}\left[y_{i}\left(w \cdot x_{i}\right)-\log \left(1+\exp \left(w \cdot x_{i}\right)\right)\right] L(w)=i=1∑N[yilogπ(xi)+(1−yi)log(1−π(xi))]=i=1∑N[yilog1−π(xi)π(xi)+log(1−π(xi))]=i=1∑N[yi(w⋅xi)−log(1+exp(w⋅xi))]
对 L ( w ) L(w) L(w)求极大值,得到 w w w的估计值
梯度下降:
∂ L ( w ) ∂ w j = ∑ i = 1 N ( y i x i j − x i j exp ( w ⋅ x i ) 1 + exp ( w ⋅ x i ) ) = ∑ i = 1 N x i j [ y i − π ( x i ) ] \frac{\partial L(w)}{\partial w_{j}}=\sum_{i=1}^{N} \left( y_ix_{i j} - x_{ij}\frac{\exp (w \cdot x_{i})}{1+\exp (w \cdot x_{i} )} \right) = \sum_{i=1}^{N} x_{i j}\left[y_{i}-\pi\left(x_{i}\right)\right] ∂wj∂L(w)=i=1∑N(yixij−xij1+exp(w⋅xi)exp(w⋅xi))=i=1∑Nxij[yi−π(xi)]
求导完成后进行参数的更新
w j : = w j + α ∑ i = 1 N ( y i − π ( x i ) ) x i j w_j := w_j + \alpha\sum_{i=1}^{N} \left(y_{i}-\pi\left(x_{i}\right)\right)x_{ij} wj:=wj+αi=1∑N(yi−π(xi))xij
(1)归一化:可以提高收敛速度,提高收敛的精度;
(2)
- 1.逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
- 2.离散化后可以进行特征交叉,由M+N个变量变成M*N个变量,进一步引入非线性,提升表达能力
这些都是增强了特征的表达能力,是特征更加容易线性可分。- 3.特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险;
- 4.离散特征的增加和减少都很容易,易于模型的快速迭代
- 5.稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
- 6.离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则是0.如果特征没有离散化,一个异常数据“年龄3000岁”会造成很大的干扰
- 7.特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为用户年龄涨了一岁就变成一个完全不同的人。当然处于区间相邻出的样本会刚好相反
逻辑回归本质上是一个线性模型,但可以通过两种方式来帮助LR解决非线性问题:
- 利用特殊核函数,对特征进行变换:把低维空间映射到高维空间,而在低维空间不可分的数据,到高维空间中线性可分的几率会高一些。比如将数据进行离散化
LR可以用核函数,对特征进行变换:把低维空间映射到高维空间,而在低维空间不可分的数据,到高维空间中线性可分的几率会高一些。比如将数据进行离散化以及将特征进行组合。使用的核函数相当于是多项式核。
加l2正则项,和svm类似,加L2正则项可以用核方便处理。
逻辑回归估计参数时的目标函数如果加上一个先验的服从高斯分布的假设,其实就是在后面乘上一个参数,取了log之后就变成加上一个正则化项了。
实际应用中,由于数据的维度通常会比较高,L1正则化能够产生稀疏解,使用更广泛一些。
logistic是基于贝努力分布的假设,而贝努力分布的指数族的形式就是 1 1 + e x p ( − x ) \frac{1}{1+exp(-x)} 1+exp(−x)1
优点
缺点
将sigmoid函数转换成softmax函数,从而进行多分类
不是,表示置信度,值越大表示置信度越高。因为使用最大似然函数对逻辑回归进行参数估计,表示事件发生的最大可能性。
第一种形式: label取值为0或1
P ( y = 1 ∣ β , x ) = 1 1 + exp ( − β T x ) = exp ( β T x ) 1 + exp ( β T x ) P ( y = 0 ∣ β , x ) = 1 − 1 1 + exp ( − β T x ) = 1 1 + exp ( β T x ) \begin{array}{c}{P(y=1 | \beta, x)=\frac{1}{1+\exp \left(-\beta^{T} x\right)}=\frac{\exp \left(\beta^{T} x\right)}{1+\exp \left(\beta^{T} x\right)}} \\ {P(y=0 | \beta, x)=1-\frac{1}{1+\exp \left(-\beta^{T} x\right)}=\frac{1}{1+\exp \left(\beta^{T} x\right)}}\end{array} P(y=1∣β,x)=1+exp(−βTx)1=1+exp(βTx)exp(βTx)P(y=0∣β,x)=1−1+exp(−βTx)1=1+exp(βTx)1
第一种损失函数可以极大似然估计推出,具体见前面
第二种形式: label取值为1或-1
P ( y = ± 1 ∣ β , x ) = 1 1 + exp ( − y β T x ) P(y=\pm 1 | \beta, x)=\frac{1}{1+\exp \left(-y \beta^{T} x\right)} P(y=±1∣β,x)=1+exp(−yβTx)1
分类规则:
1 1 + exp ( − β T x ) 1 1 + exp ( β T x ) > 1 → g = 1 1 + exp ( β T x ) 1 + exp ( − β T x ) > 1 exp ( β T x ) > 1 β T x > 0 \begin{aligned} \frac{\frac{1}{1+\exp \left(\boldsymbol{-\beta}^{T} \mathbf{x}\right)}}{\frac{1}{1+\exp \left(\boldsymbol{\beta}^{T} \mathbf{x}\right)}} &>1 \rightarrow g=1 \\ \frac{1+\exp \left(\boldsymbol{\beta}^{T} \mathbf{x}\right)}{1+\exp \left(\boldsymbol{-\beta}^{T} \mathbf{x}\right)} &>1 \\ \exp \left(\boldsymbol{\beta}^{T} \mathbf{x}\right) &>1 \\ \boldsymbol{\beta}^{T} \mathbf{x} &>0 \end{aligned} 1+exp(βTx)11+exp(−βTx)11+exp(−βTx)1+exp(βTx)exp(βTx)βTx>1→g=1>1>1>0
第二种形式的损失函数(标准的对数损失函数形式, 其中 f ( x ) = β T x f(x) = \beta^T x f(x)=βTx
L ( y , f ( x ) ) = log ( 1 + exp ( − y f ( x ) ) ) = log ( 1 P ( y ∣ β , x ) ) L(y, f(x))=\log (1+\exp (-y f(x)))=\log \left(\frac{1}{P(y | \beta, x)}\right) L(y,f(x))=log(1+exp(−yf(x)))=log(P(y∣β,x)1)
将分数倒过来,负号提出来,就得到常见的对数损失函数的形式:
则loss最小值可表示为
KaTeX parse error: \cr valid only within a tabular/array environment
##简单介绍SVM:
定义在特征空间上的间隔最大化的线性分类器。
首先从分类平面,到求两类间的最大间隔,到转化为求间隔分之一,等优化问题,然后就是优化问题的解决办法,首先是用拉格朗日乘子把约束优化转化为无约束优化,对各个变量求导令其为零,得到的式子带入拉格朗日式子从而转化为对偶问题, 最后再利用SMO(序列最小优化)来解决这个对偶问题。
函数间隔: γ i ^ = y i ( w ∗ x i + b ) \hat{\gamma_i} = y_i(w*x_i + b) γi^=yi(w∗xi+b)
几何间隔: γ i = y i ( w ∗ x i + b ∣ ∣ w ∣ ∣ ) \gamma_i = y_i(\frac{w*x_i + b}{||w||}) γi=yi(∣∣w∣∣w∗xi+b)
则最优化问题可表示为:
m a x w , b γ s . t . y i w ∗ x i + b ∣ ∣ w ∣ ∣ ≥ γ max_{w, b} \gamma \\ s.t. \ \ \ y_i\frac{w*x_i + b}{||w||} \geq \gamma maxw,bγs.t. yi∣∣w∣∣w∗xi+b≥γ
==>
m a x w , b γ ^ ∣ ∣ w ∣ ∣ s . t . y i ( w ∗ x i + b ) ≥ γ ^ max_{w, b} \frac{\hat{\gamma}}{||w||} \\ s.t. \ \ \ y_i(w*x_i + b) \geq \hat{\gamma} maxw,b∣∣w∣∣γ^s.t. yi(w∗xi+b)≥γ^
令 γ ^ = 1 \hat{\gamma} = 1 γ^=1,同时 m a x 1 ∣ ∣ w ∣ ∣ max\frac{1}{||w||} max∣∣w∣∣1与 m i n ∣ ∣ w ∣ ∣ 2 2 min\frac{||w||^2}{2} min2∣∣w∣∣2等价
m i n w , b 1 2 ∣ ∣ w ∣ ∣ 2 s . t . y i ( w ∗ x i + b ) − 1 ≥ 0 min_{w, b} \frac{1}{2}||w||^2 \\ s.t. \ \ \ y_i(w*x_i + b) - 1 \geq 0 minw,b21∣∣w∣∣2s.t. yi(w∗xi+b)−1≥0
使其满足KKT条件,引入拉格朗日乘子 α i \alpha_i αi,得到 L ( w , b , α ) = 1 2 ∣ ∣ w ∣ ∣ 2 − ∑ i = 1 N α i y i ( w ⋅ x i + b ) + ∑ i = 1 N α i L(w, b, \alpha) = \frac{1}{2}||w||^2 - \sum_{i = 1}^N \alpha_i y_i(w \cdot x_i + b) + \sum_{i = 1}^N \alpha_i L(w,b,α)=21∣∣w∣∣2−i=1∑Nαiyi(w⋅xi+b)+i=1∑Nαi
因为原问题是凸二次优化问题,约束条件是仿射函数,对偶问题等价于原问题的解
则原式 m i n w , b m a x α L ( w , b , α ) min_{w,b}max_{\alpha}L(w, b, \alpha) minw,bmaxαL(w,b,α)变成求 m a x α m i n w , b L ( w , b , α ) max_{\alpha}min_{w, b}L(w, b, \alpha) maxαminw,bL(w,b,α)
∇ w L ( w , b , α ) = w − ∑ i = 1 N α i y i x i = 0 ∇ b L ( w , b , α ) = − ∑ i = 1 N α i y i = 0 \begin{array}{c}{\nabla_{w} L(w, b, \alpha)=w-\sum_{i=1}^{N} \alpha_{i} y_{i} x_{i}=0} \\ {\nabla_{b} L(w, b, \alpha)=-\sum_{i=1}^{N} \alpha_{i} y_{i}=0}\end{array} ∇wL(w,b,α)=w−∑i=1Nαiyixi=0∇bL(w,b,α)=−∑i=1Nαiyi=0
得
w = ∑ i = 1 N α i y i x i ∑ i = 1 N α i y i = 0 \begin{array}{c}{w=\sum_{i=1}^{N} \alpha_{i} y_{i} x_{i}} \\ {\sum_{i=1}^{N} \alpha_{i} y_{i}=0}\end{array} w=∑i=1Nαiyixi∑i=1Nαiyi=0
得:
L ( w , b , α ) = 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) − ∑ i = 1 N α i y i ( ( ∑ j = 1 N α j y j x j ) ⋅ x i + b ) + ∑ i = 1 N α i = − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) + ∑ i = 1 N α i \begin{aligned} L(w, b, \alpha) &=\frac{1}{2} \sum_{i=1}^{N} \sum_{j=1}^{N} \alpha_{i} \alpha_{j} y_{i} y_{j}\left(x_{i} \cdot x_{j}\right)-\sum_{i=1}^{N} \alpha_{i} y_{i}\left(\left(\sum_{j=1}^{N} \alpha_{j} y_{j} x_{j}\right) \cdot x_{i}+b\right)+\sum_{i=1}^{N} \alpha_{i} \\ &=-\frac{1}{2} \sum_{i=1}^{N} \sum_{j=1}^{N} \alpha_{i} \alpha_{j} y_{i} y_{j}\left(x_{i} \cdot x_{j}\right)+\sum_{i=1}^{N} \alpha_{i} \end{aligned} L(w,b,α)=21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)−i=1∑Nαiyi((j=1∑Nαjyjxj)⋅xi+b)+i=1∑Nαi=−21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)+i=1∑Nαi
求 m i n w , b L ( w , b , α ) min_{w,b}L(w, b, \alpha) minw,bL(w,b,α)对 α \alpha α的极大,即是对偶问题
max a − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) + ∑ i = 1 N α i s.t. ∑ i = 1 N α i y i = 0 α i ⩾ 0 , i = 1 , 2 , ⋯ , N \begin{array}{c}{\max _{a}-\frac{1}{2} \sum_{i=1}^{N} \sum_{j=1}^{N} \alpha_{i} \alpha_{j} y_{i} y_{j}\left(x_{i} \cdot x_{j}\right)+\sum_{i=1}^{N} \alpha_{i}} \\ {\text { s.t. } \sum_{i=1}^{N} \alpha_{i} y_{i}=0} \\ {\alpha_{i} \geqslant 0, \quad i=1,2, \cdots, N}\end{array} maxa−21∑i=1N∑j=1Nαiαjyiyj(xi⋅xj)+∑i=1Nαi s.t. ∑i=1Nαiyi=0αi⩾0,i=1,2,⋯,N
得到与之等价的:
min a 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) − ∑ i = 1 N α i s.t. ∑ i = 1 N α i y i = 0 α i ⩾ 0 , i = 1 , 2 , ⋯ , N \begin{array}{c}{\min _{a}\frac{1}{2} \sum_{i=1}^{N} \sum_{j=1}^{N} \alpha_{i} \alpha_{j} y_{i} y_{j}\left(x_{i} \cdot x_{j}\right)-\sum_{i=1}^{N} \alpha_{i}} \\ {\text { s.t. } \sum_{i=1}^{N} \alpha_{i} y_{i}=0} \\ {\alpha_{i} \geqslant 0, \quad i=1,2, \cdots, N}\end{array} mina21∑i=1N∑j=1Nαiαjyiyj(xi⋅xj)−∑i=1Nαi s.t. ∑i=1Nαiyi=0αi⩾0,i=1,2,⋯,N
假设上述最优解为 α i ∗ \alpha_i^* αi∗,则分类超平面为
w ∗ = ∑ i = 1 N α i ∗ y i x i b ∗ = y j − ∑ i = 1 N α i ∗ y i ( x i ⋅ x j ) w^* = \sum_{i = 1}^N \alpha_i^*y_ix_i \\ b^* = y_j - \sum_{i=1}^N \alpha_i^* y_i (x_i \cdot x_j) w∗=i=1∑Nαi∗yixib∗=yj−i=1∑Nαi∗yi(xi⋅xj)
分类决策函数
f ( x ) = s i g n ( ∑ i = 1 N α i ∗ y i ( x i ⋅ x ) + b ∗ ) f(x) = sign(\sum_{i=1}^N \alpha_i^*y_i(x_i \cdot x) + b^*) f(x)=sign(i=1∑Nαi∗yi(xi⋅x)+b∗)
最后再利用SMO(序列最小优化)来解决这个对偶问题
y i ⋅ g ( x i ) = { ⩾ 1 , { x i ∣ α i = 0 } = 1 , { x i ∣ 0 < α i < C } ⩽ 1 , { x i ∣ α i = C } y_{i} \cdot g\left(x_{i}\right)=\left\{\begin{array}{ll}{\geqslant 1,} & {\left\{x_{i} | \alpha_{i}=0\right\}} \\ {=1,} & {\left\{x_{i} | 0<\alpha_{i}
说白了就是非支持向量并且远离超平面的点 α i = 0 \alpha_i = 0