ML算法推导细节01—逻辑回归LR

探究算法细节,深入了解算法原理

1. 二分类

1.1二元逻辑回归的模型

  • 逻辑回归(Logistics Regression),是分类模型,不是回归模型,主要用于二分类,也可以完成多分类。
  • LR模型,训练速度快,足够解决普通的分类问题。
  • 逻辑函数又称为sigmoid函数

二元LR模型一般形式为:
h θ ( x ) = g ( θ T x ) = 1 1 + e − θ T x h_{\theta}(x)=g(\theta^Tx)=\frac{1}{1+e^{-\theta^Tx}} hθ(x)=g(θTx)=1+eθTx1
其中 z = θ T x z=\theta^Tx z=θTx g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+ez1 g ′ ( z ) = g ( z ) ( 1 − g ( z ) ) g^{'}(z)=g(z)(1-g(z)) g(z)=g(z)(1g(z))

θ T x &gt; 0 时 y = 1 \theta^Tx&gt;0 时y=1 θTx>0y=1 ,当 θ T x &lt; 0 时 y = 0 \theta^Tx&lt;0 时 y=0 θTx<0y=0

1.2 二元逻辑回归的损失函数(目标函数)

直接使用平方损失函数,会导致损失函数非凸,优化过程容易陷入局部最优点。
似然函数推导损失函数。

二分类,样本输出只有0或1,则有
P ( y = 1 ∣ x , θ ) = h θ ( x ) P(y=1|x,\theta)=h_{\theta}(x) P(y=1x,θ)=hθ(x)

P ( y = 0 ∣ x , θ ) = 1 − h θ ( x ) P(y=0|x,\theta)=1-h_{\theta}(x) P(y=0x,θ)=1hθ(x)

合并成一个式子,得到y的概率分布表达式为:
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

似然函数的表达式为(m个样本):
L ( θ ) = ∏ i = 1 m ( h θ ( x ( i ) ) ) y ( i ) ( 1 − h θ ( x ( i ) ) ) 1 − y ( i ) L(\theta)=\prod_{i=1}^m(h_{\theta}(x^{(i)}))^{y^{(i)}}(1-h_{\theta}(x^{(i)}))^{1-y^{(i)}} L(θ)=i=1m(hθ(x(i)))y(i)(1hθ(x(i)))1y(i)

对数似然函数取反,即为损失函数
最大化似然函数,最小化损失函数

J ( θ ) = − y l o g ( h θ ( x ) ) − ( 1 − y ) l o g ( 1 − h θ ( x ) ) ) J(\theta)=-ylog(h_{\theta}(x))-(1-y)log(1-h_{\theta}(x))) J(θ)=ylog(hθ(x))(1y)log(1hθ(x)))

称为交叉熵损失函数

  • 当y=0时, J ( θ ) = − l o g ( 1 − h θ ( x ) ) ) J(\theta)=-log(1-h_{\theta}(x))) J(θ)=log(1hθ(x))) h θ ( x ) h_{\theta}(x) hθ(x)趋近于0,则损失很小,趋近于1,则损失很大,即惩罚很大
  • 当y=1时, J ( θ ) = − l o g ( h θ ( x ) ) ) J(\theta)=-log(h_{\theta}(x))) J(θ)=log(hθ(x))) h θ ( x ) h_{\theta}(x) hθ(x)趋近于1,则损失很小,趋近于0,则损失很大,即惩罚很大

m个样本的损失函数:
J ( θ ) = − ∑ i = 1 m ( y ( i ) l o g ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ) J(\theta)=-\sum_{i=1}^m(y^{(i)}log(h_{\theta}(x^{(i)}))+(1-y^{(i)})log(1-h_{\theta}(x^{(i)}))) J(θ)=i=1m(y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i))))

1.3 二元逻辑回归的损失函数的优化方法

最小化损失函数,常用梯度下降法

θ \theta θ向量进行链式法则求导

Δ θ = ∂ J ( θ ) ∂ θ = − y h θ ( x ) h θ ( x ) x T + 1 − y 1 − h θ ( x ) ( 1 − h θ ( x ) ) h θ ( x ) x T = ( h θ ( x ) − y ) x T \begin{aligned}\Delta \theta &amp;= \frac{\partial J(\theta)}{\partial \theta}=\frac{-y}{h_{\theta}(x)}h_{\theta}(x)x^T+\frac{1-y}{1-h_{\theta}(x)}(1-h_{\theta}(x))h_{\theta}(x)x^T \\&amp; =(h_{\theta}(x)-y)x^T \end{aligned} Δθ=θJ(θ)=hθ(x)yhθ(x)xT+1hθ(x)1y(1hθ(x))hθ(x)xT=(hθ(x)y)xT

