飞道的博客

西瓜书重温(三): 线性模型手推版

185人阅读  评论(0)

1. 写在前面

今天复习的是线性模型, 对应的西瓜书第3章内容, 这篇文章的内容主要是先整理线性回归模型,线性模型虽然形式简单,易于建模,但却蕴涵ML中的一些重要思想,并且许多功能强大的非线性模型可在线性模型的基础上引入层级结构或者高维映射而得,所以这个模型并不能小觑。从这个模型中复习一下最小二乘,复习一下最大似然估计。 然后整理逻辑回归, 这个广义上来说就是一个线性模型,只不过拟合了一个包了层外壳的 y y y, 而这层外壳使得该模型有了非线性的性质,这是面试非常喜欢考的内容。 然后就是LDA,这也是一种经典的线性学习方法,整理相关的思路和公式推导。最后就是一些策略性的方法论,比如多分类学习与类别不均衡等。

大纲如下

  • 线性回归模型
  • 广义线性之逻辑回归模型
  • LDA模型
  • 多分类学习与类别不均衡的方法论

Ok, let’s go!

2. 线性回归模型

线性模型是非常简单的一个函数了, 给定有 d d d个属性描述的示例 x = ( x 1 ; x 2 ; … ; x d ) \boldsymbol{x}=\left(x_{1} ; x_{2} ; \ldots ; x_{d}\right) x=(x1;x2;;xd),其中 x i x_i xi x \boldsymbol{x} x在第 i i i个属性上的取值, 线性模型试图学习一个通过属性的线性组合来进行预测的函数,即
f ( x ) = w 1 x 1 + w 2 x 2 + … + w d x d + b f(\boldsymbol{x})=w_{1} x_{1}+w_{2} x_{2}+\ldots+w_{d} x_{d}+b f(x)=w1x1+w2x2++wdxd+b
写成向量的形式是
f ( x ) = w T x + b f(\boldsymbol{x})=\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}+b f(x)=wTx+b
这时候这个 w = ( w 1 ; w 2 ; … ; w d ) \boldsymbol{w}=\left(w_{1} ; w_{2} ; \ldots ; w_{d}\right) w=(w1;w2;;wd),当然有时候,也把这个b纳入到w中一块学习,那上面这个就可以直接表示成 w T x \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x} wTx, w w w b b b确定之后, 该模型就完事了。

该模型简单,且可解释性比较好,因为对于某个属性,如果模型觉得比较重要,就会相应的加大该属性前面的权重 w w w。 那这个模型是怎么学习的呢? 也就是如何确定 w w w b b b呢?

这里的逻辑依然是先找到优化目标,然后想办法解决这个优化目标进行求解。 对于线性回归,使用的优化目标是均方误差最小化,因为均方误差有非常好的几何意义,对应了常用的“欧氏距离”。基于均方误差最小化来进行模型求解的方法称为“最小二乘法”, 在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧式距离之和最小

2.1 一元线性回归

好,下面我们从一元回归开始,对西瓜书上的公式进行推导。 首先,有请我们的优化目标:

( w ∗ , b ∗ ) = arg ⁡ min ⁡ ( w , b ) ∑ i = 1 m ( f ( x i ) − y i ) 2 = arg ⁡ min ⁡ ( w , b ) ∑ i = 1 m ( y i − w x i − b ) 2

( w , b ) = arg min ( w , b ) i = 1 m ( f ( x i ) y i ) 2 = arg min ( w , b ) i = 1 m ( y i w x i b ) 2
(w,b)=(w,b)argmini=1m(f(xi)yi)2=(w,b)argmini=1m(yiwxib)2
这个应该很好理解了,我们的模型预测值是 f ( x i ) f(x_i) f(xi), 请注意这里的 x i x_i xi不是指属性了,而是指的样本(这里有 m m m个样本)。这里一定要弄清楚我们的未知参数呀, 是 w , b w,b w,b,可千万不要误认为是 x i x_i xi了, 这个是样本值,也就是我们从任务中抽样出来的样本,既然是样本,它的属性值肯定都是知道的了,ML的目的就是通过这些已知样本求未知的参数最后确定出模型来。可千万不要弄混了, 然后还要注意一点就是这里的 w w w目前是一个维度的,每个样本目前是一个属性,不是向量哈,那个对应的是多元线性回归,也就是每个样本会有多个属性。

