十大机器学习算法-逻辑回归(LR)

逻辑回归(LR)是一种经典的分类方法,常用于二分类问题。本文介绍了其基本思想,包括模型参数估计的对数似然函数及梯度下降求解过程,并探讨了特征处理、正则化、类别不平衡等问题。此外,还提供了代码实现链接及参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

逻辑斯蒂回归(logistic regression,LR)是统计学习中经典的分类方法,属于对数线性模型。是目前使用最多的机器学习分类方法,在推荐系统中的应用非常广泛。

基本思想

假定只考虑二分类问题,随机变量X取值为实数,随机变量Y取值为1或0。二项逻辑斯蒂回归模型是如下的条件概率分布:
P ( Y = 1 ∣ x ) = e x p ( w ⋅ x + b ) 1 + e x p ( w ⋅ x + b ) P ( Y = 0 ∣ x ) = 1 1 + e x p ( w ⋅ x + b ) P(Y=1|x) = \frac{exp(w\cdot x +b)}{1+exp(w\cdot x +b)} \\ P(Y=0|x) = \frac{1}{1+exp(w\cdot x +b)} P(Y=1x)=1+exp(wx+b)exp(wx+b)P(Y=0x)=1+exp(wx+b)1
其中 x ∈ R n x\in \mathbb{R}^n xRn 是输入, Y ∈ { 0 , 1 } Y\in \{0,1\} Y{0,1} 是输出, w ∈ R n w\in \mathbb{R}^n wRn b ∈ R b\in \mathbb{R} bR是参数。 w w w 称为权值向量, b b b 称为偏置, w ⋅ x w\cdot x wx w w w b b b的内积。

逻辑斯蒂回归模型的特点:一个事件的几率(odds)是指该事件发生的概率与该事件不发生的概率的比值。如果事件发生概率是 p p p,那么该事件的几率是 p 1 − p \frac{p}{1-p} 1pp,该事件的对数几率或logit函数是 l o g i t ( p ) = l o g p 1 − p {\rm logit}(p) = {\rm log}\frac{p}{1-p} logit(p)=log1pp
对LR而言,有
l o g P ( Y = 1 ) 1 − P ( Y = 1 ) = w ⋅ x + b {\rm log} \frac{P(Y=1)}{1-P(Y=1)} = w\cdot x +b log1P(Y=1)P(Y=1)=wx+b
在逻辑斯蒂回归模型中,输出 Y = 1 Y=1 Y=1 的对数几率是输入 x x x 的线性函数

模型参数估计

设:
P ( Y = 1 ∣ x ) = π ( x ) ,   P ( Y = 0 ∣ x ) = 1 − π ( x ) P(Y=1|x) = \pi(x),\ P(Y=0|x) = 1-\pi(x) P(Y=1x)=π(x), P(Y=0x)=1π(x)
似然函数必然满足二项分布为:
∏ 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=1N[π(xi)]yi[1π(xi)]1yi
负对数似然函数为:(交叉熵作为损失函数)
L ( w ) = − ∑ i = 1 N [ y i   l o g   π ( x i ) + ( 1 − y i )   l o g   ( 1 − π ( x i ) ) ] = − ∑ i = 1 N [ y i   l o g π ( x i ) 1 − π ( x i ) + l o g ( 1 − π ( x i ) ) ] = − ∑ i = 1 N [ y i   ( w ⋅ x i ) − l o g ( 1 + e x p ( w ⋅ x i ) ) ] L(w) = -\sum_{i=1}^{N}[y_i\ {\rm log}\ \pi(x_i) + (1-y_i)\ {\rm log}\ (1-\pi(x_i))] \\ = -\sum_{i=1}^{N}[y_i\ {\rm log}\frac{\pi(x_i)}{1-\pi(x_i)} + {\rm log}(1-\pi(x_i))] \\ = -\sum_{i=1}^{N}[y_i\ (w\cdot x_i) - {\rm log}(1+ exp(w \cdot x_i))] L(w)=i=1N[yi log π(xi)+(1yi) log (1π(xi))]=i=1N[yi log1π(xi)π(xi)+log(1π(xi))]=i=1N[yi (wxi)log(1+exp(wxi))]
通常采用随机梯度下降法对 L ( w ) L(w) L(w) 求极小值,得到 w w w 的估计值。

对参数 w w w 求导得到
∂ L ( w ) ∂ w j = − ∑ i = 1 N [ x i ( j ) y i − x i ( j ) e x p ( w ⋅ x i ) 1 + e x p ( w ⋅ x i ) ] = − ∑ i = 1 N [ x i ( j ) ( y i − e x p ( w ⋅ x i ) 1 + e x p ( w ⋅ x i ) ) ] = ∑ i = 1 N [ x i ( j ) ( g ( w ⋅ x i ) − y i ) ] \frac{\partial L(w)}{\partial w_j} = -\sum_{i=1}^{N} [x_i^{(j)}y_i - \frac{x_i^{(j)} exp(w\cdot x_i)}{1 + exp(w\cdot x_i)} ]\\ = -\sum_{i=1}^{N} [x_i^{(j)}(y_i - \frac{ exp(w\cdot x_i)}{1 + exp(w\cdot x_i)}) ]\\ = \sum_{i=1}^{N} [x_i^{(j)}(g(w\cdot x_i) - y_i)] wjL(w)=i=1N[xi(j)yi1+exp(wxi)xi(j)exp(wxi)]=i=1N[xi(j)(yi1+exp(wxi)exp(wxi))]=i=1N[xi(j)(g(wxi)yi)]
其中 g ( x ) = 1 1 + e x p ( − x ) g(x) = \frac{1}{1+exp(-x)} g(x)=1+exp(x)1 x i ( j ) x_i^{(j)} xi(j) 表示第i个样本的第j维输入特征。

