机器学习算法梳理(二)逻辑回归

一、逻辑回归与线性回归的联系与区别

  • 联系:
    -逻辑回归也被称为广义线性回归模型(generalized linear model),它与线性回归模型的形式基本上相同,都具有 h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 3 + θ n x n h_\theta(x)=\theta_0+\theta_1 x_1+\theta_2 x_2+\theta_3 x_3…+\theta_n x_n 的线性形式
  • 区别:
    -(1) 因变量不同,多重线性回归直接将 h θ ( x ) = θ x h_\theta(x)=\theta x 作为因变量, 而logistic回归则通过函数 g ( z ) = 1 1 + e z g(z)=\frac{1}{1+e^{-z}} h θ ( x ) h_\theta(x) 对应到一个隐状态 z z p = g ( h θ ( x ) ) p=g(h_\theta(x)) ,然后根据 p p 1 p 1-p 的大小决定因变量的值;
    -(2) 逻辑回归虽然叫回归,但其实是使用回归的思想去解决分类问题,通常用来解决最经典的二分类问题。比如:区分是否是垃圾邮件;银行判断是否给用户办理信用卡(0,1问题);
    -(3) 线性回归要求自变量和因变量呈线性关系,而logistic回归不要求自变量和因变量呈线性关系

在这里插入图片描述

二、逻辑回归的原理

逻辑回归(Logistic Regression) 算法基于 Sigmoid函数,公式如下:

g ( z ) = 1 1 + e z g(z)=\frac{1}{1+e^{-z}}
函数图像如下:
在这里插入图片描述
从图像上可以观察到一些直观的特性:

  • 函数的取值在0-1之间;
  • 0.5处为中心对称;
  • 越靠近x=0的取值斜率越大
  • 连续可导,且导函数推导如下:
    在这里插入图片描述
    Logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,即先把特征线性求和,然后使用函数g(z)将最为假设函数来预测。g(z)可以将连续值映射到0和1上。因此,逻辑回归的假设函数可写成如下形式:
    h θ ( x ) = g ( θ T x ) = 1 1 + e θ T x h_\theta(x)=g(\theta^{T}x)=\frac{1}{1+e^{-\theta^{T}x}}

三、损失函数的推导与优化

线性回归的损失函数对逻辑回归不可用,因为逻辑回归的值是0或者1,求距离平均值会是一条不断弯曲的曲线,不是理想的凸函数。因此逻辑回归采用交叉熵作为代价函数,即对数损失函数,能够有效避免梯度消失。

对数损失函数(logarithmic loss function)对数似然损失函数(log-likehood loss function) 的公式: L ( Y , P ( Y X ) ) = l o g P ( Y X ) L(Y,P(Y|X))=-logP(Y|X) ;有:

P ( y = 1 x ; θ ) = h θ ( x ) P(y=1 | x; \theta) = h_\theta(x)
P ( y = 0 x ; θ ) = 1 h θ ( x ) P(y=0 | x; \theta) =1-h_\theta(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}
假设有m个样本,则似然函数为:

L ( θ ) = p ( y x ; θ ) = i = 1 m p ( y ( i ) x ( i ) ; θ ) = i = 1 m ( h θ ( x ( i ) ) ) y ( i ) ( 1 h θ ( x ( i ) ) ) 1 y ( i ) \begin{aligned}L(\theta) &=p(y | x; \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)}} \end{aligned}

