ML模型2:逻辑回归

逻辑回归是一种分类算法,利用sigmoid函数将权重加和映射到(0,1)区间,表示样本属于某一类的概率。通过极大似然估计和梯度下降求解最优权重。损失函数采用对数损失,保证了模型的优化方向。在多分类问题中,通过softmax函数扩展。逻辑回归与线性回归主要区别在于预测结果的连续性与离散性,以及损失函数的选择。" 104352341,7932265,Django实战:构建用户界面与URL路由解析,"['Django', '前端开发', '后端开发']

一些回归算法可以用来处理分类问题,以及一些分类算法可以进行回归预测,逻辑回归就属于前者。逻辑回归一般通过估计一个概率值,来表示一个样本属于某一类的概率。假如一个样本属于某一类的概率大于50%,那么就判该样本属于这一类。

优点:计算代价不高,易于理解和实现。

缺点:容易欠拟合,分类精度可能不高。

1. 实现分类

逻辑回归对样本概率的估计类似线性回归,也是计算出样本的一系列权重,然后将该权重线性加和之后输入到sigmoid函数中,进而计算出一个概率值。
p ^ = h θ ( x ) = σ ( θ T ⋅ x ) = σ ( x θ ) \hat{p}=h_{\theta}(x)=\sigma(\theta^T \cdot x)=\sigma(x\theta) p^=hθ(x)=σ(θTx)=σ(xθ)
其中 θ \theta θ 即为权重, σ \sigma σ 即为sigmoid函数,如下:
σ ( t ) = 1 1 + e − t \sigma(t)=\frac{1}{1+e^{-t}} σ(t)=1+et1
sigmoid函数图象:
image
sigmoid函数将 θ T x \theta^Tx θTx 的值域从 R \bf{R} R 映射到 (0, 1),从而表示发生事件的概率值,所以我们可以根据计算出来的概率值来进行对样本进行分类:
y ^ = { 0 p ^ &lt; 0.5 , 1 p ^ ≥ 0.5. \hat{y}=\begin{cases}0 \quad \hat{p}&lt;0.5,\\1 \quad \hat{p}\geq 0.5.\end{cases} y^={0p^<0.5,1p^0.5.

2. 损失函数

我们既然是通过sigmoid函数的值来进行概率预测的,那么我们的目标就应该是找出一组权重参数θ,能够对于正样本使得sigmoid函数有一个高的输出值,而对于负样本有一个低的输出。
我们可以通过计算损失函数来逐步达到这一的目标。对于单个样本来说,损失函数如下公式。与线性回归的平方误差不同,此处使用的是对数损失(Q1. 为什么?):
c ( θ ) = { − log ⁡ ( p ^ )     y = 1 , − log ⁡ ( 1 − p ^ ) y = 0. c(\theta)=\begin{cases}-\log(\hat{p}) \quad\quad\ \ \ y=1,\\-\log(1-\hat{p}) \quad y=0.\end{cases} c(θ)={log(p^)   y=1,log(1p^)y=0.
对整个数据集损失函数如下:
J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) log ⁡ ( p ^ ( i ) ) + ( 1 − y ( i ) ) l o g ( 1 − p ^ ( i ) ) ] J(\theta)=-\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}\log(\hat{p}^{(i)})+(1-y^{(i)})log(1-\hat{p}^{(i)})] J(θ)=m1i=1m[y(i)log(p^(i))+(1y(i))log(1p^(i))]
对以上损失函数并不像最小二乘法般有封闭解,但由于函数是凸函数,可以使用梯度下降的方法寻找最优值。

3. 极大似然估计

