您的位置:首页 > 其它

组队学习二:逻辑回归算法梳理

2019-04-01 18:41 155 查看

逻辑回归算法梳理

一、逻辑回归与线性回归的联系与区别
1.逻辑回归是分类问题,线性回归是预测问题。
2.逻辑回归的输出范围在【0,1】之间,可以看做是一个概率值。而线性回归的输出则没有限制条件,具体输出要看解决的问题决定。
3.损失函数,线性回归使用的是均方误差作为损失函数,逻辑回归使用的是交叉熵作为损失函数。
二者之间的联系:逻辑回归就是在线性回归的基础上增加了一个sigmoid函数,把线性回归的预测值经过sigmoid函数映射成一个【0,1】之间的概率值。

二、逻辑回归的原理
逻辑回归就是在线性回归的基础上增加了一个sigmoid函数,把线性回归的预测值经过sigmoid函数映射成一个【0,1】之间的概率值,大于设定的阈值的为一类,否则为另一类。这就是逻辑回归的二分类的基本原理。
逻辑回归可以看做有两步:
第一步和线性回归模型的形式相同,前面已经推导过,既一个关于输入x的线性函数:
Z=WTX+bZ=W^T X+bZ=WTX+b
第二步通过一个逻辑函数,既sigmoid函数,将线性函数转换为非线性函数:
z=WTX+bz=W^T X+bz=WTX+b θ(z)=11+e−z\theta(z)=\frac{1}{1+e^{-z}}θ(z)=1+e−z1​
三、逻辑回归损失函数推导及优化
损失函数:为了训练逻辑回归模型的参数w和b需要一个代价函数,算法的代价函数是对m个样本的损失函数求和然后除以m:
首先给出结论:
逻辑回归的损失函数:L(y^,y)=−ylog(y^)−(1−y)log(1−y^)L(\hat y,y)=-ylog(\hat y)-(1-y)log(1-\hat y)L(y^​,y)=−ylog(y^​)−(1−y)log(1−y^​)
逻辑回归的代价函数:J(w,b)=1m∑i=1mL(y^(i),y(i))=1m∑i=1m(−ylog(y^(i))−(1−y(i)log(1−y^(i)))J(w,b)=\frac{1}{m}\sum\limits_{i=1}^{m} L(\hat y ^{(i)},y^{(i)})=\frac{1}{m}\sum\limits_{i=1}^{m} (-ylog(\hat y ^{(i)})-(1-y^{(i)}log(1-\hat y ^{(i)}))J(w,b)=m1​i=1∑m​L(y^​(i),y(i))=m1​i=1∑m​(−ylog(y^​(i))−(1−y(i)log(1−y^​(i)))
接下来我们推导一下为什么逻辑回归的损失函数会是这样的形式:
我们假定输入样本x,用y^\hat yy^​表示训练样本x条件下预测y=1的概率,对应的,就可以用1−y^1-\hat y1−y^​来表示训练样本x条件下预测y=0的概率,也就是说:
y=1:P(y∣x)=y^y=1: P(y|x) = \hat yy=1:P(y∣x)=y^​
y=0:P(y∣x)=1−y^y=0: P(y|x) = 1-\hat yy=0:P(y∣x)=1−y^​
仔细观察发现,我们可以把这两个公式合并为一个公式:
P(y∣x)=y^y(1−y^)(1−y)P(y|x)=\hat y ^y (1-\hat y)^{(1-y)}P(y∣x)=y^​y(1−y^​)(1−y)
可以发现,在y=1时,公式右边等于y^\hat yy^​,在y=0时,公式右边等于1−y^1-\hat y1−y^​。由于log函数是严格递增的函数,所以最大化log(原函数)等于最大化原函数,上式因此可以化简如下,也就是损失函数的负数:
logP(y∣x)=ylog(y^)+(1−y)log(1−y^)=−L(y^,y)logP(y|x)=ylog(\hat y)+(1-y)log(1-\hat y)=-L(\hat y ,y)logP(y∣x)=ylog(y^​)+(1−y)log(1−y^​)=−L(y^​,y)
因此最大化似然函数也就是最小化损失函数。
对于m个样本的训练集,服从独立同分布的样本的联合概率密度函数就是每个样本的概率密度函数的乘积:
log∏i=1mP(y(i)∣x(i))=∑i=1mlogP(y(i)∣x(i))=−∑i=1mL(y^(i),y(i))log\prod_{i=1}^{m}P(y^{(i)}|x^{(i)})=\sum\limits_{i=1}^{m}logP(y^{(i)}|x^{(i)})=-\sum\limits_{i=1}^{m}L(\hat y ^{(i)},y^{(i)})logi=1∏m​P(y(i)∣x(i))=i=1∑m​logP(y(i)∣x(i))=−i=1∑m​L(y^​(i),y(i))
同样的,最大化似然函数也就是最小化代价函数,因此可以去掉负号,并除以一个常数m对代价函数进行适当的缩放,得到:
J(w,b)=1m∑i=1mL(y^(i),y(i))J(w,b)=\frac{1}{m}\sum\limits_{i=1}^{m}L(\hat y ^{(i)},y^{(i)})J(w,b)=m1​i=1∑m​L(y^​(i),y(i))
至此,逻辑回归的损失函数和代价函数推导完毕。接下来要说一下逻辑回归的优化问题:
逻辑回归的优化与线性回归的优化差别不大,都是可以通过常规的优化方法进行优化,逻辑回归的优化一般采用梯度下降法,求导和迭代。关于优化方法的理论推导可以看看我写的前一篇博客-线性回归算法梳理,因为逻辑回归实际上就是线性回归的输出多了一个映射,其实要优化的参数归根结底还是θ\thetaθ,因此,线性回归的优化明白了逻辑回归也就没什么问题了。
https://blog.csdn.net/qq_41978536/article/details/88884810。

四、正则化与模型评估指标
正则化:正则化的主要目的是为了防止过拟合。常用的正则化项有以下三种:
1.L0正则项:L0正则项就是L0范数,是向量中非零元素的个数,原则上说是个数越小越好,但是L0范数不连续,难以优化求解,这个时候L1范数就出来了。
2.L1正则项:L1正则项就是L1范数,L1范数是向量中各个元素的绝对值之和,也叫“稀疏规则算子”,就是大名鼎鼎的LASSO(Least Absolute Shrinkage and Selection Operator),直译就是“最小收缩绝对选择算子”。
3.L2正则项:L2正则项就是L2范数,L2范数是标识各个参数的平方和。
逻辑回归的模型评估指标:
简单介绍一种分类器模型评估的通用指标:

TP:True Positive,“真阳性”。
FP:False Positive,“假阳性”。
FN:False Negative,“假阴性”。
TN:True Negative,“真阴性”。
有几个术语:
误检率: fp rate = sum(fp) / (sum(fp) + sum(tn))
查准率: precision rate = sum(tp) / (sum(tp) + sum(fp))
查全率: recall rate = sum(tp) / (sum(tp) + sum(fn))
漏检率:miss rate = sum(fn) / (sum(tp) + sum(fn))

ROC(Receiver Operating Characteristic)曲线和AUC(Area Under Curve):
ROC曲线的横坐标为false positive rate(FPR),纵坐标为 true positive rate(TPR)
当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。根据每个测试样本属于正样本的概率值从大到小排序,依次将 “Score”值作为阈值threshold,当测试样本属于正样本的概率 大于或等于这个threshold时,认为它为正样本,否则为负样本。
一个典型的ROC曲线如下图:

计算出ROC曲线下面的面积,就是AUC的值。 介于0.5和1.0之间,越大越好。

Mean absolute error 和 Root mean squared error:
平均绝对误差和均方根误差,用来衡量分类器预测值和实际结果的差异,越小越好。

Relative absolute error 和 Root relative squared error :
相对绝对误差和相对均方根误差,有时绝对误差不能体现误差的真实大小,而相对误差通过体现误差占真值的比重来反映误差大小。

五、逻辑回归的优缺点
优点:
1.预测结果是介于0和1之间的概率值。
2.可以适用于连续型和类别型自变量。
3.容易使用和解释。
缺点:
1.对模型中自变量多重共线性较为敏感,例如两个高度相关自变量同时放入模型,可能导致较弱的一个自变量回归符号不符合预期,符号被扭转。​需要利用因子分析或者变量聚类分析等手段来选择代表性的自变量,以减少候选变量之间的相关性;
2.预测结果呈“S”型,因此从log(odds)向概率转化的过程是非线性的,在两端随着​log(odds)值的变化,概率变化很小,边际值太小,slope太小,而中间概率的变化很大,很敏感。 导致很多区间的变量变化对目标概率的影响没有区分度,无法确定阀值。

六、样本不均衡问题的解决办法
1.扩充数据集:
首先想到能否获得更多数据,尤其是小类(该类样本数据极少)的数据,更多的数据往往能得到更多的分布信息。
2.对数据集进行重采样:
过采样(over-sampling),对小类的数据样本进行过采样来增加小类的数据样本个数,即采样的个数大于该类样本的个数。
欠采样(under-sampling),对大类的数据样本进行欠采样来减少大类的数据样本个数,即采样的个数少于该类样本的个数。
采样算法容易实现,效果也不错,但可能增大模型的偏差(Bias),因为放大或者缩小某些样本的影响相当于改变了原数据集的分布。对不同的类别也要采取不同的采样比例,但一般不会是1:1,因为与现实情况相差甚远,压缩大类的数据是个不错的选择。
3.人造数据:
一种简单的产生人造数据的方法是:在该类下所有样本的每个属性特征的取值空间中随机选取一个组成新的样本,即属性值随机采样。此方法多用于小类中的样本,不过它可能破坏原属性的线性关系。如在图像中,对一幅图像进行扭曲得到另一幅图像,即改变了原图像的某些特征值,而且该方法可能会产生现实中不存在的样本。
4.改变分类算法
(1)使用代价函数时,可以增加小类样本的权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集),从而使得分类器将重点集中在小类样本身上。刚开始,可以设置每个类别的权值与样本个数比例的倒数,然后可以使用过采样进行调优。
(2)可以把小类样本作为异常点(outliers),把问题转化为异常点检测问题(anomaly detection)。此时分类器需要学习到大类的决策分界面,即分类器是一个单个类分类器(One Class Classifier)。
5.尝试其它评价指标
在样本不均衡的情况下,准确度(Accuracy)这个评价指标是无效的,因此在类别不均衡的分类任务中,需要使用更具有说服力的指标来对分类器进行评价。

七、逻辑回归的sklearn相关参数

sklearn:https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
默认的参数值:

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)

参数详解:

1.penalty:正则化项的选择。正则化主要有两种:L1和L2,LogisticRegression默认选择L2正则化。

‘liblinear’ 支持L1和L2,但‘newton-cg’, ‘sag’ 和‘lbfgs’ 只支持L2正则化。

2.dual:bool(True、False), default:False

如果为True,则求解对偶形式,只有在penalty=‘l2’ 且solver=‘liblinear’ 时有对偶形式;通常样本数大于特征数的情况下,默认为False,求解原始形式。

3.tol : float, default:1e-4
停止标准,误差不超过tol时,停止进一步的计算。

4.C :float,default:1.0
正则化强度(正则化系数λ)的倒数; 必须是大于0的浮点数。 与支持向量机一样,较小的值指定更强的正则化,通常默认为1。

5.fit_intercept:bool(True、False),default:True
是否存在截距,默认存在。

6.intercept_scaling :float,default :1.0

仅在使用solver为“liblinear”且fit_intercept=True时有用。 在这种情况下,x变为[x,intercept_scaling],即具有等于intercept_scaling的常数值的“合成”特征被附加到实例矢量。 截距变成了intercept_scaling * synthetic_feature_weight. 注意: 合成特征权重与所有其他特征一样经受l1 / l2正则化。 为了减小正则化对合成特征权重(并因此对截距)的影响,必须增加intercept_scaling。相当于人造一个特征出来,该特征恒为 1,其权重为b。

7.class_weight :dict or ‘balanced’,default:None
class_weight参数用于标示分类模型中各种类型的权重,可以不输入,即不考虑权重,或者说所有类型的权重一样。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者我们自己输入各个类型的权重,比如对于0,1的二元模型,我们可以定义class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%。
如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。当class_weight为balanced时,类权重计算方法如下:n_samples / (n_classes * np.bincount(y))

8.random_state:int,RandomState instance or None,optional,default:None

在随机数据混洗时使用的伪随机数生成器的种子。 如果是int,则random_state是随机数生成器使用的种子; 如果是RandomState实例,则random_state是随机数生成器; 如果为None,则随机数生成器是np.random使用的RandomState实例。 在求solver是’sag’或’liblinear’时使用。

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

saga:线性收敛的随机优化算法。

对于小型数据集,‘liblinear’是一个不错的选择,而’sag’和’saga’对于大型的更快。对于多类问题,只有’newton-cg’,‘sag’,'saga’和’lbfgs’处理多项损失;'liblinear’仅限于一项损失。 ‘newton-cg’,'lbfgs’和’sag’只处理L2惩罚,而’liblinear’和’saga’处理L1惩罚。“sag”和“saga”快速收敛仅在具有大致相同比例的要素上得到保证, 可以使用sklearn.preprocessing中的缩放器预处理数据。

10.max_iter:int ,default:100

仅适用于newton-cg,sag和lbfgs求解器。 求解器收敛的最大迭代次数。

11.multi_class:str,{‘ovr’, ‘multinomial’},default:‘ovr’

‘ovr’ :采用 one-vs-rest 策略,‘multinomial’:直接采用多分类逻辑回归策略。

多类选项可以是’ovr’或’multinomial’。 如果选择的选项是’ovr’,那么二进制问题适合每个标签。 另外,最小化损失是整个概率分布中的多项式损失拟合。 不适用于liblinear解算器。

12.verbose:int,default:0

对于liblinear和lbfgs求解器,将verbose设置为任何正数以表示详细程度。用于开启/关闭迭代中间输出的日志。

13.warm_start:bool(True、False),default:False

如果为True,那么使用前一次训练结果继续训练,否则从头开始训练。对于liblinear解算器没用。

14.n_jobs:int,default:1

如果multi_class =‘ovr’,则在对类进行并行化时使用的CPU数量。 无论是否指定’multi_class’,当solver设置为’liblinear’时,都会忽略此参数。 如果给定值-1,则使用所有CPU。

参考博客:
https://blog.csdn.net/qq_42370261/article/details/84852595
https://www.geek-share.com/detail/2732100148.html
https://www.geek-share.com/detail/2694780295.html
https://www.geek-share.com/detail/2679490975.html
https://www.geek-share.com/detail/2714211136.html
https://blog.csdn.net/weixin_41537599/article/details/80585201

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: