再读线性回归 Linear Regression (逻辑回归)

1. 逻辑回归

线性回归算法旨在通过训练一定量的样本来预测 连续型数值 (Continuous Value) (即回归问题)。当然了,聪明的科学家们早就想好如何将线性回归运用到 离散型数值 (Discrate value) 的预测上了 (即分类问题)。我们将这种运用在 分类问题 上的线性回归模型称之为 逻辑回归 (Logistic Regression)

简单的来说,逻辑回归仅仅是将线性回归的输出值做了一定的处理,并设置一个阈值。当预测的输出值大于或等于这个阈值时,将样本分为一类;当预测的输出与之小于这个阈值时,将样本分为另一类。一个常见的例子就是给线性回归结果上加上 Sigmoid 函数(或称 Logisitc 函数),如此一来,线性回归的输出值就固定在 0 到 1 之间了。我们设置阈值为 0.5,当预测值大于 0.5 时,认为样本为正类;反之则为负类。

在二元分类 (类 0 和类 1) 问题中,输出结果可被看做是一个概率值 (0~1),该概率值表示该样本预测为类 1 的概率。用户可以调解不同的阈值来控制分类的结果,当类 0 样本个数较多时,为了防止不平衡现象,我们可以适当调高阈值 (如大于 0.5)。

在这里插入图片描述
上图左边展示了标准的 Sigmoid 函数,它将整个 x 轴平均分为 2 部分,即 x ≥ 0 x \geq 0 x0 时样本为正,当 x < 0 x < 0 x<0 时样本为负,我们记这个函数为 g ( z ) g(z) g(z)。因此,逻辑回归的函数可以写为,

h θ ( x ) = g ( θ T x ) , 其 中 g ( z ) = 1 1 + e − z h_{\theta}(x) = g(\theta^Tx),其中 g(z)=\frac{1}{1+e^{-z}} hθ(x)=g(θTx)g(z)=1+ez1

其中, θ \theta θ 是 n+1 维参数向量( θ ∈ R ( n + 1 ) × 1 \theta \in \mathbb{R}^{(n+1)\times1} θR(n+1)×1)。 x x x 表示单个样本,也是 n+1 维向量( x ∈ R ( n + 1 ) × 1 x \in \mathbb{R}^{(n+1)\times1} xR(n+1)×1)。对于每个样本 x x x,我们通过计算其 h θ ( x ) h_{\theta}(x) hθ(x) 的值来判断它到底属于正类或负类,其预测结果表示为,