∂ J ( θ ) ∂ θ j = ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) ) x j ( i ) \frac{\partial J(\theta)}{\partial \theta_j}=\sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) ) x_{j}^{(i)} θjJ(θ)=i=1m(hθ(x(i))y(i)))xj(i)

参数更新:
θ = θ − α Δ θ T \theta=\theta-\alpha\Delta\theta^T θ=θαΔθT

假设样本数为m,特征维度为n,则 x x x n × m n\times m n×m矩阵,每个列向量是一个样本, θ \theta θ n × 1 n\times 1 n×1的列向量,y和 h θ ( x ) h_{\theta}(x) hθ(x) 1 × m 1 \times m 1×m的向量

1.4 二元逻辑回归的正则化

常见的有L1正则化、L2正则化

J ( θ ) = − y l o g ( h θ ( x ) ) − ( 1 − y ) l o g ( 1 − h θ ( x ) ) ) + α ∣ ∣ θ ∣ ∣ 1 J(\theta)=-ylog(h_{\theta}(x))-(1-y)log(1-h_{\theta}(x)))+\alpha||\theta||_1 J(θ)=ylog(hθ(x))(1y)log(1hθ(x)))+αθ1

J ( θ ) = − y l o g ( h θ ( x ) ) − ( 1 − y ) l o g ( 1 − h θ ( x ) ) ) + 1 2 α ∣ ∣ θ ∣ ∣ 2 2 J(\theta)=-ylog(h_{\theta}(x))-(1-y)log(1-h_{\theta}(x)))+\frac{1}{2}\alpha||\theta||^2_2 J(θ)=ylog(hθ(x))(1y)log(1hθ(x)))+21αθ22

L1正则化,损失函数的优化方法常用的有:坐标轴下降法、最小角回归法
L2正则化,损失函数的优化方法:梯度下降法

2. 多分类

2.1 多元逻辑回归的概率分布

对于多元逻辑回归的处理方法

  • 认为某类为1,其余类为0,称为 one-vs-rest
  • 每次选择两类样本做二分类,称为one-vs-one

对于二分类的推导,y的输出只有0或1
P ( y = 1 ∣ x , θ ) = h θ ( x ) = 1 1 + e − θ T x = e θ T x 1 + e θ T x P(y=1 | x, \theta)=h_{\theta}(x)=\frac{1}{1+e^{-\theta^Tx}}=\frac{e^{\theta^Tx}}{1+e^{\theta^Tx}} P(y=1x,θ)=hθ(x)=1+eθTx1=1+eθTxeθTx

P ( y = 0 ∣ x , θ ) = 1 − h θ ( x ) = 1 1 + e θ T x P(y=0 | x, \theta)=1-h_{\theta}(x)=\frac{1}{1+e^{\theta^Tx}} P(y=0x,θ)=1hθ(x)=1+eθTx1

log ⁡ P ( y = 1 ∣ x , θ ) P ( y = 0 ∣ x , θ ) = θ T x \log \frac{P(y=1 | x, \theta)}{P(y=0 | x, \theta)}=\theta^Tx logP(y=0x,θ)P(y=1x,θ)=θTx

对于多分类,样本输出y的取值假设为 1,2,…,K

看作多个二分类,以第 K 类为基准,则有

log ⁡ P ( y = 1 ∣ x , θ ) P ( y = K ∣ x , θ ) = θ 1 T x \log \frac{P(y=1 | x, \theta)}{P(y=K | x, \theta)}=\theta^T_1x logP(y=Kx,θ)P(y=1x,θ)=θ1Tx

log ⁡ P ( y = i ∣ x , θ ) P ( y = K ∣ x , θ ) = θ i T x \log \frac{P(y=i | x, \theta)}{P(y=K | x, \theta)}=\theta^T_ix logP(y=Kx,θ)P(y=ix,θ)=θiTx

log ⁡ P ( y = K − 1 ∣ x , θ ) P ( y = K ∣ x , θ ) = θ K − 1 T x \log \frac{P(y=K-1 | x, \theta)}{P(y=K | x, \theta)}=\theta^T_{K-1}x logP(y=Kx,θ)P(y=K1x,θ)=θK1Tx

