• 转载:逻辑回归算法梳理


    学习内容:

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

    2、 逻辑回归的原理

    3、逻辑回归损失函数推导及优化

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

    5、逻辑回归的优缺点

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

    7. sklearn参数


    转自:https://github.com/trembous/homework_summary/blob/master/29-%E9%87%8E%E6%AF%94%E5%A4%A7%E9%9B%84-20190302-20190303_02.ipynb

    逻辑回归和线性回归的区别和联系

     

    直观:逻辑回归就是线性回归的损失函数加个sigmoid函数,两者属于广义线性模型家族。

    1.要解决的问题:

    逻辑回归解决的是分类问题,在空间找出决策平面区分不同类别;由于逻辑回归的输出介入0-1之间的概率值,离群点对决策平面影响不大。

    线性回归解决的是回归问题,拟合数据;不适合用于分类数据,离群点对决策平面影响很大。

    2.前提条件

    线性回归要求变量服从正态分布,自变量和因变量有线性关系,逻辑回归假设数据服从伯努利分布。

    3.模型比较:

    损失函数:

    线性回归$L=frac{1}{2}sum^m_{i=1}(y^i-widehat{y})^2$=$frac{1}{2}sum^m_{i=1}(y^i- x_i  w_i)^2$$h_	heta(x)=	heta^Tx$

    逻辑回归$L=-frac{1}{m}sum^m_{i=1}[y^ilogh_{	heta}(x^{(i)})+(1-y^i)log(1-h_{	heta}(x^{(i)}))]$$h_	heta(x)=frac{1}{1+e^{-	heta^Tx}}$

    说明:m表示样本数量,$h_	heta(x)$表示模型预测值,y表示期望值

    优化方法:都是用梯度下降法或其他方法

    4.因变量

    逻辑回归的输出介入0-1之间的概率值,因变量分类型变量如{1,-1}有限的值,设定阈值,y值大于阈值是一类,y值小于阈值是另外一类。

    线性回归输出介入$(-infty,infty)$,因变量连续。

     

    逻辑回归的原理

     

    构建模型

     

    逻辑回归的目的是把线性回归的结果通过sigmoid函数,映射到$(0,1)$

    sigmoid函数:$g_k=frac{1}{1+e^{-k}}$

    线性回归的决策函数:$k=	heta^Tx$

    逻辑回归的决策函数:$h_	heta(x)=frac{1}{1+e^{-	heta^Tx}}$

    $P(y=1mid x;	heta)=h_	heta(x)$#输入x,模型参数为$	heta$情况下,输出结果为1的概率

    $P(y=0mid x;	heta)=1-h_	heta(x)$#输入x,模型参数为$	heta$情况下,输出结果为0的概率

     

    损失函数

     

    从上式可以得到以下结果:

    $widehat{y}=h_	heta(x)$表示模型预测值

    $y=1$时,$P(ymid x;	heta)=h_	heta(x)$

    $y=0$时,$P(ymid x;	heta)=1-h_	heta(x)$

    规整以下:$P(ymid x;	heta)=(h_	heta(x))^y(1-h_	heta(x))^{1-y}$,这是对但单一个体而言,扩展到整个样本

    似然函数:$L(	heta)=prod^{m}_{i=1}P(y^{i}mid x^{i};	heta)=prod^{m}_{i=1}[(h_	heta(x^{i}))^{y^{i}}(1-h_	heta(x^{i}))^{1-y^{i}}]$

    对数似然函数:$logL(	heta)=logprod^{m}_{i=1}P(y^{i}mid x^{i};	heta)=logprod^{m}_{i=1}[(h_	heta(x^{i}))^{y^{i}}(1-h_	heta(x^{i}))^{1-y^{i}}]$

    说明:这里发现有2m个式子相乘,利用log结果是2m项相加

    $logL(	heta)=sum^{m}_{i=1}[y^{i}log(h_	heta(x^{i}))+(1-y^{i})log(1-h_	heta(x^{i}))]$

    目标是求$max_{	heta} logL$,即求$min_{	heta}-frac{1}{m}logL$

    最终损失函数为$J(	heta)=-frac{1}{m}logL=-frac{1}{m}sum^{m}_{i=1}[y^{i}log(h_	heta(x^{i}))+(1-y^{i})log(1-h_	heta(x^{i}))]$

     

    优化模型

     

    确定一些函数性质:

    sigmoid函数:$g_k=frac{1}{1+e^{-k}}$$(g_k)'=g(k)g(1-k)k'$,

    逻辑回归的决策函数:$h_	heta(x)=frac{1}{1+e^{-	heta^Tx}}=g(	heta^Tx)$

    log函数:$logx=frac{1}{x}$

    使用梯度下降法:$frac{partial J(	heta_i)}{partial 	heta}$

    $=-frac{1}{m}sum^{m}_{i=1}[y^{i}frac{1}{(h_	heta(x^{i}))}frac{partial h_	heta(x^{i})}{partial 	heta_i}-(1-y^{i})frac{1}{1-h_	heta(x^{i})}frac{partial h_	heta(x^{i})}{partial 	heta_i}]$

    $=-frac{1}{m}sum^{m}_{i=1}[y^{i}frac{1}{(h_	heta(x^{i}))}-(1-y^{i})frac{1}{1-h_	heta(x^{i})}]frac{partial h_	heta(x^{i})}{partial 	heta_i}$

    根据上面将$k=	heta^Tx$,快速得出

    $=-frac{1}{m}sum^{m}_{i=1}[y^{i}frac{1}{(g(	heta^Tx_i))}-(1-y^{i})frac{1}{1-g(	heta^Tx_i)})g(	heta^Tx_i)(1-g(	heta^Tx_i)][frac{partial 	heta^Tx_i)}{partial 	heta_i}]$

    $=-frac{1}{m}sum^{m}_{i=1}[y^{i}(1-g(	heta^Tx_i))-(1-y^{i})g(	heta^Tx_i)]frac{partial 	heta^Tx_i)}{partial 	heta_i}$

    $=-frac{1}{m}sum^{m}_{i=1}[y^{i}(1-g(	heta^Tx_i))-(1-y^{i})g(	heta^Tx_i)]x_i$

    $=-frac{1}{m}sum^{m}_{i=1}[y^{i}-g(	heta^Tx_i)]x_i$

    $=frac{1}{m}sum^{m}_{i=1}[g(	heta^Tx_i)-y^{i}]x_i$

    $=frac{1}{m}sum^{m}_{i=1}[h_	heta(x_i)-y^{i}]x_i$

    写成向量形式:$frac{1}{m}X^{T}[h-y]$

    所有样本更新一次:$	heta_i=	heta_i-alpha frac{1}{m}sum^{m}_{i=1}[h_	heta(x_i)-y^{i}]x_i$

    一个样本更新一次:$	heta_i=	heta_i-alpha [h_	heta(x)-y]x$

    对于牛顿法,拟牛顿法都可以将相应的梯度代换成现在求出的梯度即可

     

    逻辑回归的损失函数和优化方法

     

    见第二小节

    关于多元线性回归:

    假设有3类 s,k,l,训练3个模型

    $P(y=smid x;	heta)=h_1(	heta(x))$#输入x,模型h_1情况下,输出结果为s的概率

    $P(y=kmid x;	heta)=h_2(	heta(x))$#输入x,模型h_2情况下,输出结果为k的概率

    $P(y=lmid x;	heta)=h_3(	heta(x))$#输入x,模型h_3情况下,输出结果为l的概率

    最后输入$x_{new}$,三个模型都跑一下,看哪个大,就是哪一类

     

    逻辑回归的正则化和评价指标

     

    正则化亦可参考线性回归,在损失函数后面加惩罚项

    L1正则:$lambdasum^n_{j=1}mid 	heta_jmid$

    L2正则:$lambdasum^n_{i=j}	heta_j^2$

    结合以上:$
