朴素贝叶斯——概率模型
朴素贝叶斯分类原理
朴素贝叶斯是贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入 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分类树使用的是基尼指数(见上一题)
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 0 , T 1 , . . . , T n T_0,T_1,...,T_n T0,T1,...,Tn中通过交叉验证选取最优子树 T α T_{\alpha} Tα
决策树处理连续值的方法?
连续属性的可取值不再有限,不能像处理离散属性那样进行枚举来对结点进行划分,需要将连续属性离散化。常用的离散化策略是二分法。虽然本质上属性的取值是连续的,但对于有限的采样数据它是离散的。
- 首先对特征的取值进行排序。
选取其中的一个点t作为划分点,左子树满足该属性值小于等于t,右子树满足该属性值大于t。
- 两个特征取值之间的中位点作为可能的分裂点,将数据集分成两部分,计算每个可能的分裂点的信息增益或者信息增益比或者Gini指数。
- 如同处理离散属性值那样考虑这个划分点,选择最优的划分点对样本集合的划分
【注意:与离散属性不同的是,若当前结点划分属性为连续属性,该属性还可以作为其后代结点的划分属性。
决策树处理缺失值的方法?(看不懂可以查看周志华《机器学习》P86页的例子)
-
抛弃缺失值: 如果样本数量很多,包含缺失值的样本数量较少的情况下可以考虑直接将哪些含有缺失值的样本直接丢弃,当然这种情况很少发生。
-
概率化缺失值。
- 特征的选择(如何计算信息增益或者信息增益比)。 在选择分裂属性的时候,训练样本存在缺失值,如何处理?(计算分裂损失减少值时,忽略特征缺失的样本,最终计算的增益值乘以没有缺失值样例占总样例的比例(实际参与计算的样本数除以总的样本数))
假如你使用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、boosting与stacking
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的区别
树集成模型主要有两种实现方式,分别是Bagging和Boosting。二者的区别主要有以下四点:
1)样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的.
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化.而权值是根据上一轮的分类结果进行调整.
2)样例权重:
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大.
3)预测函数:
Bagging:所有预测函数的权重相等.
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重.
4)并行计算:
Bagging:各个预测函数可以并行生成
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果.
Bagging与方差
方差的定义:
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取值的散布程度
方差的两个重要的性质:
- c为常数,则
Var ( c X ) = E [ ( c X − E [ c X ] ) 2 ] = c 2 E [ ( X − E [ X ] ) 2 ] = c 2 Var ( X ) \operatorname{Var}(c X)=E\left[(c X-E[c X])^{2}\right]=c^{2} E\left[(X-E[X])^{2}\right]=c^{2} \operatorname{Var}(X) Var(cX)=E[(cX−E[cX])2]=c2E[(X−E[X])2]=c2Var(X) - 独立随机变量之和的方差等于各变量的方差之和:
Var ( X 1 + ⋯ + X n ) = Var ( X 1 ) + ⋯ + Var ( X n ) \operatorname{Var}\left(X_{1}+\cdots+X_{n}\right)=\operatorname{Var}\left(X_{1}\right)+\cdots+\operatorname{Var}\left(X_{n}\right) Var(X1+⋯+Xn)=Var(X1)+⋯+Var(Xn)
通常降低模型方差的方法之一是将多个模型平均起来。假设有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更低。
GBDT
强烈推荐: https://www.cnblogs.com/massquantity/p/9174746.html
GBDT中梯度提升其实是去预估残差值的
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根据什么做分裂?(其实这个问题的本质是是问CART树的)
GBDT分裂会选取使得误差下降最多的特征进行分类。因为GBDT使用的基学习器是CART回归树,因此是根据分裂结点的CART回归树的平方误差最小化来选择特征进行分裂的。CART回归树使用的是平方误差最小化准则来选择分裂结点的。如果这棵树拟合不好,要么就通过负梯度计算出新的残差向量来拟合新的cart回归树
如何停止分裂?
设置 1. 结点分裂时最小样本数 2.树的最大深度 3. 最大叶子节点数 4. loss满足约束条件 5.子树的残差和阈值等
GBDT如何进行选择特征
GBDT中特征j的全局重要度通过特征j在单棵树中的重要度的平均值来衡量。通过遍历来寻找最优的切分变量和最优分割点。
GBDT如何评估特征的权重大小?
- 通过计算每个特征在训练集下的信息增益,最后计算每个特征信息增益与所有特征信息增益之和的比例为权重值。
- 借鉴投票机制。用相同的GBDT参数对w每个特征训练出一个模型,然后在该模型下计算每个特征正确分类的个数,最后计算每个特征正确分类的个数与所有正确分类个数之和的比例为权重值。
GBDT的“梯度提升”体现在那个阶段, GBDT的boosting体现在哪里?
在构建CART树是使用了损失函数的负梯度。使用损失函数的梯度可以保证损失函数的最小值。因此GBDT的梯度提升体现在构建CART树所需的负梯度阶段
GBDT是拟合残差,需要将每次拟合残差的基学习器组合起来
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如何做并行
GBDT的并行是在特征层面上来做的
- 计算每个样本的负梯度;
- 分裂挑选最佳特征及其分割点时,对特征计算相应的误差及均值时;
- 更新每个样本的负梯度时;
GBDT当增加样本数量时,训练时长是线性增加吗?当增加树的棵数时,训练时长是线性增加吗?当增加一个棵树叶子节点数目时,训练时长是线性增加吗?
(1)不是,因为生成单棵决策树时,损失函数极小值与样本数量N不是线性相关的
(2)不是 因为每个树的成型时间复杂度O(N)不同
(3)不是, 叶子结点数和每棵树的生成的时间复杂度O(N)不成正比
树生成畸形树,会带来哪些危害,如何预防?
在生成树的过程中,加入树不平衡的约束条件。这种约束条件可以是用户自定义的。例如对样本集中分到某个节点,而另一个节点的样本很少的情况进行惩罚
GBDT为什么需要进行数据的归一化
(1)归一化后加快了梯度下降求最优解的速度
(2) 归一化有可能提高精度
因为采用的是CART回归树,使用的是平方差损失,如果不进行归一化,因为量纲的不同会偏向于值较大的那个特征,影响模型的精度
RF
改变随机森林的训练样本数据量,是否会影响到随机森林学习到的模型的复杂度
未压缩的决策树的时间复杂度为: 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),从结果中看出,随机森林的时间复杂度与训练样本数量是有关的。
RF的随机性
随机性主要表现在两个方面: 一个是样本抽样的随机,另一个是特征抽样的随机
RF优缺点
- 训练时树与树之间是相互独立的,可以并行实现,训练速度更快。更重要的是它不容易过拟合,除非是在噪声过大的分类和回归问题上
- 但随机森林在小数据集上的效果不理想
XGBoost
推荐: https://www.cnblogs.com/massquantity/p/9794480.html
xgboost的目标函数
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增大的阈值,但目的都是为了防止过拟合。
XGBoost如何选择最优分割点(如何进行特征选择)
一种办法是贪心算法,遍历一个节点内的所有特征和取值,按照公式计算出按照每一个特征的分割点的信息增益,找到信息增益最大的特征和取值进行分裂。增加的新叶子惩罚项对应了树的剪枝,当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的格式,所以对叶结点进行分裂时,每个特征的增益计算可以使用多线程进行,并且block结构支持列采样,进一步加速。
- 采用近似分裂算法进行加速。 近似分裂算法其实就是对连续性特征进行离散化,之后只需要遍历各个离散后的分位点选择分裂就行了。
XGBoost防止过拟合
- 首先在xgboost的损失函数中就添加了正则化项
- shrinkage,学习率eta,作用就是减少每棵树的影响力,留更多的空间给后来的树提升
- 行采样和列采样。行采样则是bagging的思想,每次只抽取部分的样本进行训练,而不使用全部的样本,增强树的多样性
- 列采样有两种,按层采样和建树前随机选择特征。 按层随机,在对同一层内每个结点分裂前,先随机选择部分特征,再确定最优分割点。 建树前先随机选择部分特征,在建树的过程中只是用选择的特征进行分裂。
XGBoost怎么处理缺失值?
- XGBoost处理缺失值的方法和其他树模型不同。xgboost划分缺失值当作稀疏矩阵来对待,本身的结点分裂时不考虑缺失值的数值。缺失值数据会被分到左子树和右子树分别计算损失,选择较优的哪一个。
- 如果训练中没有数据缺失,与测试出现数据缺失,那么默认被分类到右子树。
XGBoost如何进行并行化
XGBoost并行不是树粒度,而是在特征粒度上。决策树最耗时的一个步骤是对特征的值进行排序(确认最佳分割点),xgboost在训练前,预先对特征取值进行排序,然后保存为block结构,后面迭代中重复使用这个结构。block结构使得并行成为可能。并行处理每个特征,计算他们的信息增益。
XGBoost的参数调整
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)
LightGBM
LightGBM原理
- 直方图算法。Lightgbm将连续的浮点特征值离散化成k个整数。在xgboost中需要遍历所有的离散化的值,而在lgb中只需要遍历k个直方图的值。该方法优点有:速度快,占用内存小。 缺点:离散化找到的分割点并不是很精确的。但实验表明影响不大,较粗的分割点有正则化的效果,防止过拟合。
- 直方图做差加速。一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到,加快速度。
- 带深度限制的Leaf-wise的叶子生长策略。Leaf-wise是一种更高效的策略,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。但需要限制深度,避免过拟合。
- 直接支持类别特征,不需要进行one-hot编码,从而提升速度,精度一致
基于梯度的单边采样
GOSS 保留所有的梯度较大的实例,在梯度小的实例上使用随机采样。为了抵消对数据分布的影响,计算信息增益的时候,GOSS 对小梯度的数据引入常量乘数。GOSS 首先根据数据的梯度绝对值排序,选取 top a 个实例。然后在剩余的数据中随机采样 b个实例。接着计算信息增益时为采样出的小梯度数据乘以(1-a)/b, 这样算法就会更关注训练不足的实例,而不会过多改变原数据集的分布。
LightGBM如何并行
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的区别
相同点:
- GBDT与RF都是采用多棵树组合作为最终结果;这是两者共同点。
不同点:
- RF的树可以是回归树也可以是分类树,而GBDT只能是回归树。
- RF中树是独立的,相互之间不影响,可以并行;而GBDT树之间有依赖,是串行。
- RF最终的结果是有多棵树表决决定,而GBDT是有多棵树叠加组合最终的结果。
- RF对异常值不敏感,原因是多棵树表决,而GBDT对异常值比较敏感,原因是当前的错误会延续给下一棵树。
- 相较而言,GBDT比RF更容易产生过拟合。原因:**RF是通过减少模型的方差来提高性能,而GBDT是减少模型的偏差来提高性能的。**对于RF的每个基分类器来说,目标就是如何降低这个偏差,所以会采用深度很深甚至不剪枝的决策树。而GBDT对于每个基分类器来说,问题就是如何选择方差更小的分类器,即更简单的分类器,所以通常选择深度较浅的决策树。
- RF不需要进行数据预处理,即特征归一化。而GBDT则需要进行特征归一化。
XGBoost与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还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点
LightGBM与XGBoost的不同点
- 由于决策树在每一次选择结点特征的过程中,要遍历所有的属性的所有取值并选择一个较好的进行分裂。XGBoost使用的是近似算法,先对特征值进行排序Pre-sort,然后根据二阶梯度进行分桶,能够更精确的找到数据的分隔点,但是复杂度较高。LightGBM使用的是histogram算法,这种只需要将数据分割成不同的段即可,不需要进行预先的排序。占用的内存更低,数据分割的复杂度更低。
- 决策树生长策略,XGBoost采用的是Level-wise的树生长策略,LightGBM采用的是left-wise的生长策略。
- 并行策略对比。XGBoost的并行主要集中在特征并行上,而LightGBM的并行策略分特征并行、数据并行以及投票并行。
LR —— 对数线性模型
逻辑回归为概率型非线性回归模型。其实从本质上来讲是线性回归函数,然后使用非线性激活函数sigmoid函数 π ( x ) = 1 1 + e − x \pi(x) = \frac{1}{1+e^{-x}} π(x)=1+e−x1或者softmax函数进行激活,简单地说,逻辑回归就是一个被logistic方程归一化后的线性回归。损失函数是由最大似然估计求出来的
逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的
LR推导
设
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)为什么LR需要归一化或者取对数?(2)为什么将特征离散化效果更好,为什么特征组合后还能提升?
(1)归一化:可以提高收敛速度,提高收敛的精度;
(2)
- 1.逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
- 2.离散化后可以进行特征交叉,由M+N个变量变成M*N个变量,进一步引入非线性,提升表达能力
这些都是增强了特征的表达能力,是特征更加容易线性可分。- 3.特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险;
- 4.离散特征的增加和减少都很容易,易于模型的快速迭代
- 5.稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
- 6.离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则是0.如果特征没有离散化,一个异常数据“年龄3000岁”会造成很大的干扰
- 7.特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为用户年龄涨了一岁就变成一个完全不同的人。当然处于区间相邻出的样本会刚好相反
LR可以用来处理非线性问题么?
逻辑回归本质上是一个线性模型,但可以通过两种方式来帮助LR解决非线性问题:
- 利用特殊核函数,对特征进行变换:把低维空间映射到高维空间,而在低维空间不可分的数据,到高维空间中线性可分的几率会高一些。比如将数据进行离散化
- 扩展LR算法,提出FM算法。FM模型时一种基于矩阵分解的机器学习模型,对于稀疏数据具有良好的学习能力,FM能解决LR泛化能力弱的问题。
F M : y ^ ( x ) : = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n ∑ j = i + 1 n ⟨ v i , v j ⟩ x i x j \mathrm{FM} : \hat{y}(x) :=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n}\left\langle v_{i}, v_{j}\right\rangle x_{i} x_{j} FM:y^(x):=w0+i=1∑nwixi+i=1∑nj=i+1∑n⟨vi,vj⟩xixj
前面是LR模型,进行特征组合时可以变成 x i 2 、 x i 3 x_i^2 、 x_i^3 xi2、xi3,也可以进行两两特征组合,后面是两两特征进行组合
LR可以用核么?可以怎么用?
LR可以用核函数,对特征进行变换:把低维空间映射到高维空间,而在低维空间不可分的数据,到高维空间中线性可分的几率会高一些。比如将数据进行离散化以及将特征进行组合。使用的核函数相当于是多项式核。
LR过拟合问题
加l2正则项,和svm类似,加L2正则项可以用核方便处理。
逻辑回归估计参数时的目标函数如果加上一个先验的服从高斯分布的假设,其实就是在后面乘上一个参数,取了log之后就变成加上一个正则化项了。
实际应用中,由于数据的维度通常会比较高,L1正则化能够产生稀疏解,使用更广泛一些。
LR为什么用sigmoid函数。这个函数有什么优点和缺点?
logistic是基于贝努力分布的假设,而贝努力分布的指数族的形式就是 1 1 + e x p ( − x ) \frac{1}{1+exp(-x)} 1+exp(−x)1
优点
- 数据压缩能力,将数据规约在[0,1]之间
- 导数形式优秀,方便计算
缺点
- 容易梯度消失,x稍大的情况下就趋近一条水平线
- 非0中心化,在神经网络算法等情况下,造成反向传播时权重的全正全负的情况
LR如何解决多分类问题
将sigmoid函数转换成softmax函数,从而进行多分类
逻辑回归估计参数时的目标函数逻辑回归的值表示概率吗?
不是,表示置信度,值越大表示置信度越高。因为使用最大似然函数对逻辑回归进行参数估计,表示事件发生的最大可能性。
小插曲: 手推逻辑回归目标函数,正类是1,反类是-1
第一种形式: 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
##简单介绍SVM:
定义在特征空间上的间隔最大化的线性分类器。
首先从分类平面,到求两类间的最大间隔,到转化为求间隔分之一,等优化问题,然后就是优化问题的解决办法,首先是用拉格朗日乘子把约束优化转化为无约束优化,对各个变量求导令其为零,得到的式子带入拉格朗日式子从而转化为对偶问题, 最后再利用SMO(序列最小优化)来解决这个对偶问题。
SVM推导
函数间隔:
γ
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(序列最小优化)来解决这个对偶问题
KKT条件
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}<C\right\}} \\ {\leqslant 1,} & {\left\{x_{i} | \alpha_{i}=C\right\}}\end{array}\right.
yi⋅g(xi)=⎩⎨⎧⩾1,=1,⩽1,{xi∣αi=0}{xi∣0<αi<C}{xi∣αi=C}
说白了就是非支持向量并且远离超平面的点
α
i
=
0
\alpha_i = 0
αi=0, 支持向量上的点
0
≤
α
≤
C
0 \leq \alpha \leq C
0≤α≤C, 不是支持向量,无法线性可分的点,
α
=
C
\alpha=C
α=C
为什么要把原问题转换为对偶问题?
(1)因为原问题是凸二次规划问题,转换为对偶问题更加容易,更加高效,因为这样只需要求解
α
\alpha
α系数,而
α
\alpha
α系数只有支持向量才非0,其他部分均为0,有点多少个样本点就会有多少个
α
\alpha
α值
(2)这样能够自然引入核函数
加大训练数据量一定能提高SVM准确率吗?
不一定,SVM的分类超平面只由少量的支持向量决定,其余的点对于分类超平面的确定没有什么帮助,因此增加分类超平面不一定会有提升
SMO算法(序列最小最优化算法),如何选择两个乘子 α 1 , α 2 \alpha_1, \alpha_2 α1,α2
(1) SMO算法的目的是为了高效的实现支持向量机学习。SMO算法是一种启发式算法。
如果所有的变量都满足KKT条件,那么最优化问题的解就得到了。KKT条件是最优化问题的充分必要条件。
SMO算法每次只选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题,对目标函数值进行优化。
(2) 对于
α
1
\alpha_1
α1,即第一个乘子,选择一个违反KKT条件最严重的的那一个。通常都是先遍历支持向量,如果都满足条件在遍历整个集合
对于第二个乘子,由约束条件自动确定,寻找满足条件:
m
a
x
∣
E
i
−
E
j
∣
max|E_i-E_j|
max∣Ei−Ej∣,其中
E
i
E_i
Ei是函数
g
(
x
)
g(x)
g(x)对输入
x
i
x_i
xi的预测值和真实输出
y
i
y_i
yi的差
SVM如何解决多分类问题
(1) 一对多的方法: 训练时将某一个类别的样本归为一类,其余剩下的样本归为另一类。这样k个类别构造出k个SVM分类器。分类时将未知样本分类为最大分类函数的那个类别
(2) 一对一的方法: 在任意两个样本之间设计一个SVM,因此k个类别的样本就需要设计
k
(
k
−
1
)
2
\frac{k(k-1)}{2}
2k(k−1)个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。Libsvm中的多类分类就是根据这个方法实现的。
(3) 层次SVM(SVM决策树), 首先将所有类别分成两类,再对子类进行划分,如此循环知道得到单个类别
SVM能做回归吗,怎么做?
具体可以参考: https://blog.csdn.net/wodemimashi125/article/details/81559172
SVM可以做回归,对于回归模型,优化目标函数与分类模型保持一致,依然是
1
2
∣
∣
w
∣
∣
2
\frac{1}{2}||w||^2
21∣∣w∣∣2,但约束条件不同。回归模型的目标是让训练集中每个样本点尽量拟合到一个线性模型
y
i
=
ω
⋅
ϕ
(
x
i
)
+
b
y_i=\omega \cdot \phi(x_i) + b
yi=ω⋅ϕ(xi)+b上。对于一般的回归模型,用均方误差作为损失函数,但SVM不是这样定义的。
SVM需要定义一个常量
ϵ
>
0
\epsilon>0
ϵ>0,对于某个样本点
(
x
i
,
y
i
)
(x_i, y_i)
(xi,yi),如果
∣
y
i
−
ω
⋅
ϕ
(
x
i
)
−
b
∣
≤
ϵ
|y_i - \omega \cdot \phi(x_i) - b| \leq \epsilon
∣yi−ω⋅ϕ(xi)−b∣≤ϵ,则完全没有损失;如果
∣
y
i
−
ω
⋅
ϕ
(
x
i
)
−
b
∣
>
ϵ
|y_i - \omega \cdot \phi(x_i) - b| >\epsilon
∣yi−ω⋅ϕ(xi)−b∣>ϵ,则对应的损失为
∣
y
i
−
ω
⋅
ϕ
(
x
i
)
−
b
∣
−
ϵ
|y_i - \omega \cdot \phi(x_i) - b| - \epsilon
∣yi−ω⋅ϕ(xi)−b∣−ϵ。这个损失函数与均方误差不同,只要
∣
y
i
−
ω
⋅
ϕ
(
x
i
)
−
b
∣
≠
0
|y_i - \omega \cdot \phi(x_i) - b| \neq 0
∣yi−ω⋅ϕ(xi)−b∣=0就会有损失。
SVM损失函数的解释,以及其中C的含义及作用?
SVM使用的是合页损失。
线性支持向量机原始最优化问题:
min
w
,
b
,
ξ
1
2
∥
w
∥
2
+
C
∑
i
=
1
N
ξ
i
s.t.
y
i
(
w
⋅
x
i
+
b
)
⩾
1
−
ξ
i
,
i
=
1
,
2
,
⋯
,
N
ξ
i
⩾
0
,
i
=
1
,
2
,
⋯
,
N
\begin{array}{l}{\min _{w, b, \xi} \frac{1}{2}\|w\|^{2}+C \sum_{i=1}^{N} \xi_{i}} \\ {\text { s.t. } \quad y_{i}\left(w \cdot x_{i}+b\right) \geqslant 1-\xi_{i}, \quad i=1,2, \cdots, N} \\ {\xi_{i} \geqslant 0, \quad i=1,2, \cdots, N}\end{array}
minw,b,ξ21∥w∥2+C∑i=1Nξi s.t. yi(w⋅xi+b)⩾1−ξi,i=1,2,⋯,Nξi⩾0,i=1,2,⋯,N
其中
C
>
0
C>0
C>0是惩罚参数,
C
C
C值大时对误分类的惩罚增大,
C
C
C值小时对误分类的乘法减小。线性不可分意味着某些样本点
(
x
i
,
y
i
)
(x_i, y_i)
(xi,yi)不能满足函数间隔大于等于1的约束条件。为了解决这个问题,可以对每个样本点
(
x
i
,
y
i
)
(x_i, y_i)
(xi,yi)引进一个松弛变量
ξ
i
≥
0
\xi_i \geq 0
ξi≥0,使函数间隔加上松弛变量大于等于1.
等价于最优化问题
m
i
n
w
,
b
∑
i
=
1
N
[
1
−
y
i
(
w
⋅
x
i
+
b
)
]
+
+
λ
∣
∣
w
∣
∣
2
min_{w,b}\sum_{i=1}^N[1-y_i(w \cdot x_i + b)]_+ + \lambda||w||^2
minw,bi=1∑N[1−yi(w⋅xi+b)]++λ∣∣w∣∣2
虚线显示的是感知机的损失函数
[
−
y
i
(
w
⋅
x
i
+
b
)
]
+
[-y_i(w \cdot x_i + b)]_+
[−yi(w⋅xi+b)]+。这是,当样本点
(
x
i
,
y
i
)
(x_i, y_i)
(xi,yi)被正确分类时,损失是0,否则损失是
−
y
i
(
w
⋅
x
i
+
b
)
-y_i(w \cdot x_i + b)
−yi(w⋅xi+b)。相比之下,合页损失函数不仅要分类正确,而且确信都足够高时损失才是0.也就是说,合页损失函数对学习有更高的要求。
支持向量机(SVM)是否适合大规模数据?
SVM的计算复杂度较高,为 O ( n 2 ) O(n^2) O(n2),处理大规模的数据比较吃力。
机器学习有很多关于核函数的说法,核函数的定义和作用是什么?
核函数的作用是将非线性问题转换成线性问题。先使用一个变化将原空间的数据映射到新空间,然后再新空间里用线性分类学习方法从训练数据中学习分类模型。
核函数的价值在他将特征从低维映射到高维,但是它是事先在低维空间中进行计算,从而避免了高维空间中的复杂计算
常见的核函数有哪些,如何选择核函数?
名称 | 表达式 | 参数 |
---|---|---|
线性核 | κ ( x i , x j ) = x i T x j \kappa\left(x_{i}, x_{j}\right)=x_{i}^{T} x_{j} κ(xi,xj)=xiTxj | |
多项式核 | κ ( x i , x j ) = ( x i T x j ) d \kappa\left(x_{i}, x_{j}\right)=(x_{i}^{T} x_{j})^d κ(xi,xj)=(xiTxj)d | d ≥ 1 为 多 项 式 的 次 数 d \geq 1为多项式的次数 d≥1为多项式的次数 |
高斯核 | κ ( x i , x j ) = e x p ( − ∥ x i − x j ∥ 2 2 σ 2 ) \kappa\left(x_{i}, x_{j}\right)=exp(-\frac{\|x_{i} - x_{j}\|^2}{2\sigma^2}) κ(xi,xj)=exp(−2σ2∥xi−xj∥2) | σ > 0 \sigma>0 σ>0位高斯核的带宽。 它能将原始空间映射到无穷维空间。不过 σ \sigma σ选的很大,高次特征上权重实际上衰减非常快,线索一相当于一个低维空间;反过来,如果 s i g m a sigma sigma选的很小,则可以将任意的数据映射为线性可分,但伴随着非常严重的过拟合。(一个球形维度 |
拉普普拉斯核 | κ ( x i , x j ) = e x p ( − ∥ x i − x j ∥ σ ) \kappa\left(x_{i}, x_{j}\right)=exp(-\frac{\|x_{i} - x_{j}\|}{\sigma}) κ(xi,xj)=exp(−σ∥xi−xj∥) | σ > 0 \sigma>0 σ>0 |
Sigmoid核 | κ ( x i , x j ) = t a n h ( β x i T x j + θ ) \kappa\left(x_{i}, x_{j}\right)=tanh(\beta x_{i}^{T} x_{j} + \theta) κ(xi,xj)=tanh(βxiTxj+θ) | t a n h tanh tanh为双曲正切函数, β > 0 , θ < 0 \beta >0 , \theta < 0 β>0,θ<0 |
字符串核 | 用于文本分类、信息检索、生物信息学等方面,它是计算两个子串之间的余弦相似度。两个字符串相同的子串越多,就越相似,字符串核函数的值就越大 |
模型比较
LR与SVM的联系与区别:
联系:
- LR和SVM都可以处理分类问题,且一般都用于处理线性二分类问题(在改进的情况下可以处理多分类问题)
- 两个方法都可以增加不同的正则化项,如l1、l2等等。所以在很多实验中,两种算法的结果是很接近的。
区别: - LR是参数模型[逻辑回归是假设y服从Bernoulli分布],SVM是非参数模型,LR对异常值更敏感。
- 从目标函数来看,区别在于逻辑回归采用的是logistical loss,SVM采用的是hinge loss,这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。
- SVM的处理方法是只考虑support vectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重。
- 逻辑回归相对来说模型更简单,好理解,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算。
- logic 能做的 svm能做,但可能在准确率上有问题,svm能做的logic有的做不了。
SVM和LR的异同 **
来源: 室友的腾讯面试
相同点:
- LR和SVM都是有监督的分类算法, LR的训练数据的Label是“0或者1”
- 如果不考虑核函数,LR和SVM都是线性分类算法
- LR和SVM都是判别模型
不同点:
-
本质上是loss函数不同,或者说分类的原理不同
LR的目标函数是最小化模型分布和经验分布之间的交叉熵问题
J ( θ ) = − 1 m [ ∑ i = 1 m y ( i ) l o g h θ ( x ( i ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ] J(\theta)=-\frac{1}{m}[\sum_{i=1}^m y^{(i)}logh_{\theta}(x^{(i)}) + (1 - y^{(i)})log(1 - h_{\theta}(x^{(i)}))] J(θ)=−m1[i=1∑my(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]LR基于概率理论中的最大似然估计,通过极大似然估计的方法估计出参数的值
SVM的目标是最大化分类间隔(硬SVM),或者最大化分类间隔和分错的样本数量(软SVM)
KaTeX parse error: Undefined control sequence: \cal at position 2: {\̲c̲a̲l̲ ̲L}(w, b, \alpha…
SVM基于几何间隔最大化原理,认为几何间隔最大的分类面为最优分类面。 -
SVM是结构风险最小化,LR则是经验风险最小化
结构风险最小化就是在训练误差和模型复杂度之间寻求平衡,防止过拟合,减小泛化误差。为了达到这个目标最常用的方法就是添加正则项。
SVM的loss的第一项可以看做是L2正则项,LR则需要加入正则化项。 -
SVM只考虑分界面附近的少数点,而LR则考虑所有点。
影响SVM决策面的样本点只有少数的支持向量。在支持向量外添加或减少任何样本点,对分类决策面没有任何影响。
在LR中,每个样本点都会影响决策面。决策面会倾向于远离样本数量较多的类别。如果不同类别之间的数据严重不平衡,一般需要对数据做balancing.
【拓展】基于这一点,说明LR对离散点会更加敏感(自己的思考:如果这些离散点指的是支持向量呢?个人觉得这样SVM会对这些离散点更加敏感) -
在解决非线性问题时,支持向量机采用核函数的机制,而LR通常不采用核函数的方法。
SVM算法里,只有少数几个代表支持向量的样本参与分类决策计算,也就是只有少数几个样本需要参与核函数的计算。
LR算法里,每个样本点都必须参与分类决策的计算过程,也就是说,假设我们在LR里也运用核函数的原理,那么每个样本点都必须参与核计算,这带来的计算复杂度是相当高的。尤其是数据量很大时,我们无法承受。所以,在具体应用时,LR很少运用核函数机制。 -
SVM 基于距离分类,LR 基于概率分类。 SVM依赖数据表达的距离测度,所以需要对数据先做 normalization;LR不受其影响。
-
在小规模数据集上,Linear SVM要略好于LR,但差别也不是特别大,而且Linear SVM的计算复杂度受数据量限制,对海量数据LR使用更加广泛。
SVM和逻辑斯特回归对同一样本A进行训练,如果某类中增加一些数据点,那么原来的决策边界分别会怎么变化?
因为SVM只考虑支持向量的位置,而LR需要考虑所有点。
SVM的情况比较容易:
(1) 如果这个数据点本身在margin之外“+”的那一侧,那么判决边界不受影响。
(2) 如果这个数据点在margin之内,或者在margin之外“-”的那一侧,那么这个点一定会成为新的支持向量。但是,判决边界并不一定发生变化,因为这个数据点可能能够被目标函数中的容错项处理掉。
LR的情况比较复杂一点:需要从算法损失函数出发进行参数估计
如果新增点是在“+”类这一边,但离判决边界比较近。新的模型为了能够正确判别这个数据点,会把判决边界向“-”类方向移动。
如果新增点是在“+”类这一边,但离判决边界很远,旧模型已经可以毫无压力地把它判别正确。这时,新模型反倒会把判决边界向“+”类方向移动,这样虽然新的数据点的似然值减小了一点儿,但换来的是原来的“-”类数据似然值增加
如何选择LR与SVM?
非线性分类器,低维空间可能很多特征都跑到一起了,导致线性不可分。
- 如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM
- 如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel
- 如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况。
模型复杂度:SVM支持核函数,可处理线性非线性问题;LR模型简单,训练速度快,适合处理线性问题;决策树容易过拟合,需要进行剪枝
损失函数:SVM hinge loss; LR L2正则化; adaboost 指数损失
数据敏感度:SVM添加容忍度对outlier不敏感,只关心支持向量,且需要先做归一化; LR对远点敏感
数据量:数据量大就用LR,数据量小且特征少就用SVM非线性核
什么是参数模型(LR)与非参数模型(SVM)?
在统计学中,参数模型通常假设总体(随机变量)服从某一个分布,该分布由一些参数确定(比如正太分布由均值和方差确定),在此基础上构建的模型称为参数模型;非参数模型对于总体的分布不做任何假设,只是知道总体是一个随机变量,其分布是存在的(分布中也可能存在参数),但是无法知道其分布的形式,更不知道分布的相关参数,只有在给定一些样本的条件下,能够依据非参数统计的方法进行推断。
naive bayes和logistic regression的区别
- 朴素贝叶斯模型时生成模型, 而逻辑回归是判别模型
- NB模型由于条件独立假设,因此各个属性之间的条件概率分布是条件概率分布独立的,即 P ( x i ∣ y ) 和 P ( x j ∣ Y ) P(x_i|y)和P(x_j|Y) P(xi∣y)和P(xj∣Y), 而对于LR是直接进行参数估计,使用梯度下降等方法,而且不必假设各个属性之间相互独立。归一化的LR对应最大化后验概率。
- 对于连续变量的NB,若果假设每个属性条件概率分布符合正太分布,就是高斯朴素贝叶斯分类器GNB。通过形式变换可以变换成LR的形式。
- 当数据集比较小的时候,应当选用NB模型,时间复杂度为O(logn)。 当数据集比较大时,选用LR效果较好,时间复杂度为O(n)
各种机器学习的应用场景分别是什么?例如,k近邻,贝叶斯,决策树,svm,逻辑斯蒂回归和最大熵模型。
- 朴素贝叶斯算法假定所有输入属性的重要性是相等的,且彼此是独立的,这个前提满足的情况下,贝叶斯算法往往十分精确,但实际情况是,经常发生不满足条件独立性的情况,并且缺少可用的概率数据。(小数据量)
- 决策树算法相对比较好理解,也不需要对样本数据做任何假设,相对更适合处理非数值型数据,但决策数算法的结果有时会很复杂,同一个变量在树生长的时候反复用了好几次导致不好解释,尤其当样本数据是数值型时,数据的微小变化都会影响每个节点变量以及阈值的选择,结果较不稳定。
- K 近邻算法是基于类比的学习,可以对缺失值进行处理,但维度过高时,也容易过拟合,本身不建立X与Y的量化公式,算法费时较长。
- SVM算法使用一种非线性映射,所以对于非线性决策边界的识别能力是比较强的,本身不容易过拟合,但由于算法本身效果依赖核心点的选择,所以扩展到大数据集时相对比较费时。(小数据量)
- 逻辑回归算法本身有明确的概率公式,由于会对连续变量进行分箱处理,所以会降低过拟合的程度,增强模型泛化能力。但是对于多分类、或者非线性的决策边界时,表现效果有限。(数据量较大时)
选择算法时,除了考虑算法本身的特点,还应考虑具体的业务需求,比如有时候业务需求注重解释性。并且以打分卡的形式展现每个属性和个体,那个即使其他算法会更准确一些,考虑到应用,也会选择逻辑回归算法。
RF与SVM的比较
- RF需要调节的参数比SVM少
不需要调节过多的参数,因为随机森林只需要调节树的数量,而且树的数量一般是越多越好,而其他机器学习算法,比如SVM,有非常多超参数需要调整,如选择最合适的核函数,正则惩罚等。- 在多分类问题上随机森林较SVM会有优势。
分类较为简单、直接。随机森林和支持向量机都是非参数模型(复杂度随着训练模型样本的增加而增大)。相较于一般线性模型,就计算消耗来看,训练非参数模型因此更为耗时耗力。分类树越多,需要更耗时来构建随机森林模型。同样,我们训练出来的支持向量机有很多支持向量,最坏情况为,我们训练集有多少实例,就有多少支持向量。虽然,我们可以使用多类支持向量机,但传统多类分类问题的执行一般是one-vs-all(所谓one-vs-all 就是将binary分类的方法应用到多类分类中。比如我想分成K类,那么就将其中一类作为positive),因此我们还是需要为每个类训练一个支持向量机。相反,决策树与随机森林则可以毫无压力解决多类问题。- 比较容易入手实践。随机森林在训练模型上要更为简单。你很容易可以得到一个又好且具鲁棒性的模型。随机森林模型的复杂度与训练样本和树成正比。支持向量机则需要我们在调参方面做些工作,除此之外,计算成本会随着类增加呈线性增长。
- 小数据上,SVM更有优异,而随机森林对数据需求较大。
支持向量机在存在较少极值的小数据集上具有优势。随机森林则需要更多数据但一般可以得到非常好的且具有鲁棒性的模型。