求解这个过程的思路这里是这样,西瓜书上是直接给出了结果,因为默认了上面这个函数是凸函数,而对于凸函数,可以直接通过导数等于0的方式求出最优解来且唯一。下面我们来展开这个过程,首先看一下凸函数是啥样子的,然后看下关于凸函数的两条定理,这个可以帮助我们求最值,然后就是证明下上面这个函数为啥是凸函数,最后就是求导得到 w w w b b b了。 理清了逻辑,下面开搞。

2.1.1 凸函数及相关定理

这个西瓜书上给出了定义,我这里直接拿过来:

对区间[a,b]上定义的函数 f f f,若它对区间中任意两点 x 1 , x 2 x_1,x_2 x1,x2,均有 f ( x 1 + x 2 2 ) ⩽ f ( x 1 ) + f ( x 2 ) 2 f\left(\frac{x_{1}+x_{2}}{2}\right) \leqslant \frac{f\left(x_{1}\right)+f\left(x_{2}\right)}{2} f(2x1+x2)2f(x1)+f(x2)
则称 f f f为区间[a,b]上的凸函数。还有一种定义方式,下面直接看图说话:


这个和上面那个其实说的一个意思的。意会一下子吧哈哈。

知道了啥叫凸函数之后, 下面给出两条关于凸函数的定理(高等数学):

  • 二元函数判断凹凸性

    f ( x , y ) f(x,y) f(x,y)在区域 D D D上具有二阶连续偏导数, 记 A = f x x ′ ′ ( x , y ) A=f^{''}_{xx}(x,y) A=fxx(x,y), B = f x y ′ ′ ( x , y ) B=f^{''}_{xy}(x,y) B=fxy(x,y), C = f y y ′ ′ ( x , y ) C=f^{''}_{yy}(x,y) C=fyy(x,y),则:

    1. D D D上恒有 A > 0 A>0 A>0, 且 A C − B 2 ≥ 0 AC-B^2\geq0 ACB20时, f ( x , y ) f(x,y) f(x,y)在区域 D D D上是凸函数
    2. D D D上恒有 A < 0 A<0 A<0, 且 A C − B 2 ≥ 0 AC-B^2\geq0 ACB20时, f ( x , y ) f(x,y) f(x,y)在区域 D D D上是凹函数
  • 二元凹凸函数求最值

    f ( x , y ) f(x,y) f(x,y)是在区域 D D D内具有连续偏导数的凸(或者凹)函数, ( x 0 , y 0 ) ∈ D (x_0,y_0)\in D (x0,y0)D f x ′ ( x 0 , y 0 ) = 0 , f y ′ ( x 0 , y 0 ) = 0 f^{'}_{x}(x_0,y_0)=0,f^{'}_{y}(x_0,y_0)=0 fx(x0,y0)=0,fy(x0,y0)=0, 则 f ( x 0 , y 0 ) f(x_0,y_0) f(x0,y0)必为 f ( x , y ) f(x,y) f(x,y) D D D内的最小值(或者最大值)

有了上面的两条定理之后,我们只要证明出上面的优化目标是凸函数, 然后就能通过导数求偏导的思路求解,得到最优解了。

2.1.2 证明优化目标是凸函数

这里的思路就是根据上面的定理求A,B,C,然后看看是否 A C − B 2 ≥ 0 AC-B^2 \geq0 ACB20, 直接手推了:

所以,根据凸函数定理1, E ( w , b ) E(w,b) E(w,b)是一个关于 w , b w,b w,b的凸函数, 根据凸函数定理2, ∂ E ( w , b ) ∂ w = 0 \frac{\partial E(w, b)}{\partial w}=0 wE(w,b)=0, ∂ E ( w , b ) ∂ b = 0 \frac{\partial E(w, b)}{\partial b}=0 bE(w,b)=0,即可求得最小值。下面开始求解了。

2.1.3 求解

下面开始手推这个过程了, 求解思路就是上面的先求 ∂ E ( w , b ) ∂ w , ∂ E ( w , b ) ∂ b \frac{\partial E(w, b)}{\partial w},\frac{\partial E(w, b)}{\partial b} wE(w,b),bE(w,b), 然后令其等于0得到 w , b w,b w,b。 西瓜书上的最后结果是经过一些化简才能得到的。

这里如果是求 w w w的话,python只能循环解,所以下面给出向量化的版本,也就是把上面求 w w w的运算改成向量乘积的方式,这样可以利用numpy加速矩阵的运算。

这就是一元线性回归了。但是上面说过,一元线性回归的每个样本只有1个属性进行描述特性, 这在实际场景中,显然是很少见的, 更一般的情形, 是样本由 d d d个属性来表述, 这样,我们试图学习的是
f ( x i ) = w T x i + b ,  使得  f ( x i ) ≃ y i f\left(\boldsymbol{x}_{i}\right)=\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}+b, \text { 使得 } f\left(\boldsymbol{x}_{i}\right) \simeq y_{i} f(xi)=wTxi+b, 使得 f(xi)yi
这就是"多元线性回归"。 这里的 x i \boldsymbol{x}_i xi是个 d d d维的向量了。所谓多元,就是多个未知参数, 这里的自变量依然是 w \boldsymbol{w} w,只不过这个也是一个向量的形式了,我们需要求得 w \boldsymbol{w} w每一个参数。

2.2 多元线性回归与最小二乘

2.2.1 损失函数

多元线性回归依然是可以采用最小二乘法对 w \boldsymbol{w} w b b b进行估计,但是这里为了方便后面的化简,需要写成向量的形式,并且要把我们的损失函数 E w E_w Ew写出来。下面是手推的过程:

这是一个多元实值函数,也就是由 n n n个未知数决定的实数。 我们下面就是基于这个损失函数求 w ^ \hat w w^。首先,证明这个多元实值函数 E w ^ E_{\hat w} Ew^是凸函数。

2.2.2 证明多元实值函数是凸函数

首先,得给出一些定理, 凸集,梯度,海塞矩阵以及多元实值函数的凹凸性判定定理:

  • 凸集的定义如下:

  • 多元实值函数的一阶导数与二阶导数的概念,也就是梯度与海塞矩阵

  • 海塞矩阵的概念:

  • 多元实值函数凹凸性判定定理

  • 矩阵求导 – 【标量-向量】的矩阵微分公式

下面开始推导多元实值函数是凸函数,并求解。

这样就推导出了最优解, 最终的线性回归模型:
f ( x ^ i ) = x ^ i T ( X T X ) − 1 X T y f\left(\hat{\boldsymbol{x}}_{i}\right)=\hat{\boldsymbol{x}}_{i}^{\mathrm{T}}\left(\mathbf{X}^{\mathrm{T}} \mathbf{X}\right)^{-1} \mathbf{X}^{\mathrm{T}} \boldsymbol{y} f(x^i)=x^iT(XTX)1XTy
但是往往上面那个前提并不满足,即 X T X \boldsymbol{X}^T\boldsymbol{X} XTX并不是满秩的,比如属性数量大于样本数量的时候(列数多于行数),此时不满秩。 往往会解出多个 w ^ \hat w w^, 都能使得均方误差最小化,选择哪一个解作为输出呢? 这里会由学习算法的归纳偏好决定。 常见的做法是引入正则进行一定的引导,使得选择简单的那个模型。

3. 广义线性之逻辑回归模型

3.1 广义线性模型

线性模型简单,但是变化多样, 普通的线性回归模型,是直接让样本的预测值逼近真实标记 y y y
y = w T x + b y=\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}+b y=wTx+b
但如果我们这里的逼近值不是 y y y,而是一个 y y y的衍生物呢?
ln ⁡ y = w T x + b \ln y=\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}+b lny=wTx+b
这样就得到了"对数线性回归", 实际上是让 e w T x + b e^{\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}+b} ewTx+b去逼近的 y y y。 但实质上,是求取输入空间到输出空间的非线性函数映射了。 这里的对数函数起到了将线性回归模型的预测值与真实标记联系起来的作用。