hosum^n_{j=1}mid 	heta_jmid+(1-
ho)sum^n_{i=j}	heta_j^2$

    https://www.cnblogs.com/futurehau/p/6109772.html

     

    准确率

     

    分类正确样本占总样本的比例,不适合用于非平衡数据

    $ACC=frac{TP+TN}{TP+TN+FP+FN}$

     

    精确率和召回率

     

    5.png

     

    TP—将正类预测为正类数

    FN—将正类预测为负类数

    FP—将负类预测为正类数

    TN—将负类预测为负类数

    精确率(查准率):$P=frac{TP}{TP+FP}$。已知所有预测为正的样本,其中有多少预测准确。

    召回率(查全率):$R=frac{TP}{TP+FN}$。已知所有实际为正的样本,其中有多少预测出来。

    $F_1$值:精确率和召回率的调和平均,$frac{2}{F_1}=frac{1}{P}+frac{1}{R}$

    $F_1=2frac{PR}{P+R}$,

    $F_eta=(1+eta^2)frac{PR}{eta^2P+R}$,

    $F_2$:召回率的权重高于精确率,$F_{0.5}$:精确率的权重高于召回率。

    Micro-F1:所有类别统一计算,F1公式不变,关键是P,R计算的差异,

    $P=frac{sum^m_{i=1}TP_i}{sum^m_{i=1}TP_i+sum^m_{i=1}FP_i}$$R=frac{sum^m_{i=1}TP_i}{sum^m_{i=1}TP_i+sum^m_{i=1}FN_i}$

    Macro-F1:分别计算各类的F1并计算均值 $P=frac{1}{m}sum^m_{i=1}p_i$,$R=frac{1}{m}sum^m_{i=1}r_i$,m表示类别数目

    P-R曲线:根据不同阈值产生不同P,R画出来的曲线,横坐标为查全率,纵坐标为查准率

    比较性能:取P=R的点,看大小

     

    ROC 和AUC

     

    ROC:以$TPR=frac{TP}{TP+FN}$为横坐标,以$FPR=frac{FP}{FP+TN}$为纵坐标,画出的曲线。

    (0,1):FN = 0, FP = 0, 表示所有样本都正确分类

    (1,0):TN = 0, TP = 0, 表示所有样本都分类错误

    (0,0):FP = 0, TP = 0, 表示所有样本都分类为负

    (1,1):TN = 0, FN = 0, 表示左右样本都分类为正

    显然越靠近右上角,效果越好

    如何绘制?数据(类别,判断为正类的概率)按$P_{正}$从高到底排列,每次选取一个不同的threshold,$p_{正}ge threshold$时为正样本,否则为负样本,得到一组FPR和TPR,即ROC曲线上的一点。训练最极限的状态就是所有的正样本都在负样本前面。

    过程:

    1.起点(0,0),n=0

    2.下一个点以排序后第一个样本的概率值为阈值,计算正类数k,负类数p;n=n+1

    3.前一个点坐标为(x,y),当前类为正,新坐标更新为$(x,y+frac{1}{k})$,否则更新为$(x+frac{1}{p},y)$

    4.如果n=样本数,停止,否则回到2

    AUC:ROC曲线下的面积,$0.5le AUC le1$

    当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变

     

    逻辑回归的优点和缺点

     

    优点:

    计算简单,速度快,适合分布式,在线计算,资源占用小;

    可解释性强,可以清晰查看各个特征的权重;

    模型效果不错,可以作为baseline使用;

    新数据输入,模型调整能力强;

    噪声鲁棒性好;

    缺点:

    适用场景有限,不能解决非线性问题,样本不均衡问题

    准确率不高,无法应用到复杂数据

    不能进行特征选择

     

    数据层面

     

    扩充数据集

     

    收集更多缺少的数据,使用GAN扩充数据

     

    重采样

     

    过采样:采样的个数大于该类样本的个数

    1.SMOTE构造新的小类样本。基于距离计算两个小类的相似性,选择其中一个作基础样本,在邻近样本中随机选取一定数量的样本,对基础样本的某一属性加噪声。Borderline-SMOTE:只为那些周围大部分是大众样本的小众样本生成新样本。

    2.聚类后过采样:大类样本聚类,训练L个分类器,每个分类器使用大类中的一个簇与所有的小类样本进行训练得到。投票给出结果

    欠采样:移除那些数量多的类别的一部分数据

    1.boosting增量模型:递归地训练三个弱学习器,然后将这三个弱学习器结合形成一个强的学习器让L1输出始终为true,L2数据是50%L1预测正确和50%预测错误(这就是小类样本)的,因此L2样本均衡。L3的数据是L2判断为小类的样本.最终投票在L2和L3结果都是小类下,输出类别才是小类

    2.bagging模型融合:有放回地取出富有类样本,再和稀有类样本组合成新的训练集。训练N个模型,投票或求均值

     

    分类器

     

    1.损失函数增加小类样本的权值,降低大类样本的权值

    2.特征选择:选择具有显著区分能力的特征进行训练

    3.One-class分类:只需检测某一特定类别,把小类样本作为异常点

    4.minibatch过程每个batch内保证类别平衡,均匀数据训练,不均匀数据在最后一层finetune

     

    指标

     

    P,R,F1,ROC曲线,使用交叉验证

     

    小结

     

    在正负样本都很少的时候,采取SMOTE构造新的小类样本;

    相差悬殊采用One-class分类,增量,融合

     

    sklearn 参数详解

     

    class sklearn.linear_model.LogisticRegression

     

    class 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 ='warn',max_iter = 100,multi_class ='warn ',verbose = 0,warm_start = False,n_jobs =None)

    它可以处理密集和稀疏输入。使用包含64位浮点数的C有序数组或CSR矩阵以获得最佳性能;

    penalty:正则项,默认'l2'

    dual:当n_samples> n_features时,dual = False;默认False

    tol:计算精度,回归停止的基准,默认1e-4

    C:正浮点数,越小表示正则化强度越高默认值1.0

    fit_intercept:决策函数是否包含截距,默认True

    intercept_scaling:默认值为1 仅求解器为liblinear且self.fit_intercept设置为True时有用。

    class_weight:dict或'balanced',默认无,所有类别权重相同。

    random_state:随机数种子

    求解器:{'newton-cg','lbfgs','liblinear','sag','saga'},默认:'liblinear'。

    max_iter:最大迭代次数。默认100

    multi_class:{'ovr','multinomial','auto'},默认ovr。ovr表示二进制问题适合每个标签。multinomial使用交叉熵损失。solver='liblinear'时,'multinomial'不可用。如果数据是二进制的,或者如果solver ='liblinear','auto'选择'ovr',否则选择'multinomial'。

    verbose:默认0;对于liblinear和lbfgs求解器,将详细设置为任何正数以表示详细程度。

    warm_start默认False.热启动,重用上次参数进行初始化

    n_jobs:int或None,可选(默认=无),并行任务使用的cpu数量

     

    decision_function(X)#预测样本的置信分数

     

    参数:x形如(样本数,特征数)的矩阵

    返回值:每个(样本,类别)组合的置信分数。二分类下,self.classes_[1]> 0,预测结果则为该类。

     

    densify()#将系数矩阵转换为密集阵列

     

    coef转换为numpy.ndarray,这是训练使用的coef的默认格式,只有已经稀疏化的模型才能调用此方法

     

    fit(X, y, sample_weight=None)

     

    用于训练模型,返回值:实例

    X:形如[样本数,特征数]的训练数据

    y:形如[样本数,标签数]的训练标签

    样本权重:每个样本有独立的权重,默认为1

     

    get_param(deep=True)

     

    获取当前模型及子项目的参数

    deep布尔值:True,返回参数

    返回值:参数名到对应值的映射字符串

     

    predict(X)

     

    X:形如[样本数,特征数]的数据

    返回预测类别

     

    predict_log_proba(X)

     

    预测概率值取log

    X:形如[样本数,特征数]的数据

    返回值T:根据标签排序,返回所有类别预测概率值的log值,形如[样本数,类别数]

     

    predict_proba(X)

     

    预测概率值

    对于多分类问题,使用softmax方程计算每一类别的预测概率值;使用one-vs-rest方法时,使用逻辑方程将每个类别的概率值都设为大于0,再集合所有类别归一化。 X:形如[样本数,特征数]的数据

    返回值T:根据标签排序,返回所有类别预测概率值,形如[样本数,类别数]

     

    score(X, y, sample_weight=None)

     

    对于多标签分类问题,子集准确率使用哈希尺度,要求每个样本的各个类别都能正确预测

    X:形如[样本数,特征数]的测试数据

    y:形如[样本数,标签数]的数据的真实值

    样本权重:每个样本有独立的权重

    返回平均准确率

     

    set_params(** params)

     

    设置参数

    返回实例

     

    sparsify()

     

    将系数矩阵转换为稀疏格式

    将coef成员转换为scipy.sparse矩阵。对于L1正则化模型,它可以比通常的numpy.ndarray表示更高的内存和存储效率。intercept成员不会被转换。

    对于非稀疏模型,这实际上可能会增加内存使用量。零元素数量必须超过50%才能提供显著的效益

    调用此方法后,要进一步调用densify后,partial_fit才生效

    本次内容优秀的人员比较多,可以看出大家的努力,一下为优秀内容链接:
    1:https://blog.csdn.net/absent1353/article/details/88090222
    2:https://github.com/JRXGUGI/PrimaryAlgorithm_DataWhale_201903/blob/master/day2%20%E9%80%BB%E8%BE%91%E5%9B%9E%E5%BD%92%E7%AE%97%E6%B3%95%E6%A2%B3%E7%90%86.md
    3:https://blog.csdn.net/u013327188/article/details/88083313
    4:https://blog.csdn.net/diaojinhui/article/details/88072331
    5:https://blog.csdn.net/Xiaodata/article/details/88088860
    6:https://blog.csdn.net/weixin_43975572/article/details/88092508
    7:https://blog.csdn.net/hsk6543210/article/details/88084836

     

  • 相关阅读:
    百度富文本编辑器的上传图片的路径问题
    laravel初次学习总结及一些细节
    macOS apache配置及开启虚拟服务器的开启,apache开启重写模式
    类似于qq空间类型的评论和回复
    向php提交数据及json
    mac 初次配置apache,及mac下安装mysql
    C#连接mysql数据库插入数据后获取自增长主键ID值
    PHP 真正多线程的使用
    C# 连接mysql数据库
    MySql状态查看方法 MySql如何查看连接数和状态?
  • 原文地址:https://www.cnblogs.com/burton/p/10469836.html
Copyright © 2020-2023  润新知