∑ i = 1 K P ( y = i ∣ x , θ ) = 1 \sum_{i=1}^{K} P(y=i | x, \theta)=1 i=1KP(y=ix,θ)=1 可得:

( 1 + ∑ i = 1 K e θ i T x ) P ( y = K ∣ x , θ ) = 1 (1+\sum_{i=1}^{K} e^{\theta^T_ix})P(y=K|x,\theta)=1 (1+i=1KeθiTx)P(y=Kx,θ)=1

得到多元逻辑回归的概率分布为:
P ( y = K ∣ x , θ ) = 1 1 + ∑ i = 1 K − 1 e θ i T x P(y=K | x, \theta)=\frac{1}{1+\sum_{i=1}^{K-1} e^{\theta_i^T x}} P(y=Kx,θ)=1+i=1K1eθiTx1

P ( y = i ∣ x , θ ) = e θ i T x 1 + ∑ i = 1 K − 1 e θ i T x P(y=i | x, \theta)=\frac{ e^{\theta_i^T x}}{1+\sum_{i=1}^{K-1} e^{\theta_i^T x}} P(y=ix,θ)=1+i=1K1eθiTxeθiTx

3. sklearn.linear_model.LogisticRegression

3.1 sklearn LR模型参数详解

class LogisticRegression(penalty=’l2’, dual=False, tol=0.0001, C=1.0, 
fit_intercept=True, intercept_scaling=1, class_weight=None,
random_state=None, solver=’warn’, max_iter=100, multi_class=’warn’,
verbose=0, warm_start=False, n_jobs=None)

参数说明:
1、penalty

  • 正则项,可选L1或L2。
  • 如果使用L2正则化依然过拟合,或者特征非常多,希望做特征选择,可以考虑L1正则化。
  • 正则化的选择会影响损失函数优化算法的选择,L2正则化,{newton-cg,lbfgs,liblinear,sag}都可以选择,L1正则化只能选择 liblinear优化算法。因为L1正则化的损失函数不是连续可导的,而{newton-cg,lbfgs,sag}都需要损失函数一阶或二阶连续导数

2、dual

  • 用来指明是否将原问题转换成对偶问题
  • 对偶问题类似于相反问题,比如求解最大值的线性规划,转换成求解最小值的线性规划
  • 当样本数大于特征数,选择False,并且只能在liblinear+l2 penalty情况下使用

3、tol

  • 残差收敛条件,收敛的时候两步之差<tol就停止。

4、C

  • 正则化系数,必须是正数,值越小,正则化强度越大,防止过拟合的程度越大, α = 1 / C \alpha=1/C α=1/C

5、fit_intercept

  • 指定是否将常量(bias or intercept)加入到 decision function

6、intercept_scaling

  • 仅在优化算法 liblinear 情况下使用
  • x变成[x, self.intercept_scaling],就是w0或者b

7、class_weight

  • 调节正负样本比例,默认为None,可以选择 “balanced”,可以传入字典 {class_label:weight}
  • balanced,自动调整与输入数据中的类频率成反比的权重
  • 如果制定了sample_weight,class_weight将与sample_weight相乘

8、random_state

  • 随机种子的设置,使用相同的训练集和测试集,运行多少次,结果都一样

9、solver

  • 损失函数的优化算法,{liblinear,lbfgs,newton-cg,sag,saga}
    在这里插入图片描述
  • newton-cg, lbfgs和sag 只能用于L2正则化。
  • liblinear对L1正则化和L2正则化都适用。
  • sag,数据量较少时不宜选用,数据量很大时,为了速度,sag是第一选择。

10、max_iter

  • 优化算法收敛的最大迭代次数,适用于{newton-cg,lbfgs,sag}

11、multi_class

  • 可选 ovr、auto和multinomial,二分类问题效果一样,主要用于多分类问题
  • 如果二分类,或者liblinear优化算法,自动选择ovr,其他选择 multinational
  • ovr:把分类问题简化成是/非两类问题 one-vs-rest
  • multinomial:每次选出两个类别进行判断,再从剩下的类别中选出两个进行判断 one-vs-one

12、verbose

  • “冗余的”,会输出一些模型运算过程,默认0,不输出
  • 对于liblinear,lbfgs,设置任意正数,输出详细过程

13、warm_start

  • 是否使用上次的模型结果作为初始化

14、n_jobs

  • 并行化时使用的CPU核的数量,-1表示使用所有的CPU核

3.2 sklearn LR模型的对象和方法