更一般的, 考虑单调可微函数 g ( ⋅ ) g(\cdot) g(), 令
y = g − 1 ( w T x + b ) y=g^{-1}\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}+b\right) y=g1(wTx+b)
这样就得到了"广义线性模型", g ( ⋅ ) g(\cdot) g()是联系函数, 显然,对数线性回归是广义线性模型在 g ( ⋅ ) = l n ( ⋅ ) g(\cdot)=ln(\cdot) g()=ln()的特例, 那么介绍上面这些干啥用呢? 就是为了说明下面的逻辑回归模型,并不是很复杂的知识,它也是广义线性模型的一种罢了,和对数线性回归这种差不多,无非就是这里的单调可微函数会有些不同罢了。

3.2 对数几率回归

在线性回归的基础上如何做分类任务呢? 找一个单调可微函数将分类任务的真实标记 y y y与线性回归模型的预测值联系起来。那么这个函数是啥呢? 长这个样子
y = 1 1 + e − z y=\frac{1}{1+e^{-z}} y=1+ez1
这个叫做对数几率函数, 是一种"Sigmoid函数", 将 z z z值转换成一个接近0或者1的 y y y值。函数图像如下:

关于这个函数的来历在这里就不整理了,之前的逻辑回归文章已经整理过了,下面把对数几率函数作为 g ( ⋅ ) g(\cdot) g(),即得到:
y = 1 1 + e − ( w T x + b ) y=\frac{1}{1+e^{-\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}+b\right)}} y=1+e(wTx+b)1
我们把这个式子等号右边拆解成线性回归的形式,就能看到拟合的究竟是真实标记的什么形式:
ln ⁡ y 1 − y = w T x + b \ln \frac{y}{1-y}=w^{\mathrm{T}} x+b ln1yy=wTx+b
如果将 y y y看做是样本的作为正例的可能性, 那么 1 − y 1-y 1y就是样本作为负例的可能性, 而这两者的比值叫做"几率", 反映的是 x \boldsymbol{x} x作为正例的相对可能性。 所以上面这个式子实际上是在用线性回归模型的预测结果逼近真实标记的对数几率。所以这个模型叫做对数几率模型,也就是我们常说的逻辑回归模型了,但注意,虽然名字里面带回归两个字,但实际上这个模型做的是分类任务。

那么这个模型如何求解呢? 这个就涉及到了损失函数是啥?下面进行推导下。

书上的是最小化损失函数的形式:
ℓ ( β ) = ∑ i = 1 m ( − y i β T x ^ i + ln ⁡ ( 1 + e β T x ^ i ) ) \ell(\boldsymbol{\beta})=\sum_{i=1}^{m}\left(-y_{i} \boldsymbol{\beta}^{\mathrm{T}} \hat{\boldsymbol{x}}_{i}+\ln \left(1+e^{\boldsymbol{\beta}^{\mathrm{T}} \hat{\boldsymbol{x}}_{i}}\right)\right) (β)=i=1m(yiβTx^i+ln(1+eβTx^i))
这是高阶可导的连续凸导数。这个可就不能用最小二乘了,最小二乘是找直线,使得样本到直线上的欧式距离最小, 这里可不是直线了。根据凸优化理论, 这种往往需要梯度下降或者拟牛顿法的方式求得最优解。

下面推导下西瓜书上的一阶梯度和二阶梯度:


所以这里可以牛顿法求解,更新公式:
β t + 1 = β t − ( ∂ 2 ℓ ( β ) ∂ β ∂ β T ) − 1 ∂ ℓ ( β ) ∂ β \boldsymbol{\beta}^{t+1}=\boldsymbol{\beta}^{t}-\left(\frac{\partial^{2} \ell(\boldsymbol{\beta})}{\partial \boldsymbol{\beta} \partial \boldsymbol{\beta}^{\mathrm{T}}}\right)^{-1} \frac{\partial \ell(\boldsymbol{\beta})}{\partial \boldsymbol{\beta}} βt+1=βt(ββT2(β))1β(β)
关于牛顿法和梯度下降法,这里就不整理了,可以看我之前的文章了。