因此,对这个似然函数取log,可以得到
l ( θ ) = i = 1 m ( y ( i ) l o g h θ ( x ( i ) ) + ( 1 y ( i ) ) l o g ( 1 h θ ( x ( i ) ) ) l(\theta)=\sum_{i=1}^m(y^{(i)}logh_\theta(x^{(i)})+(1-y^{(i)})log(1-h_\theta(x^{(i)}))
逻辑回归中,采用的是负对数损失函数, 因此如果损失函数越小,表示模型越好,即是求以下损失函数的最小值。
J ( θ ) = 1 m [ i = 1 m ( y ( i ) l o g h θ ( x ( i ) ) + ( 1 y ( i ) ) l o g ( 1 h θ ( x ( i ) ) ) ] J(\theta)=-\frac{1}{m}[\sum_{i=1}^m(y^{(i)}logh_\theta(x^{(i)})+(1-y^{(i)})log(1-h_\theta(x^{(i)}))]
优化 一般采用的是梯度下降的方法进行参数迭代,公式如下:
θ j : = θ j α m i = 1 m ( h θ ( x ( i ) ) y ( i ) ) x j ( i ) \theta_j :=\theta_j- \frac{\alpha}{m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}

具体推导过程如下:
θ j : = θ j α m δ δ θ j J ( θ ) \theta_j :=\theta_j- \frac{\alpha}{m}\frac{\delta}{\delta_{\theta_j}}J(\theta)
α \alpha 为学习率, m m 为样本数量,下面即求损失函数对 θ \theta 的导数

求导过程:
在这里插入图片描述

四、正则化与模型评估指标

正则化

对于线性回归或逻辑回归的损失函数构成的模型,可能会有些权重很大,有些权重很小,导致过拟合,使得模型的复杂度提高,泛化能力较差, 加入正则化项可能解决问题。

正则化是结构风险最小化策略的实现,是在经验风险上加一个正则化项或惩罚项。正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化项就越大。

逻辑回归带L2正则项的损失函数
J ( θ ) = 1 m [ i = 1 m ( y ( i ) l o g h θ ( x ( i ) ) + ( 1 y ( i ) ) l o g ( 1 h θ ( x ( i ) ) ) ] + λ m j = 1 n θ j 2 J(\theta)=-\frac{1}{m}[\sum_{i=1}^m(y^{(i)}logh_\theta(x^{(i)})+(1-y^{(i)})log(1-h_\theta(x^{(i)}))]+\frac{\lambda}{m}\sum_{j=1}^n \theta_j^2
这个函数依然可以用梯度下降求解

正则化后的梯度下降算法 θ \theta 的更新变为:
θ j : = θ j α m i = 1 m ( h θ ( x ( i ) ) y ( i ) ) x j ( i ) λ m θ j \theta_j :=\theta_j- \frac{\alpha}{m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}-\frac{\lambda}{m}\theta_j

模型评估指标

分类器的评价指标主要有:

  • Accuracy
  • Precision
  • Recall
  • F1 score
  • ROC曲线和AUC
  • PR曲线

概念细节见西瓜书P29-36页
或者 https://blog.csdn.net/login_sonata/article/details/54288653

准确率:分类正确的样本个数占总样本的比例

#y_pred是预测标签
from sklearn.metrics import accuracy_score
y_pred, y_true=[1,2,3,4], [2,2,3,4]
accuracy_score(y_true=y_true, y_pred=y_pred)

混淆矩阵

  • 真阳性(True Positive,TP):指被分类器正确分类的正例数据
  • 真阴性(True Negative,TN):指被分类器正确分类的负例数据
  • 假阳性(False Positive,FP):被错误地标记为正例数据的负例数据
  • 假阴性(False Negative,FN):被错误地标记为负例数据的正例数据
from sklearn.metrics import confusion_matrix
y_pred, y_true =[1,0,1,0], [0,0,1,0]
confusion_matrix(y_true=y_true, y_pred=y_pred)

精确率,召回率,F1 Score

sklearn中classification_report可以直接输出各个类的precision recall f1-score report

from sklearn.metrics import classification_report
y_pred, y_true =[1,0,1,0], [0,0,1,0]
print(classification_report(y_true=y_true, y_pred=y_pred))

ROC 曲线:描述分类器的True Positive Rate与False Positive Rate之间的变化关系

import matplotlib.pyplot as plt 
from sklearn.metrics import roc_curve, auc
#y_test:实际的标签, dataset_pred:预测的概率值。
fpr, tpr, thresholds = roc_curve(y_test, dataset_pred)
roc_auc = auc(fpr, tpr)  
#画图,只需要plt.plot(fpr,tpr),变量roc_auc只是记录auc的值,通过auc()函数能计算出来  
plt.plot(fpr, tpr, lw=1, label='ROC(area = %0.2f)' % (roc_auc))
plt.xlabel("FPR (False Positive Rate)")
plt.ylabel("TPR (True Positive Rate)")
plt.title("Receiver Operating Characteristic, ROC(AUC = %0.2f)"% (roc_auc))
plt.show()

AUC:AUC即为ROC曲线下的面积

from sklearn.metrics import roc_auc_score
#y_test:实际的标签, dataset_pred:预测的概率值
roc_auc_score(y_test, dataset_pred

五、逻辑回归的优缺点

优点

  • 实现十分简单
  • 分类时计算量非常小,训练速度快,存储资源低
  • 可解释性强,可控性高
  • 以概率的形输出结果,可以做排序

缺点

  • 容易欠拟合,分类精度不高
  • 只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分
  • 逻辑回归本身无法筛选特征。有时候,会用gbdt来筛选特征,然后再进行逻辑回归。

六、样本不均衡问题的解决办法

类别数据不均衡问题:数据集中,每个类别下的样本数目相差很大。一般而已,如果类别不平衡比例超过4:1,那么其分类器会大大地因为数据不平衡性而无法满足分类要求的。因此在构建分类模型之前,需要对分类不均衡性问题进行处理。

处理方法如下:

  1. 重采样技术(Resampling)
    1.1 随机欠采样(Random Under-Sampling): 通过随机地消除占多数的类的样本来平衡类分布;直到多数类和少数类的实例实现平衡,目标才算达成。
    1.2 随机过采样(Random Over-Sampling ):过采样(Over-Sampling)通过随机复制少数类来增加其中的实例数量,从而可增加样本中少数类的代表性。
    1.3 基于聚类的过采样(Cluster-Based Over Sampling):K-均值聚类算法独立地被用于少数和多数类实例。这是为了识别数据集中的聚类。随后,每一个聚类都被过采样以至于相同类的所有聚类有着同样的实例数量,且所有的类有着相同的大小。
    1.4 信息性过采样:合成少数类过采样技术(SMOTE):这一技术可用来避免过拟合——当直接复制少数类实例并将其添加到主数据集时。从少数类中把一个数据子集作为一个实例取走,接着创建相似的新合成的实例。这些合成的实例接着被添加进原来的数据集。新数据集被用作样本以训练分类模型。

  2. 算法集成技术(Algorithmic Ensemble Techniques)
    上述部分涉及通过重采样原始数据提供平衡类来处理不平衡数据。集成方法的主要目的是提高单个分类器的性能。该方法从原始数据中构建几个两级分类器,然后整合它们的预测。

http://blog.csdn.net/heyongluoyao8/article/details/49408131
https://www.jiqizhixin.com/articles/2017-03-20-8

七、sklearn参数

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

参数名称 含义
penalty 字符串型,’l1’ or ‘l2’,默认:’l2’;正则化类型
dual 布尔型,默认:False。当样本数>特征数时,令dual=False;用于liblinear解决器中L2正则化。
tol 浮点型,默认:1e-4;迭代终止判断的误差范围。
C 浮点型,默认:1.0;其值等于正则化强度的倒数,为正的浮点数。数值越小表示正则化越强。
fit_intercept 布尔型,默认:True;指定是否应该向决策函数添加常量(即偏差或截距)。
intercept_scaling 浮点型,默认为1;仅仅当solver是”liblinear”时有用。
class_weight 默认为None;与“{class_label: weight}”形式中的类相关联的权重。如果不给,则所有的类的权重都应该是1。
random_state 整型,默认None;当“solver”==“sag”或“liblinear”时使用。在变换数据时使用的伪随机数生成器的种子。如果是整数, random_state为随机数生成器使用的种子;若为RandomState实例,则random_state为随机数生成器;如果没有,随机数生成器就是’ np.random '使用的RandomState实例。
solver {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’},默认: ‘liblinear’
max_iter 最大迭代次数,整型,默认是100
multi_class 字符串型,{ovr’, ‘multinomial’},默认:‘ovr’;如果选择的选项是“ovr”,那么一个二进制问题适合于每个标签,否则损失最小化就是整个概率分布的多项式损失。对liblinear solver无效。
verbose 整型,默认是0;对于liblinear和lbfgs solver,verbose可以设为任意正数。
warm_start 布尔型,默认为False;当设置为True时,重用前一个调用的解决方案以适合初始化。否则,只擦除前一个解决方案。对liblinear解码器无效。
n_jobs 整型,默认是1;如果multi_class=‘ovr’ ,则为在类上并行时使用的CPU核数。无论是否指定了multi_class,当将’ solver ’ '设置为’liblinear’时,将忽略此参数。如果给定值为-1,则使用所有核

https://blog.csdn.net/qq_38683692/article/details/82533460

优化算法选择参数:solver

solver参数的4种算法分别是:

  • liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
  • lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
  • newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
  • sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。

总结

  • 逻辑回归始于输出结果为有实际意义的连续值的线性回归,但是线性回归对于分类的问题没有办法准确分割,因此设计逻辑回归这个算法,输出结果表征了某个样本属于某类别的概率。逻辑回归的成功之处在于,将原本输出结果范围可以非常大的 θ T X \theta^TX 通过sigmoid函数映射到(0,1),从而完成概率的估测。
  • 求解逻辑回归参数的传统方法是梯度下降,构造为凸函数的代价函数后,每次沿着偏导方向(下降速度最快方向)迈进一小部分,直至N次迭代后到达最低点。

Reference

【1】https://blog.csdn.net/lc013/article/details/55002463
【2】https://blog.csdn.net/ddydavie/article/details/82668141
【3】https://blog.csdn.net/ustbclearwang/article/details/81235892
【4】cs229 note1

猜你喜欢

转载自blog.csdn.net/weixin_43831209/article/details/85838011