模型对象

  • coef_:返回各特征的系数,绝对值大小可以理解成特征重要性
  • intercept_:返回模型的截距,即偏置

模型方法

  • decision_function(X):返回决策函数值(比如svm中的决策距离)
  • predict_proba(X):返回每个类别的概率值(有几类就返回几列值)
  • predict_log_proba(X):返回概率值的log值(即将概率取对数)
  • predict(X):返回预测结果值(0/1)
  • score(X, y=None):返回正确率
  • get_params(deep=True):返回估计器的参数

3.3 sklearn LR模型使用例子

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
X, y = load_iris(return_X_y=True)
print("data and label size: ",X.shape,y.shape)  # 3类,4个特征

clf = LogisticRegression(penalty='l2',C=0.8,class_weight='balanced',
	                     random_state=1, solver='lbfgs', max_iter=500, 
	                     multi_class='multinomial', n_jobs=1)

clf.fit(X, y)
#print(clf.decision_function(X))
print(clf.score(X,y))
print(clf.predict(X[0:5, :]))       # 每个样本的预测类别
print(clf.predict_proba(X[0:5, :])) # 每个样本每一类的预测概率
print(clf.get_params(deep=True))    # 超参数
print(clf.coef_)       # 参数,shape=(4,3)
print(clf.intercept_)  # 偏置,shape=(3,)

输出结果为:

data and label size:  (150, 4) (150,)                                                                                                                                   
0.9733333333333334                                                                                                                                                      
[0 0 0 0 0]                                                                                                                                                             
[[9.78571369e-01 2.14285809e-02 4.97036800e-08]                                                                                                                         
 [9.67528768e-01 3.24711382e-02 9.34656464e-08]                                                                                                                         
 [9.82653272e-01 1.73466871e-02 4.06294555e-08]                                                                                                                         
 [9.72519756e-01 2.74801246e-02 1.19497174e-07]                                                                                                                         
 [9.82584586e-01 1.74153725e-02 4.17372134e-08]]                                                                                                                        
{'C': 0.8, 'class_weight': 'balanced', 'dual': False, 'fit_intercept': True, 'intercept_scaling': 1, 
'max_iter': 500, 'multi_class': 'multinomial', 'n_jobs': 1, 'penalt
y': 'l2', 'random_state': 1, 'solver': 'lbfgs', 'tol': 0.0001, 'verbose': 0, 'warm_start': False}                                                                       
[[-0.41970458  0.88110727 -2.36861993 -1.01249304]                                                                                                                      
 [ 0.48079601 -0.3330422  -0.17330735 -0.84848953]                                                                                                                      
 [-0.06109144 -0.54806507  2.54192728  1.86098257]]                                                                                                                     
[  9.44748223   2.1768459  -11.62432814]                                                                                                                                

4. 样本不均衡时的LR模型的损失函数

LR源码:第119行
https://github.com/scikit-learn/scikit-learn/blob/7b136e9/sklearn/linear_model/logistic.py

# Logistic loss is the negative of the log of the logistic function.
out = -np.sum(sample_weight * log_logistic(yz)) + .5 * alpha * np.dot(w, w)
# sample_weight, shape(n_samples,)每个样本分配一个权重

(1)样本不平衡的问题
样本不均衡时,训练时损失函数会偏向样本多的一方,造成训练时的损失函数很小,但是对样本较少的类别识别率不高。

(2)解决办法

  • 对样本多的类别降采样(随机抽样)
  • 对样本少的类别过采样
  • 修改损失函数

(3)修改损失函数—加权交叉熵

  • 正负样本的权重与样本数成反比,比如正样本30,负样本70,则正样本权重是0.7,负样本权重是0.3
  • 权重是类别样本数的反比例,正样本权重 (70+30)/30=3.33,负样本权重 (70+30)/70=1.42

L ( X , y ) = − w + ⋅ y log ⁡ p ( Y = 1 ∣ X ) − w − ⋅ ( 1 − y ) log ⁡ p ( Y = 0 ∣ X ) L(X, y)=-w_{+} \cdot y \log p(Y=1 | X)-w_{-} \cdot (1-y) \log p(Y=0 | X) L(X,y)=w+ylogp(Y=1X)w(1y)logp(Y=0X)

参考博客
1. 逻辑回归原理小结,刘建平
2. 多元逻辑回归公式推导
3. 逻辑回归(logistics regression)
4. sklearn LR模型文档
5. sklearn LR模型源码
6. Sklearn参数详解—LR模型
7. 样本不均衡下的分类损失函数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值