4. LDA模型

线性判别分析也是一种经典的线性分类算法, 思想如下:

给定训练样例集,设法将样例投影到一条直线上使得同类样例的投影点尽可能接近,异类样例的投影点尽可能远离


这样, 在对新样本进行分类的时候,将其投影到同样的这条直线上,再根据投影点的位置来确定样本的类别。

西瓜书上的这个图非常形象:


那么怎么找到这样的一个方向呢? 也就是如何求出 w w w来呢? 这里我们依然得需要根据上面的两个条件同类样例的投影点尽可能接近,异类样例的投影点尽可能远离, 把目标函数定义出来,然后通过优化目标函数求解,这是解这样问题的一个思路。 所以下面就是上面这两个条件如何用数学的形式表示出来了。下面开始推导:

上面完成了基本定义,下面是目标函数的推导过程:

这个距离这个地方可能不是很明白,对于一条直线来说, 我们可以进行任意伸缩变化, 而这条直线始还是这条直线。 这里也是这个意思, w w w我们更关注的是方向, 而不关注 w w w这条直线的大小,所以这个 w w w,我们可以用任意常数 a a a进行缩放,即 a w aw aw w w w其实对于投影面来说,都表示的一个直线面, 这里在方向上没有区别的,如果还不理解,可以看我支持向量机那节里面的那个变换了。 所以这里我们可以用任意常数缩放 w w w,使得上面 w T S w w = 1 w^TS_ww=1 wTSww=1成立。

下面进行求解

这样就解出了 w w w。 不过在实践中通常对 S w S_w Sw进行奇异值分解, 即 S w = U Σ V T S_w=\mathbf{U} \boldsymbol{\Sigma} \mathbf{V}^{\mathrm{T}} Sw=UΣVT, 然后 S w − 1 = V Σ − 1 U T \mathbf{S}_{w}^{-1}=\mathbf{V} \boldsymbol{\Sigma}^{-1} \mathbf{U}^{\mathrm{T}} Sw1=VΣ1UT得到 S w − 1 \mathbf{S}_{w}^{-1} Sw1

LDA可从贝叶斯决策理论的角度来阐释,并能证明, 当两类数据同先验,满足高斯分布且协方差相等的时候,LDA可达到最优分类

对于LDA推广到多分类这个,就不推了,感兴趣的去看南瓜书吧, 和上面的思路是一样的。

LDA我们是可以发现,比如在二维空间中, 我们是把样本点先投影到某条直线上 w w w,然后再进行分类,而直线是一维的,在高维空间中其实LDA也就这样的一个效果,就是会把样本点投影到一个 d ′ d' d维度的空间里面,再这个空间中实现分类。 而 d ′ d' d往往是远小于原来的属性维度 d d d的。 这也就是说通过投影,LDA可以减少样本点的维数,且投影过程中使用了类别信息。 所以LDA常被视为一种经典的监督降维技术

5. 多分类学习与样本类别不均衡方法论

5.1 多分类学习

基于一些策略,可以用二分类学习器去解决多分类问题。基本思路: 拆解法–将多分类任务拆解成多个二分类任务来做。比较经典的三种方法:

  1. 一对一(One vs One, OVO)
    N N N个类别两两配对, 产生 N ( N − 1 ) 2 \frac{N(N-1)}{2} 2N(N1)个二分类任务, 训练这么多个学习器, 预测的时候呢? 让这些学习器都预测一遍,得到 N ( N − 1 ) 2 \frac{N(N-1)}{2} 2N(N1)个分类结果。 最终结果通过投票产生, 即预测最多的那个类别作为结果。
  2. 一对多(One vs Rest, OVR)
    每次将一个类样例作为正例, 其余所有类的样例作为负例训练 N N N个分类器, 预测的时候,若仅有一个分类器预测为正例,那就是这个类,如果有多个类预测为正例, 那么一般考虑预测器的预测置信度(也就是预测表现), 选择预测比较准确的预测器的结果