预 测 类 别 = { 1 , 如 果 h θ ( x ) ≥ 0.5 0 , 如 果 h θ ( x ) < 0.5 预测类别 = \begin{cases} 1,如果 h_{\theta}(x) \geq 0.5 \\ 0,如果 h_{\theta}(x) < 0.5 \end{cases} ={1hθ(x)0.50hθ(x)<0.5

总而言之,逻辑回归的过程可以概括为,输入为 ( n + 1 ) (n+1) (n+1) 维的样本 x x x,输出为 x x x 属于正类( y = 1 y=1 y=1)的概率。人们通过这个概率来判断 x x x 更有可能属于正类还是负类。

除此之外,对于多分类问题(即预测类的个数大于2),逻辑回归默认使用 one-vs-rest1 来判断。简单的说,就是针对 k k k 个类( y 1 , y 2 , . . . , y k y_1, y_2, ..., y_k y1,y2,...,yk),训练出 k k k 个分类器 ( h θ 1 ( x ) h^1_{\theta}(x) hθ1(x), h θ 2 ( x ) h^2_{\theta}(x) hθ2(x), …, h θ k ( x ) h^k_{\theta}(x) hθk(x),)。在训练单个分类器 h θ i ( x ) h^i_{\theta}(x) hθi(x) 中,将 y i y_i yi 作为正类,其余类作为负类。当来了一个新的样本 x n e w x_{new} xnew 时,依次用这 k k k 个分类器进行预测,找到预测值最大的分类器 h θ ∗ ( x ) h^{*}_{\theta}(x) hθ(x),并将其对应的 y ∗ y_* y 类作为最终预测结果。

2. 决策边界 Decision Boundary

线性回归和逻辑回归最大的不同在于预测值 h θ ( x ) h_{\theta}(x) hθ(x) 的计算。即在线性回归中, h θ ( x ) = θ T x h_{\theta}(x)=\theta^Tx hθ(x)=θTx。而在逻辑回归中, h θ ( x ) = g ( θ T x ) h_{\theta}(x)=g(\theta^Tx) hθ(x)=g(θTx)。若设置分类的阈值为 0.5,那么判断 h θ ( x ) h_{\theta}(x) hθ(x) 与 0.5 的关系,等价于判断 θ T x \theta^Tx θTx 与 0 的关系(由 Sigmoid 函数曲线图可知)。换句话说,如果 θ T x \theta^Tx θTx 大于等于 0,那么 h θ ( x ) h_{\theta}(x) hθ(x) 一定大于等于 0.5,则 x x x 可能为正类样本;反之, θ T x \theta^Tx θTx 小于 0,那么 h θ ( x ) h_{\theta}(x) hθ(x) 一定小于 0.5,则 x x x 可能为负类样本。因此, θ T x = 0 \theta^Tx=0 θTx=0 构成了逻辑回归的决策边界,具体的,

θ T x = θ 0 x 0 + θ 1 x 1 + . . . + θ n x n = 0. \theta^Tx = \theta_0x_0+\theta_1x_1 + ...+\theta_nx_n = 0. θTx=θ0x0+θ1x1+...+θnxn=0.

2.1 线性决策边界

举个例子,现需要针对下图中的正类和负类样本进行分类。每个样本 x = ( x 1 ; x 2 ) x=(x_1;x_2) x=(x1;x2) 都是一个二维向量。现在,假设我们针对特征 { 1 , x 1 , x 2 } \{1,x_1,x_2\} {1,x1,x2} 学习到的参数 θ = ( − 3 ; 1 ; 1 ) \theta=(-3;1;1) θ=(3;1;1),则逻辑回归对应的决策边界为 ,

决 策 边 界 : − 3 + x 1 + x 2 = 0 决策边界:-3+x_1+x_2=0 3+x1+x2=0

由于这个决策边界是关于 x 1 , x 2 x1,x2 x1,x2 的线性表达式,故这个决策边界也成为 线性决策边界。线性决策边界是分类问题中最简单最基础的。
在这里插入图片描述

2.2 非线性决策边界

另一个例子,假设正类和负类样本的分布如下图所示,我们很难通过一条直线将它们分割开。这个时候我们需要一个非线性的决策边界。这个时候简单的 x 1 , x 2 x1,x2 x1,x2 两个特征不能很好的分类,我们需要增加到 2 次方的特征,如 x 1 2 x_1^2 x12 x 2 x 2 x_2x_2 x2x2 x 2 2 x_2^2 x22。现假设逻辑回归算法针对特征 { 1 , x 1 , x 2 , x 1 2 , x 1 x 2 , x 2 2 } \{1,x_1,x_2,x_1^2,x_1x_2,x_2^2\} {1,x1,x2,x12,x1x2,x22} 学习到的参数是 θ = ( − 2 ; 0 ; 0 ; 1 ; 0 ; 1 ) \theta=(-2;0;0;1;0;1) θ=(2;0;0;1;0;1)。那么逻辑回归模型的决策边界为,

决 策 边 界 : − 2 + x 1 2 + x 2 2 = 0 决策边界:-2 + x_1^2 + x_2^2 = 0 2+x12+x22=0

因此,只要将回归方程中的项的次数升高,逻辑回归还是具有很强的非线性分类能力的。

在这里插入图片描述

3. 代价函数

逻辑回归的代价函数 J ( θ ) J(\theta) J(θ) 比较特别,它与线性回归的代价函数不同,它更多的是一个分段函数形式呈现。也就是说,当样本 x ( i ) x^{(i)} x(i) 是正类( y ( i ) = 1 y^{(i)}=1 y(i)=1)或负类( y ( i ) = 0 y^{(i)}=0 y(i)=0)时,计算代价的公式是不同的。【这么做的原因是保持代价函数是凸函数,也即保持只有一个全局优点】

x ( i ) 的 代 价 = { − l o g ( h θ ( x ( i ) ) ) , y ( i ) = 1 − l o g ( 1 − h θ ( x ( i ) ) ) , y ( i ) = 0 x^{(i)} 的代价 = \begin{cases} -log(h_{\theta}(x^{(i)})),y^{(i)}=1 \\ -log(1-h_{\theta}(x^{(i)})),y^{(i)}=0 \end{cases} x(i)={log(hθ(x(i)))y(i)=1log(1hθ(x(i)))y(i)=0

首先,当样本本来是正类时,根据 − l o g ( x ) -log(x) log(x) 可知:预测值越是接近 1,代价越小;当预测值越是接近 0,代价变得非常大(无穷大)。与之相反,当样本本来是负类时,根据 − l o g ( 1 − x ) -log(1-x) log(1x) 可知:预测值越是接近 1,代价变得大(无穷大);当预测值越是接近 0,代价越小。这个设计不得不说十分巧妙。
在这里插入图片描述
通常,为了简化代价函数(将多行写成一行的形式),我们在前面添加参数 y y y ( 1 − y ) (1-y) (1y),这样代价函数 x^{(i)} 的代价也可以写成,

x ( i ) 的 代 价 = y ( i ) [ ( − 1 ) × l o g ( h θ ( x ( i ) ) ) ] + ( 1 − y ( i ) ) [ ( − 1 ) × − l o g ( 1 − h θ ( x ( i ) ) ) ] x^{(i)} 的代价 =y^{(i)}[(-1)\times log(h_{\theta}(x^{(i)}))]+(1-y^{(i)})[(-1)\times -log(1-h_{\theta}(x^{(i)}))] x(i)=y(i)[(1)×log(hθ(x(i)))]+(1y(i))[(1)×log(1hθ(x(i)))]

因此总的代价函数 J ( θ ) J(\theta) J(θ) 可看做是所有样本 x ( i ) x^{(i)} x(i) 的代价之和( m m m 表示样本个数),记为,

J ( θ ) = 1 m ∑ i = 1 m { y ( i ) [ ( − 1 ) × l o g ( h θ ( x ( i ) ) ) ] + ( 1 − y ( i ) ) [ ( − 1 ) × − l o g ( 1 − h θ ( x ( i ) ) ) ] } J(\theta)= \frac{1}{m}\sum_{i=1}^{m} \{y^{(i)}[(-1)\times log(h_{\theta}(x^{(i)}))]+(1-y^{(i)})[(-1)\times -log(1-h_{\theta}(x^{(i)}))]\} J(θ)=m1i=1m{y(i)[(1)×log(hθ(x(i)))]+(1y(i))[(1)×log(1hθ(x(i)))]}

4. 参数优化

在逻辑回归中,我们沿用之前介绍的梯度下降算法(Gradient Descent)。通过每次迭代中对参数的调整来实现代价函数最小化,逻辑回归同样是求解出使得代价函数最小的参数集合 θ \theta θ

θ = arg ⁡ min ⁡ θ J ( θ ) \theta = \mathop{\arg\min}_{\theta} J(\theta) θ=argminθJ(θ)

同样的,我们对代价函数求导,发现其梯度与线性回归的梯度一模一样,

∂ J ∂ θ j = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) , j = 0 , 2 , . . . , n \frac{\partial J}{\partial \theta_j} = \frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x^{(i)}_j,j=0,2,...,n θjJ=m1i=1m(hθ(x(i))y(i))xj(i)j=0,2,...,n

每一轮迭代,调整的参数也是类似,令 α \alpha α 为学习率,则参数项 θ j \theta_j θj 调整过程为,

θ j = θ j − α m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x ( i ) \theta_j = \theta_j - \frac{\alpha}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x^{(i)} θj=θjmαi=1m(hθ(x(i))y(i))x(i)

我们将 j 推广到一般情况,即每次对待看做是对 θ \theta θ 上的矩阵操作,令 X X X Y Y Y 分别表示特征集合和标签集合,我们得到每次迭代的新的 θ \theta θ 应该等于(等式同样适用于线性回归),

θ = θ − α m X T ( X θ − Y ) \theta = \theta - \frac{\alpha}{m} X^T(X\theta-Y) θ=θmαXT(XθY)

可以说,参数调优过程跟线性回归一模一样。但是注意,逻辑回归的 h θ ( x ) h_{\theta}(x) hθ(x) 与线性回归的不同。


5. Sklearn 实现

Sklearn 同样提供了逻辑回归算法的现成品,即 sklearn.linear_model.LogisticRegression2 。实例代码如下,函数logistic_regression_example() 建立了一个逻辑回归模型的框架,函数 set_arguments() 列出了逻辑回归中比较重要的参数。

from  sklearn.linear_model import LogisticRegression

def logistic_regression_example(args, train_x, train_y):
    # fit the train_x, train_y
    clf = LogisticRegression()
    clf.set_params(**args)
    clf.fit(train_x,train_y)
	return clf
    
def set_arguments():
    args = dict()
    args['penalty']='elasticnet' # 正则化方法, {'l1','l2','elasticnet',none'}
    args['l1_ratio']=0.5 # elasticnet 正则化情况下的 L1 正则化的比例
    args['class_weight']='balanced' # 类权值, {'balanced',dict={0:0.5,1:0.5}}
    args['max_iter']=800 # 迭代次数, default=100
    args['tol']=1e-4
    args['solver'] = 'saga' # 优化算法, {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}
    args['random_state']=0 # 随机种子
    return args

值得一提的是优化算法的参数 solver ,它对逻辑回归的预测结果影响重大。默认的选择有 ‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’(具体见博文3)。不同的优化算法对应着不同的正则化的惩罚项 ,即penalty 参数。举个例子,‘liblinear’ 优化算法在小数据集上效果不错,它对应的 penalty 不能等于 ‘none’。而其他的 ‘newton-cg’, ‘lbfgs’, ‘sag’ 和 ‘saga’ 等优化算法,它们的 penalty 必须等于 ‘l2’ 或者 ‘none’。支持 penalty=‘elasticnet’ 的只有 ‘saga’ 算法。这个在设置参数时应该留意。

另外,这个 class_weight 表示类权重,也就是说分类器分错不同类的样本的代价是不同的,这个参数可以取 ‘balanced’,也可以取一个字典,里面标记不同权重的比例,如 ‘{0:0.5,0:0.5}’。不同的权重会导致决策边界向正类或负类的方向偏移,这个参数也是处理类不平衡问题的一个好办法。

6. 逻辑回归的探讨

在逻辑回归分类器中,我们使用不同的参数,会造成不同效果的分类效果。如下面 4 个子图所示,其中 liblinear 方法就不是一个好的分类结果,因为它训练出来的决策边界太靠近负类(蓝色的 X),这回导致一些本来是负类的样本被划分进正类中(橙色的 O)。其他的 saga,lbfgs,和 sag 效果都还不错,它们的决策边界都还比较适中。但是现阶段,逻辑回归并没有办法区别谁好谁坏,这对我们的分类效果造成了一定的影响。
在这里插入图片描述
解决这个问题的办法有 2 个,一个是继续尝试不同的参数,直至找到类似于 saga,lbfgs,和 sag 效果的参数;另一个是使用更加稳定的分类方法,如 支持向量机(Support Vector Machine,SVM),支持向量机正是针对此现象,而力图找出到离 2 个类的距离均最大的决策边界,也称之为超平面。


  1. one-vs-rest与one-vs-one以及sklearn的实现. Link ↩︎

  2. LogisticRegression 官方文档. Link ↩︎

  3. logistic 回归的sklearn实践. Link ↩︎

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值