概率公式 h θ ( x ) h_{\theta}(x) hθ(x) 上面已经给出,对任意一个样本有
{ P ( y = 1 ∣ x ; θ ) = h θ ( x ) P ( y = 0 ∣ x ; θ ) = 1 − h θ ( x ) \begin{cases}P(y=1|x;\theta)=h_{\theta}(x)\\ P(y=0|x;\theta)=1-h_{\theta}(x)\end{cases} {P(y=1x;θ)=hθ(x)P(y=0x;θ)=1hθ(x)
对以上公式整合得:
P ( y ∣ x ; θ ) = h θ ( x ) y ( 1 − h θ ( x ) ) 1 − y P(y|x;\theta)=h_{\theta}(x)^y(1-h_{\theta}(x))^{1-y} P(yx;θ)=hθ(x)y(1hθ(x))1y
对所有样本,发生的概率为
L ( θ ) = ∏ i = 1 m P ( y ( i ) ∣ x ( i ) ; θ ) = ∏ i = 1 m h θ ( x ( i ) ) y ( i ) ( 1 − h θ ( x ( i ) ) ) 1 − y ( i ) L(\theta) =\prod_{i=1}^{m} P(y^{(i)}|x^{(i)};\theta) =\prod_{i=1}^{m} h_{\theta}(x^{(i)})^{y^{(i)}}(1-h_{\theta}(x^{(i)}))^{1-y^{(i)}} L(θ)=i=1mP(y(i)x(i);θ)=i=1mhθ(x(i))y(i)(1hθ(x(i)))1y(i)
对数似然
l ( θ ) = log ⁡ L ( θ ) = ∑ i = 1 m ( y ( i ) log ⁡ h θ ( x ( i ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − h θ ( x ( i ) ) ) l(\theta)=\log L(\theta) =\sum_{i=1}^{m} (y^{(i)} \log h_{\theta}(x^{(i)})+(1-y^{(i)}) \log (1-h_{\theta}(x^{(i)})) l(θ)=logL(θ)=i=1m(y(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))
引入 J ( θ ) = − 1 m l ( θ ) J(\theta)=-\frac{1}{m}l(\theta) J(θ)=m1l(θ) 作为损失函数,与上面得到的损失函数一致。
下面使用梯度下降求解。

4. 梯度下降求解

虽然损失函数看起来复杂,但得益于sigmoid函数,是其梯度计算后结果十分简单。
不难证明,对sigmoid函数求导得:
σ ′ ( t ) = σ ( t ) ( 1 − σ ( t ) ) \sigma&#x27;(t)=\sigma(t)(1-\sigma(t)) σ(t)=σ(t)(1σ(t))
J ( θ ) J(\theta) J(θ) 求梯度,得:
在这里插入图片描述
参数更新:
θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j:=\theta_j-\alpha\frac{1}{m} \sum_{i=1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)} θj:=θjαm1i=1m(hθ(x(i))y(i))xj(i)
向量化表示:
θ : = θ − α 1 m x T ( 1 1 + e − x θ − y ) \theta:=\theta-\alpha\frac{1}{m} x^T(\frac{1}{1+e^{-x\theta}}-y) θ:=θαm1xT(1+exθ1y)

5. 多分类问题softmax

softmax其实是Logistic的推广到多类别分类应用中,不需建立多个二分类分类器来实现多类别分类。softmax分类器的思想很简单,对于一个新的样本,softmax回归模型对于每一类都先计算出一个分数,然后通过softmax函数得出一个概率值,根据最终的概率值来确定属于哪一类。

通过下公式来计算并归一化之后就是输出的概率值:
p ^ k = σ ( θ k T x ) = exp ⁡ ( θ k T x ) ∑ j = 1 K exp ⁡ ( θ j T x ) \hat{p}_k=\sigma(\theta_k^Tx)=\frac{\exp(\theta_k^Tx)}{\sum_{j=1}^K\exp(\theta_j^Tx)} p^k=σ(θkTx)=j=1Kexp(θjTx)exp(θkTx)
计算出每一个分类的概率值后,从得到的各个概率值中选择最大的一个概率类别,即为预测类别 y ^ = a r g m a x ( p ^ k ) \hat{y}=argmax(\hat{p}_k) y^=argmax(p^k)

类似逻辑回归,我们可以通过损失函数求得最优解:
J ( Θ ) = − 1 m ∑ i = 1 m ∑ k = 1 K y k ( i ) log ⁡ ( exp ⁡ ( θ k T x ( i ) ) ∑ j = 1 K exp ⁡ ( θ j T x ( i ) ) ) ) J(\Theta)=-\frac{1}{m}\sum_{i=1}^{m}\sum_{k=1}^{K} y_k^{(i)}\log{(\frac{\exp(\theta_k^Tx^{(i)})}{\sum_{j=1}^K\exp(\theta_j^Tx^{(i)}))}}) J(Θ)=m1i=1mk=1Kyk(i)log(j=1Kexp(θjTx(i)))exp(θkTx(i)))
该损失函数又称为交叉熵,交叉熵常在机器学习中作为损失函数,比方说p表示真实类别的分布,q则为训练后的模型的预测类别分布,交叉熵损失函数可以衡量p与q的相似性。与逻辑回归类似,依然可以用梯度下降法求解。

6. Sklearn示例

官方文档

from sklearn import linear_model
clf = linear_model.LogisticRegression(C=1.0, penalty='l1', tol=1e-6)

参数列表

参数解释数值类型(默认值)选项
penalty惩罚项,用于指定惩罚中使用的范式str,默认l2l1/l2
dual用于指定使用对偶形式还是原形式;对偶形式只有在liblinear solver使用l2范式时设定;当样本数>特征数时,通常dual=Falsebool,默认FalseTrue/False
tol停止标准的容忍度float,默认1e-4
C正则化强度的倒数;必须是一个正浮点数;float(1.0)
fit_intercept指定是否应该在决策函数中添加一个常数(也称为偏差或截距)bool(True)True/False
intercept_scaling只有当’liblinear’被用,并且self.fit_intercept也设置为True时,该参数有效float(1)
class_weight与类别标签相关的权重,如果没有给出,所有类的权重都为1;'balanced’根据y的值自动调节与类频率成反比的权重默认(None)dict/balanced
random_state对数据洗牌的时候伪随机数生成器的种子;可选参数,default(None)int/Random State instance/None
solver指定用于优化问题的算法 ;[取值说明待定]str(‘liblinear’)newton-cg/lbfgs/liblinear/sag/saga
max_iter仅当newton-cg/sag/lbfgs使用的时候有效;最大的迭代次数int(100)
multi_class分类方式的选择str(ovr)ovr/multinomial/auto
verbosesolver是liblinear或者lbfgs时,设置此参数为任意的正数来应对冗长问题int(0)
warm_start当设置为True时,重复使用上次的解决方案以适应初始化,否则只需要擦除上次的解决方案;除非是solver是‘liblinear’bool(False)True/False
n_jobs可选参数,当multi_class=‘ovr’,并行化处理时使用的CPU核数default(None)int/None

属性:

属性解释
coef_array,shape(1,n_features)/(n_classes,n_features) ,输入模型的系数(权重)
intercept_array,shape(1,)/(n_classes,) 截距
n_iter_array,shape(n_classes,)/(1,) ,所有类的实际迭代次数。如果二进制或多项式,它只返回1个元素。对于liblinear求解器,只给出了所有类中迭代的最大数量。

Q&A

Q1. 为什么使用对数损失函数?

损失函数:平方损失函数 / 对数损失函数 / HingeLoss(0-1损失函数) / 绝对值损失函数

  1. 因为sigmoid函数非凸,使用平方损失得出的损失函数也是非凸,梯度下降后不一定能获取最小值。但是使用对数损失后,损失函数为凸函数,必定能找到最小值。
  2. 使用对数函数后,与极大对数似然的式子几乎一致,从概率理论上有理论证明。

Q2. 逻辑回归和线性回归有什么区别?(面试题

预测结果 - 线性回归的预测结果是连续的,逻辑回归的结果是离散的;
假设函数 - 逻辑回归在线性回归的实数范围输出上施加了sigmoid函数,将值收敛在0-1之间;
损失函数 - 线性回归是均方误差(平方损失),逻辑回归是对数似然函数(对数损失)。

参考:

  1. 机器学习-周志华
  2. ML模型3:逻辑回归模型
  3. 逻辑回归(logisitic regression)
  4. sklearn官方文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值