上面这两个可以拿西瓜书上的一个图来看,一目了然:


OVR只需训练 N N N个分类器, 而OVO要训练 N ( N − 1 ) 2 \frac{N(N-1)}{2} 2N(N1)个分类器, 所以,OVO的存储开销和测试时间一般要比OVR大, 但在训练的时候, OVR的每个分类器均使用全部的训练样本, 而OVO的每个分类器只需要用两个类别的样例, 所以类别很多的时候, OVO的训练时间要比OVR更小, 预测性能的话, 取决于数据分布,多数情形下,差不多。

下面再介绍一种方法, 算是开阔思路吧,就是多对多(Many vs Many, MvM), 这个之前没仔细的看,这次补上,这个方法每次将若干个类作为正例, 将其余的类作为反例构成二分类问题训练学习器, OVO是MvM的特殊情况(类为1的情况)。

MvM的正反类构造需要特殊的设计,不能随意取, 这里常用的一种技术是"纠错输出码", 思想:编码的时候引入类别拆分,解码的时候具有容错性

  • 编码: 对 N N N个类做 M M M次划分,每次划分将一部分类作为正类,一部分类作为负类,从而形成一个二分类训练集; 这样一共产生 M M M个二分类训练集,训练 M M M个分类器
  • 解码: M M M个分类器分别对测试样本进行预测,这些预测标记组成一个编码, 将这个预测编码与每个类别各自的编码进行比较, 返回其中距离最小的类别作为最终预测结果。

这么说挺抽象的, 还是看西瓜书的例子, 解释下那个例子就明白了, 左边是二元码,正负, 而右边是三元码, 正负和停用,这个无关紧要, 主要看看思想:

这个图其实是这样, 这里的 M M M是5, 也就是将原来的数据集划分了5次,得到了5个分类器 f 1 − f 5 f_1-f_5 f1f5, 而这里的类别总数是 4 4 4类,即 C 1 − C 4 C_1-C_4 C1C4, 4分类任务。 一开始是随机的把这4类样本进行了划分,将一部分类作为正例,一部分类作为负例,进行了5次,得到了5个分类器。

C 1 C_1 C1类在5个分类器上的预测结果是[-1,+1,-1,+1,+1]编码, 其他那几类类推。 那么在预测的时候, 我们拿测试样本,走一下这5个分类器,也会得到一个预测编码,比如上面的[-1,-1,+1,-1,+1]编码, 因为每个分类器对于这个样本都会有一个预测分类嘛。 那么最终样本究竟是上面4类里面的哪一类呢? 我们这样,第一个是可以算欧式距离, 比如 C 1 C_1 C1和当前预测编码算欧式距离 0 2 + 2 2 + 2 2 + 2 2 + 0 2 = 2 3 \sqrt{0^2+2^2+2^2+2^2+0^2}=2\sqrt{3} 02+22+22+22+02 =23 , 其他的类似计算。 而海明距离,我发现直接看编码对应不上的个数, 上面这两向量,有3个对应不上,所以海明距离是3,其他的类似。 这样算完了之后,发现 C 3 C_3 C3与当前测试样本的距离最小,所以当前测试样本是 C 3 C_3 C3类。

之所以叫做"纠错输出编码",是因为在测试阶段, 这个编码对分类器的错误有一定的容忍和修正能力。 比如上面测试样例是[-1,-1,+1,-1,+1], 而正确的 C 3 C_3 C3类编码是[-1,+1,+1,-1,+1], 也就是说 f 2 f_2 f2其实是预测错了, 但这个编码最后依然能够产生最终正确的分类。 编码越长,纠错能力越强,当然意味着学习器也会越多,计算存储开销大,所以依然是trade-off问题了

5.2 类别不平衡问题