参数更新公式
w j t + 1 = w t − η   ∑ i = 1 N [ x i ( j ) ( g ( w ⋅ x i ) − y i ) w_j^{t+1} = w^t - \eta \ \sum_{i=1}^{N} [x_i^{(j)}(g(w\cdot x_i) - y_i ) wjt+1=wtη i=1N[xi(j)(g(wxi)yi)
其中 η \eta η 是学习率。

代码实现

Github:https://github.com/zhengjingwei/statistical-learning-method/tree/master/LogisticRegression

class Logistic_Regression(object):

    def __init__(self):
        self.learning_step = 0.0001 # 学习率
        self.max_iteration = 5000 # 分类正确上界,当分类正确的次数超过上界时,认为已训练好,退出训练

    def train(self,features, labels):
        self.w = [0.0] * (len(features[0]) + 1) # 初始化模型参数 某位元素为偏移b

        correct_count = 0 # 分类正确的次数

        while correct_count < self.max_iteration:

            # 随机选取数据(xi,yi)
            index = random.randint(0, len(labels) - 1)
            x = list(features[index])
            x.append(1.0)
            y = labels[index]

            if y == self.predict_(x): # 分类正确的次数加1,并跳过下面的步骤
                correct_count += 1
                continue

            wx = sum([self.w[i] * x[i] for i in range(len(self.w))])
            while wx>700: # 控制运算结果越界
                wx/=2
            exp_wx = math.exp(wx)

            for i in range(len(self.w)):
                self.w[i] -= self.learning_step * \
                    (-y * x[i] + float(x[i] * exp_wx) / float(1 + exp_wx)) # 梯度上升

    def predict_(self,x):
        wx = sum([self.w[j] * x[j] for j in range(len(self.w))])
        while wx>700: # 控制运算结果越界
            wx/=2
        exp_wx = math.exp(wx)

        predict1 = exp_wx / (1 + exp_wx)
        predict0 = 1 / (1 + exp_wx)

        if predict1 > predict0:
            return 1
        else:
            return 0


    def predict(self,features):
        labels = []

        for feature in features:
            x = list(feature)
            x.append(1)
            labels.append(self.predict_(x))

        return labels

常见问题

不同点

  • 逻辑回归处理的是分类问题,线性回归处理的是回归问题;
  • 逻辑回归中认为y是因变量,即逻辑回归的因变量是离散的,线性回归的因变量是连续的。

相同点:

  • 二者都使用了极大似然估计来对训练样本进行建模
  • 求解超参数过程中,都可以使用梯度下降的方法

联系

如果把一个事件的几率(odds)定义为该事件发生的概率与不发生概率的比值 p 1 − p \frac{p}{1-p} 1pp ,那么逻辑回归可以看做是对于"y=1|x"这一事件的对数几率的线性回归
l o g p 1 − p = θ T x , 其 中   p = P ( y = 1 ∣ x ) {\rm log} \frac{p}{1-p} = \theta^{T}x ,其中\ p = P(y=1|x) log1pp=θTx p=P(y=1x)

可以看做广义线性模型在因变量y服从二元分布时的一个特殊情况

如果一个样本只对应于一个标签(多分类问题):
假设每个样本属于不同标签的概率服从几何分布,使用softmax regression进行分类:
(3) h θ = [ p ( y = 1 ∣ x ; θ ) p ( y = 2 ∣ x ; θ ) ⋮ p ( y = 1 ∣ x ; θ ) ] = 1 ∑ j = 1 k e θ T x [ e θ 1 T x e θ 2 T x ⋮ e θ k T x ] h_\theta = \left[ \begin{matrix} p(y=1|x;\theta)\\ p(y=2|x;\theta) \\ \vdots \\ p(y=1|x;\theta) \end{matrix} \right] = \frac{1}{\sum_{j=1}^{k} e^{\theta^T x}} \left[ \begin{matrix} e^{\theta_1^T x}\\ e^{\theta_2^T x} \\ \vdots \\ e^{\theta_k^T x} \end{matrix} \right] \tag{3} hθ=p(y=1x;θ)p(y=2x;θ)p(y=1x;θ)=j=1keθTx1eθ1Txeθ2TxeθkTx(3)
其中 θ 1 , θ 2 … , θ k ∈ R n \theta_1,\theta_2 \dots,\theta_k \in \mathbb{R}^n θ1,θ2,θkRn

如果存在样本可能属于多个标签的情况时,可以训练k个二分类的逻辑回归分类器。第i个分类器用以区分每个样本是否可以归为第i类。

归一化

  • 提高收敛速度:梯度下降“小步慢走”,通过不断的迭代,求得最优解,归一化让特征向量中不同特征的取值相差不大,训练速度大大加快。
  • 有可能提高精度

取对数:对数函数在其定义域内是单调递增函数,取对数后不会改变数据的相对关系;取对数的主要作用有:

  1. 稀疏向量内积乘法运算速度快,计算结果方便存储,容易scalable(扩展)。

  2. 离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰。

  3. 逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合。

  4. 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力。

  5. 特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。

  6. 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。

L1和L2正则,都可以防止过拟合,增强模型的泛化能力;区别在于L1使参数更稀疏,达到特征选取的作用;L2使参数更接近于0。

从解空间的形状来看:

L1正则项约束后的解空间是多边形,而L2正则项约束后的解空间是圆形。而多边形的解空间更容易在尖角处与等高线碰撞出稀疏解。

对于存在线性相关的一组特征,L1正则会使得部分参数为0;L2正则会使参数都趋近于0但不会为0。

见上节模型参数估计部分

参考资料

https://www.cnblogs.com/eilearn/p/8990034.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值