类别不平衡: 分类任务中不同类别的训练样本数目相差很大。这样的任务下, 会对分类器的学习过程产生干扰,尤其是样本数目极其少的那种类别, 学习器可能学习不到这种类别的规律。所以需要了解类别不平衡的处理方法, 一般面试里面也会问到。 西瓜书上给出了几种。

  1. 再缩放或者再平衡策略
    比如用逻辑回归对新样本进行分类的时候,一般是预测的 y ^ \hat{y} y^与一个阈值相比较,比如>0.5预测为正类,小于0.5预测为反类, y ^ \hat{y} y^实际上表示的是正例的可能性,而几率 y 1 − y \frac{y}{1-y} 1yy反映了正例可能性与反例可能性的比值。 阈值设置为0.5,表明分类器认为正反例的可能性相同,所以当大于0.5的时候,模型认为正例的可能性大一点了,即预测为正例。 更普适的规则:
     若  y 1 − y > 1  则 预测为正例  \text { 若 } \frac{y}{1-y}>1 \text { 则 预测为正例 }   1yy>1  预测为正例 
    那么,如果是训练集里面正反例数目不一样的时候,这个正反例的可能性就不同了, 如果 m + m^+ m+表示正例的样本数, m − m^- m表示负例的样本数, 则观测几率变成了 m + m − \frac{m^+}{m^-} mm+, 通常假设训练集是真实样本总体的无偏采样,所以观测几率代表了真实几率,那么分类器的预测几率高于观测几率,就判定为正例:
     若  y 1 − y > m + m − 则预测为正例.  \text { 若 } \frac{y}{1-y}>\frac{m^{+}}{m^{-}} \text {则预测为正例. }   1yy>mm+则预测为正例
    但我们真实的预测是基于上面的那个式子,看如果是大于0.5,是正例,否则是反例,那么就需要把下面这个式子变形下
     若  y × m − ( 1 − y ) × m + > 1 则预测为正例.  \text { 若 } \frac{y\times m^{-}}{(1-y)\times m^{+}}>1 \text {则预测为正例. }   (1y)×m+y×m>1则预测为正例
    再变形:
    y ′ 1 − y ′ = y 1 − y × m − m + > 1 则 预 测 为 正 例 . \frac{y^{\prime}}{1-y^{\prime}}=\frac{y}{1-y} \times \frac{m^{-}}{m^{+}} > 1 {则预测为正例. } 1yy=1yy×m+m>1.
    这就是类别不平衡的一个基本策略–“再缩放”, 但是往往"训练集是真实样本总体的无偏抽样"的假设并不成立。"再缩放"也是"代价敏感学习"的基础, 将上面公式里面的 m − m + \frac{m^{-}}{m^{+}} m+m c o s t + c o s t − \frac{cost^{+}}{cost^{-}} costcost+来替换即可, c o s t + cost^+ cost+是将正例误分类为反例的代价, c o s t − cost^- cost是将反例误分为正类的代价。

  2. 欠采样或者下采样
    这个策略是去除一些反例(类别多的)使得类别平衡, 这样相当于训练集使用的训练集远小于初始的训练集, 这样可能会丢失重要信息, 所以欠采样的代表性算法EasyEnsemble,是利用了集成学习机制, 将反例划分为若干个集合供不同学习器使用,这样对每个学习器来看都进行了欠采样,但全局上来说,又用了所有数据, 不会丢失信息,这是一种不错的想法

  3. 过采样
    对类别少的样本进行过采样,即增加一些这样的样本,使得样本类别平衡, 但注意不能简单的将正样本重复采样,这样很容易导致过拟合, 过采样的代表性算法SMOTE,对训练集的正例进行插值来产生额外的正例

    在欠采样、过采样中的小经验:

    • 考虑对大类下的样本(超过1万、十万甚至更多)进行欠采样,即删除部分样本;
    • 考虑对小类下的样本(不足1为甚至更少)进行过采样,即添加部分样本的副本;
    • 考虑尝试随机采样与非随机采样两种采样方法;
    • 考虑对各类别尝试不同的采样比例,不一定是1:1,有时候1:1反而不好,因为与现实情况相差甚远;
    • 考虑同时使用过采样与欠采样,对二者进行结合;


    值得注意的是,使用过采样方法来解决不平衡问题时应适当地应用交叉验证。这是因为过采样会观察到罕见的样本,并根据分布函数应用自举生成新的随机数据,如果在过采样之后应用交叉验证,那么我们所做的就是将我们的模型过拟合于一个特定的人工引导结果。这就是为什么在过度采样数据之前进行交叉验证,就像实现特征选择一样。只有重复采样数据可以将随机性引入到数据集中,以确保不会出现过拟合问题。

  4. 使用新评价指标
    准确度这个评价指标在类别不均衡的分类任务中并不适用,甚至进行误导。因此在类别不均衡分类任务中,需要使用更有说服力的评价指标来对分类器进行评价。比如精确率,召回率,AUC等

  5. 尝试不同的分类算法
    因为不同的算法适用于不同的任务与数据,应该使用不同的算法进行比较。决策树往往在类别不均衡数据上表现不错。它使用基于类变量的划分规则去创建分类树,因此可以强制地将不同类别的样本分开。

  6. 对模型进行惩罚
    可以使用相同的分类算法,但是使用一个不同的角度,比如分类任务是识别那些小类,那么可以对分类器的小类样本数据增加权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集,译者注),从而使得分类器将重点集中在小类样本身上。一个具体做法就是,在训练分类器时,若分类器将小类样本分错时额外增加分类器一个小类样本分错代价,这个额外的代价可以使得分类器更加“关心”小类样本。

  7. 从一个新的角度理解问题
    我们可以从不同于分类的角度去解决数据不均衡性问题,我们可以把那些小类的样本作为异常点(outliers),因此该问题便转化为异常点检测(anomaly detection)变化趋势检测问题(change detection)

    • 异常点检测即是对那些罕见事件进行识别。如:银行信用卡诈骗识别,几十万中样本中可能有几百个诈骗用户。这些事件相对于正常情况是很少见的。
    • 变化趋势检测类似于异常点检测,不同在于其通过检测不寻常的变化趋势来识别。如通过观察用户模式或银行交易来检测用户行为的不寻常改变。
    • 将小类样本作为异常点这种思维的转变,可以帮助考虑新的方法去分离或分类样本。这两种方法从不同的角度去思考,让你尝试新的方法去解决问题。
  8. 创新
    仔细对你的问题进行分析与挖掘,是否可以将你的问题划分成多个更小的问题,而这些小问题更容易解决。这样是不是可以把大类的样本划分成更多的小类,从而转成一个多分类的问题?

当然上面这些策略具体用起来还是比较复杂的, 在知乎上看到了一个比较简单且可能有效的方式是这样:

  1. 不对数据进行过采样和欠采样,但使用现有的集成学习模型,如随机森林
  2. 输出随机森林的预测概率,调整阈值得到最终结果
  3. 选择合适的评估标准,如precision@n

这个策略是不采样,而是集成学习,在这个基础上用再缩放的策略+合适的评估。因为过采样和欠采样,实际上都在改变着数据的真实分布, 所以这两种方式可能会与真实的分布有差距。

当然,没用过, 具体怎么样,不知道, 当做一种思路吧。

6. 小总

这篇文章到这里就结束了, 虽然不是很复杂,但是点还是比较多的, 这次整理完全是跟着西瓜书来的, 在这个基础上,进行了细节展开和一些扩展知识。 当然,还有很多内容,没有合并过来, 比如逻辑回归的各种推导(损失函数,梯度等), 梯度下降法和拟牛顿法求解逻辑回归等, 这些内容我之前整理了相关博客,尤其是逻辑回归, 从指数族分布到sigmoid形式也进行了整理, 感兴趣的可以看看啦。 这篇文章宏观逻辑比较清晰,线性回归->逻辑回归->LDA->多分类和类别不平衡。读起来,还是相对比较顺畅的了。

下一篇, 决策树,Rush! 😉

参考


转载:https://blog.csdn.net/wuzhongqiang/article/details/113813852
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场