精华内容
下载资源
问答
  • 结合实际情况,可以将Logistic回归分析分为3类,分别是二元Logistic回归分析、多元有序Logistic回归分析和多元无序Logistic回归分析,如下图。Logistic回归分析用于研究X对Y的影响,并且对X的数据类型没有要求,X...

    633f7394e8dcf2cd5518b3dcc805a730.png

    在研究X对于Y的影响时,如果Y为定量数据,那么使用多元线性回归分析(SPSSAU通用方法里面的线性回归);如果Y为定类数据,那么使用Logistic回归分析。

    结合实际情况,可以将Logistic回归分析分为3类,分别是二元Logistic回归分析、多元有序Logistic回归分析和多元无序Logistic回归分析,如下图。

    214bfceeb03053a8a7ae147d2c1005d9.png

    Logistic回归分析用于研究X对Y的影响,并且对X的数据类型没有要求,X可以为定类数据,也可以为定量数据,但要求Y必须为定类数据,并且根据Y的选项数,使用相应的数据分析方法。

    本次内容将针对二元logistic(logit)回归进行说明,后续两篇文章将分别讲解有序logistic(logit)和多分类logistic(logit)回归。

    1、二元logistic分析思路说明

    在进行二元Logistic回归分析时,通常会涉及3个步骤,分别是数据处理、卡方分析和影响关系研究,如下图。

    d71835df14d0c897a637a3589c999584.png

    1.1 第一步为数据处理

    例如,在研究相关因素对样本将来是否愿意购买理财产品的影响情况时,性别,专业等均为影响因素,而且明显的,性别和专业属于定类数据,因此需要进行虚拟哑变量设置,可使用【数据处理->生成变量】完成。

    除此之外,二元logistic回归要求因变量只能为2项,而且数字一定是0和1,数字1表示YES,愿意,购买,患病等,数字0表示no,不愿意,不购买,不患病等。如果不是这样,那么就需要针对因变量Y进行数据编码,使用【数据处理->数据编码】即可完成。

    1.2 第二步为卡方分析或方差分析

    此步不是必需的步骤,通过此步可以试探性了解每个影响因素X与Y之间的影响关系情况,研究影响关系前,首先需要自变量X与Y之间有着差异关系,才可能进一步有着影响关系,也或者说差异关系是一种基础性关系,影响关系是更进一步的深层次关系。所以在进行二元logistic回归分析前,可先对X做差异分析,筛选出与Y有着差异性的X。

    如果X是定类数据,那么就使用卡方分析去分析差异;如果说X是定量数据,那么可使用方差分析去研究X和Y的差异性。

    分析完成X与Y的差异关系之后,筛选出有差异的X,然后再放入模型中,进行二元logistic回归;这样做的目的有两个,一是简化模型,越简单的模型越容易拟合且效果越好;二是做到心里有数,提前了解到数据之间的大致关系情况。

    1.3 第三步为影响关系分析,即二元Logistic回归分析

    在上一步确认了可能的影响因素之后,此步骤直接对题进行二元Logistic回归分析。二元Logistic回归分析时,首先需要看某个题是否呈现出显著性(如果P值小于0.05,则说明呈现出0.05水平的显著性;如果P值小于0.01,则说明呈现出0.01水平的显著性),如果呈现出显著性,那么说明该题对Y有影响关系。具体是正向影响还是负向影响需要结合对应的回归系数值进行说明,如果回归系数值大于0,则说明是正向影响;反之则说明是负向影响。

    除此之外,二元Logistic回归分析会涉及一个术语——对数比(SPSSAU中称其为OR值)。对数比是一个倍数概念指标,该值等于回归系数的指数次方,也称exp(b)值。例如,研究相关因素对样本‘是否购买理财产品’的影响,性别因素呈现出显著性,并且性别以女性为对照项,其对数比(OR值)为1.34,这说明男性样本购买理财产品的可能性是女性样本的1.34倍。

    二元Logistic回归分析模型的拟合情况或模型效果的判断会涉及3个指标,分别是Hosmer和Lemeshow检验、R2值和模型预测准确率表格。Hosmer和Lemeshow检验用于检验事实数据情况与模型拟合结果是否保持一致,如果在进行Hosmer和Lemeshow检验时P值大于0.05,那么说明事实数据情况与模型拟合结果保持一致,即说明模型拟合情况良好。

    R2用于表示模型拟合程度,此值与多元线性回归分析的R2值意义基本一致,此值的取值范围为0~1,值越大意味着相关因素对Y的解释力度越高。SPSSAU提供3个R方值指标,分别是McFadden R 方、Cox & Snell R 方和Nagelkerke R 方。

    除此之外,SPSSAU还会输出模型预测准确率表格,用于分析模型的预测水平情况。比如有多大比例将本身为愿意购买理财产品的样本误判断为不愿意购买理财产品的样本。

    2、如何使用SPSSAU进行二元logistic操作

    在进行二元logistic回归分析时,共分为三个步骤,第1步是数据处理。第二步是进行卡方或者方差分析试控X对于Y的差异,找出有差异关系的X,用于进一步的二元logistic回归分析。

    2.1 数据处理

    如果X是定类数据,比如性别或专业。那么就需要首先对它们做虚拟哑变量处理,使用SPSSAU【数据处理】--【生成变量】。操作如下图:

    990cc99cda21064948d3607840deff11.png

    因变量Y只能包括数字0和1,如果因变量的原始数据不是这样,那么就需要数据编码,设置成0和1,使用SPSSAU数据处理->数据编码功能,操作如下图:

    4b6238a54df73a6b85e662c6f32d68bf.png

    2.2 卡方分析或方差分析

    本例子中想研究性别,专业,年龄,月生活费共4项对于‘是否愿意理财’的影响。性别,专业这两项为定类数据,所以可使用卡方分析它们分别与‘是否愿意理财’的差异关系。而年龄和月生活费可看成定量数据,可使用方差分析(或非参数检验)分析它们分别与‘是否愿意理财’的差异关系情况。

    由于例子里面仅4个X,本身就较少,因此模型本身并不复杂,因此直接忽略此步骤即可,直接进行二元logistic回归分析。

    2.3 二元logistic回归分析

    SPSSAU进行二元logistic回归分两步,分别是在进阶方法里面找到二元logit,第二是拖拽分析项到右我们就是右侧框后开始分析,如下所示:

    899a576d8304de35e03ba79ed69cfa9f.png

    cddc7d7578ef8dba2db5b1c0747f9497.png

    性别和专业均为定类数据,所以进行了虚拟哑变量设置。

    而且性别分为男和女,以女作为参照项,因此框中仅放入‘男’即可;

    专业分为理工类,文科类,艺术类和,体育类;以体育类作为参照项,因此框中会少放体育类,放入另外3项即理工类,文科类和艺术类即可。

    虚拟哑变量在进行影响关系研究时,一定需要有1个参照项,至于具体是哪一项,由研究者自行决定即可,无固定要求,一般是第1个或者最后1个,或者研究者希望设置作为参考项的。

    完成后,SPSSAU会得到一系列的表格和智能分析,包括模型基本汇总表格,模型似然比检验表格,模型参数拟合表格,模型预测准确率表格,Hosmer-Lemeshow拟合度检验等。如下:

    dd67d9a5ab53dae14d48dd4cd055d3bb.png

    二元logit回归分析基本汇总

    5d45a5f4dd910018a28304d2321dd4ff.png

    二元logit回归模型似然比检验结果

    b037e0909dd33c15daf1b76dc52ac20b.png

    二元logit回归结果分析

    d72d9bdb90ae83e59b997e1648b36848.png

    二元logit回归预测准确率表格

    e22b8fc824ea3ed8a8a3f3bdbb9850c9.png

    Hosmer-Lemeshow拟合度检验 

    3、二元logistic相关问题

    在使用SPSSSAU进行二元logistic回归时,可能会出现一些问题,比如提示奇异矩阵,质量异常,Y值只能为0或1等,接下来一一说明。

    6ebf1701cff86e618eeb557a0f324b87.png

    第1点:出现奇异矩阵或质量异常

    如果做二元logistic提示奇异矩阵,通常有两个原因,一是虚拟哑变量设置后,本应该少放1项作为参考项但是并没有,而是把所有的哑变量项都放入框中,这会导致绝对的共线性问题即会出现奇异矩阵矩阵。二是X之间有着太强的共线性(可使用通用方法的线性回归查看下VIF值),此时也可能导致模型无法拟合等。先找出原因,然后把有问题的项移出模型中即可。

    同时,如果自变量X的分布极其不均匀,SPSSAU建议可先对类别进行组合,可使用数据处理里面的数据编码完成。

    第2点:Y值只能为0或1

    二元logistic回归研究X对Y的影响,Y为两个类别,比如是否愿意,是否喜欢,是否患病等,数字一定有且仅为2个,分别是0和1。如果不是这样就会出现此类提示,可使用SPSSAU频数分析进行检查,并且使用数据处理->数据编码功能进行处理成0和1。

    第3点:OR值的意义

    OR值=exp(b)值,即回归系数的指数次方,该值在医学研究里面使用较多,实际意义是X增加1个单位时,Y的增加幅度。如果仅仅是研究影响关系,该值意义较小。

    第4点: wald值或z值

    z 值=回归系数/标准误,该值为中间过程值无意义,只需要看p 值即可。有的软件会提供wald值(但不提供z 值,该值也无实际意义),wald值= z 值的平方。

    第5点: McFadden R 方、Cox & Snell R 方和Nagelkerke R 方相关问题?

    Logit回归时会提供此3个R 方值(分别是McFadden R 方、Cox & Snell R 方和Nagelkerke R 方),此3个R 方均为伪R 方值,其值越大越好,但其无法非常有效的表达模型的拟合程度,意义相对交小,而且多数情况此3个指标值均会特别小,研究人员不用过分关注于此3个指标值。一般报告其中任意一个R方值指标即可。

    展开全文
  • Python3:《机器学习实战》之Logistic回归(2)最佳回归系数确定 转载请注明作者和出处:http://blog.csdn.net/u011475210 代码地址:https://github.com/WordZzzz/ML/tree/master/Ch05 操作系统:WINDOWS 10 软件...

    Python3:《机器学习实战》之Logistic回归(2)最佳回归系数确定



    前言:

      Sigmoid函数的输入记为z,有下面公式得出:

    z=w0x0+w1x1+w2x2++wnxn

      如果采用向量的写法,上述公式可以写成

    z=wTx
    ,它表示将这两个数值向量对应元素相乘然后全部加起来即得到z值。其中的向量x是分类器的输入数据,向量w也就是我们要找到的最佳参数系数,从而使得分类器尽可能的精确。为了寻找最佳参数,我们需要用到最优化理论的一些知识。

      下面首先介绍梯度上升这一优化算法,我们将学习到如何使用该方法求得数据集的最佳参数。接下来,展示如何绘制梯度上升法产生的决策变截图,该图能将梯度上升法的分类效果可视化地呈现出来。最后,我们将学习随机梯度上升算法,以及如何对其进行修改以获得更好的效果。

    梯度上升算法

      梯度上升算法基于的思想是:要找到某函数的最大值,最好的办法就是沿着该函数的梯度方向探寻。如果梯度记为,则函数f(x,y)的梯度由下式表示:

    f(x,y)=f(x,y)xf(x,y)y

      这是机器学习中最容易造成混淆的一个地方,但在数学上并不难,需要做的只是牢记这些符号的含义。这个梯度意味着要沿x的方向移动f(x,y)x,沿y的方向移动f(x,y)y。其中,函数f(x,y)必须要在待计算的点上有定义并且可微。一个具体的函数例子见下图。

    SouthEast

      图中的梯度上升算法沿梯度方向移动了一步。乐意看到,梯度算子总是指向函数值增长最快的方向。这里说到移动方向,而未提及移动量的大小。该量值称为步长,记作α。用向量来表示的话,梯度上升算法的迭代公式如下:

    w:=w+αwf(w)

      该公式将一直被迭代执行,直到达到某个停止条件为止,比如设定的迭代次数或者达到某个允许的误差范围。

      如果我没记错的话,Andrew在course的machine learning第三周的课程中使用的是梯度下降算法,它的公式为:

    w:=wαwf(w)

      我们可以看到,两个算法其实是一样的,只是公式中的加减法不同而已。梯度上升算法用来求函数的最大值,而梯度下降算法用来求函数的最小值。

    训练算法:使用梯度上升找到最佳参数

      基于上面的内容,我们来看一个Logistic回归分类器的应用例子,从下图可以看到我们采集的数据集。

    SouthEast

      上图中有100个样本点,每个点包含两个数值型特征:X1和X2。在此数据集上,我们将通过使用梯度上升法找到最佳回归系数,也就是拟合出Logistic回归模型的最佳参数。

      梯度上升法的伪代码如下:

    每个回归系数初始化为1
    重复R次:
        计算整个数据集的梯度
        使用alpha 下gradient 更新回归系数的向量
    返回回归系数

      下面的代码是梯度上升算法的具体实现。

    # -*- coding: UTF-8 -*- #
    '''
    Created on Sep 15, 2017
    Logistic Regression Working Module
    @author: WordZzzz
    '''
    from numpy import *
    
    def loadDataSet():
        """
        Function:   加载数据集
    
        Input:      testSet.txt:数据集
    
        Output: dataMat:数据矩阵100*3
                    labelMat:类别标签矩阵1*100
        """ 
        #初始化数据列表和标签列表
        dataMat = []; labelMat = []
        #打开数据集
        fr = open('testSet.txt')
        #遍历每一行
        for line in fr.readlines():
            #删除空白符之后进行切分
            lineArr = line.strip().split()
            #数据加入数据列表
            dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
            #标签加入数据列表
            labelMat.append(int(lineArr[2]))
        #返回数据列表和标签列表
        return dataMat, labelMat
    
    def sigmoid(inX):
        """
        Function:   sigmoid函数
    
        Input:      inX:矩阵运算结果100*1
    
        Output: 1.0/(1+exp(-inX)):计算结果
        """ 
        #返回计算结果
        return 1.0/(1+exp(-inX))
    
    def gradAscent(dataMatIn, classLabels):
        """
        Function:   logistic回归梯度上升函数
    
        Input:      dataMatIn:数据列表100*3
                    classLabels:标签列表1*100
    
        Output: weights:权重参数矩阵
        """ 
        #转换为numpy矩阵dataMatrix:100*3
        dataMatrix = mat(dataMatIn)
        #转换为numpy矩阵并转置为labelMat:100*1
        labelMat = mat(classLabels).transpose()
        #获得矩阵行列数
        m,n = shape(dataMatrix)
        #初始化移动步长
        alpha = 0.001
        #初始化地带次数
        maxCycles = 500
        #初始化权重参数矩阵,初始值都为1
        weights = ones((n,1))
        #开始迭代计算参数
        for k in range(maxCycles):
            #100*3 * 3*1 => 100*1
            h = sigmoid(dataMatrix * weights)
            #计算误差100*1
            error = (labelMat - h)
            #更新参数值
            weights = weights + alpha * dataMatrix.transpose() * error
        #返回权重参数矩阵
        return weights

      需要强调的是,gradAscent函数中的for循环部分中的运算是矩阵运算。变量h不是一个数而是一个列向量,列向量的元素个数等于样本个数,这里是100.对应的运算dataMatrix * weights代表不止一次乘积计算,实际上该运算包含了300次的乘积。

      接下来我们看看实际效果,打开终端,输入命令行:

    >>> import logRegres
    >>> dataArr, labelMat = logRegres.loadDataSet()
    >>> logRegres.gradAscent(dataArr, labelMat)
    matrix([[ 4.12414349],
            [ 0.48007329],
            [-0.6168482 ]])

    分析数据:画出决策边界

      分析数据,当然离不开可视化模块matplotlib,代码实现如下:

    def plotBestFit(weights):
        """
        Function:   画出数据集和最佳拟合直线
    
        Input:      weights:权重参数矩阵
    
        Output: 包含数据集和拟合直线的图像
        """ 
        #加载matplotlib中的pyplot模块
        import matplotlib.pyplot as plt
        #导入数据
        dataMat, labelMat = loadDataSet()
        #创建数组
        dataArr =array(dataMat)
        #获取数组行数
        n = shape(dataArr)[0]
        #初始化坐标
        xcord1 = []; ycord1 = []
        xcord2 = []; ycord2 = []
        #遍历每一行数据
        for i in range(n):
            #如果对应的类别标签对应数值1,就添加到xcord1,ycord1中
            if int(labelMat[i]) == 1:
                xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])
            #如果对应的类别标签对应数值0,就添加到xcord2,ycord2中
            else:
                xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])
        #创建空图
        fig = plt.figure()
        #添加subplot,三种数据都画在一张图上
        ax = fig.add_subplot(111)
        #1类用红色标识,marker='s'形状为正方形
        ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
        #0类用绿色标识,弄认marker='o'为圆形
        ax.scatter(xcord2, ycord2, s=30, c='green')
        #设置x取值,arange支持浮点型
        x = arange(-3.0, 3.0, 0.1)
        #配计算y的值
        y = (-weights[0]-weights[1]*x)/weights[2]
        #画拟合直线
        ax.plot(x, y)
        #贴坐标表头
        plt.xlabel('X1'); plt.ylabel('X2')
        #显示结果
        plt.show()

      打开终端,输入命令行进行测试:

    >>> from imp import reload
    >>> reload(logRegres)
    <module 'logRegres' from 'logRegres.py'>
    >>> weights = logRegres.gradAscent(dataArr, labelMat)
    >>> logRegres.plotBestFit(weights.getA())

    SouthEast

      这个分类效果相当不错,从图上看之分错了两到四个点。但是,尽管例子简单并且数据集很小,这个方法却很需要大量的计算(300次乘积)。下面我们将对该算法进行改进,从而使它可以用到真实数据上。

    训练算法:随机梯度上升

      梯度上升算法在每次更新回归系数时都需要遍历整个数据集,计算复杂度太高了。一种改进方法就是一次仅用一个样本点来更新回归系数,该方法称为随机梯度上升算法。由于可以在新样本到来时对分类器进行增量式更新,因而随机梯度上升算法是一个在线学习方法。与“在线学习”相对应的,一次处理所有数据被称为是“批处理”。

      随机梯度上升算法伪代码如下:

    所有回归系数初始化为1
    对数据集中每个样本
        计算该样本的梯度
        使用alpha x gradient 更新回归系数值
    返回回归系数值

      代码实现如下:

    def stocGradAscent0(dataMatrix, classLabels):
        """
        Function:   随机梯度上升算法
    
        Input:      dataMatIn:数据列表100*3
                    classLabels:标签列表1*100
    
        Output: weights:权重参数矩阵
        """ 
        #获取数据列表大小
        m,n = shape(dataMatrix)
        #步长设置为0.01
        alpha = 0.01
        #初始化权重参数矩阵,初始值都为1
        weights = ones(n)
        #遍历每一行数据
        for i in range(m):
            #1*3 * 3*1
            h = sigmoid(sum(dataMatrix[i]*weights))
            #计算误差
            error = classLabels[i] - h
            #更新权重值
            weights = weights + alpha * error * dataMatrix[i]
        #返回权重参数矩阵
        return weights

      可以看到,随机梯度上升算法与梯度上升算法在代码上很相似,但也有一些区别:第一,后者的变量h和误差error都是向量,而前者则全是数值;第二,前者没有矩阵的转换过程,所有变量的数据类型都是Numpy数组。

    >>> from numpy import *
    >>> reload(logRegres)
    <module 'logRegres' from 'logRegres.py'>
    >>> dataArr, labelMat = logRegres.loadDataSet()
    >>> weights=logRegres.stocGradAscent0(array(dataArr), labelMat)
    >>> logRegres.plotBestFit(weights)

      执行完毕之后,效果如下图所示,该图与上一张图有一些相似之处。可以看到,拟合出来的直线比上次差了点,但是你要知道,这次的随机梯度上升算法,我们只是在整个数据集上迭代了一次而已(算成100次也是和500次差很多)。

    SouthEast

      一个判断优化算法优劣的可靠算法是看它是否收敛,也就是说参数是否达到了稳定值。随机梯度上升算法迭代200次,三个回归系数的变化如下图所示。

    SouthEast

      从上图中我们可以看到,X2迭代50次左右就稳定了,但是其他两个则需要过多次的迭代。同时我们发现在大的波动停止之后,还会有一些小的周期性波动,产生这种现象的原因是因为存在一些不能正确分类的样本点(数据集并非线性可分),在每次迭代时会引发系数的剧烈改变。我们期望算法能避免来回波动,并且收敛也要足够快。

    改进的随机梯度上升算法

      先上代码:

    def stocGradAscent1(dataMatrix, classLabels, numIter=150):
        """
        Function:   改进的随机梯度上升算法
    
        Input:      dataMatIn:数据列表100*3
                    classLabels:标签列表1*100
                    numIter:迭代次数
    
        Output: weights:权重参数矩阵
        """ 
        #获取数据列表大小
        m, n = shape(dataMatrix)
        #初始化权重参数矩阵,初始值都为1
        weights = ones(n)
        #开始迭代,迭代次数为numIter
        for j in range(numIter):
            #初始化index列表,这里要注意将range输出转换成list
            dataIndex = list(range(m))
            #遍历每一行数据,这里要注意将range输出转换成list
            for i in list(range(m)):
                #更新alpha值,缓解数据高频波动
                alpha = 4/(1.0+j+i)+0.0001
                #随机生成序列号,从而减少随机性的波动
                randIndex = int(random.uniform(0, len(dataIndex)))
                #序列号对应的元素与权重矩阵相乘,求和后再求sigmoid
                h = sigmoid(sum(dataMatrix[randIndex]*weights))
                #求误差,和之前一样的操作
                error = classLabels[randIndex] - h
                #更新权重矩阵
                weights = weights + alpha * error * dataMatrix[randIndex]
                #删除这次计算的数据
                del(dataIndex[randIndex])
        #返回权重参数矩阵
        return weights

      改进:

    • 一方面,alpha在每次迭代的时候都会调整,这会缓解上一张图中的数据高频波动。另外,虽然alpha会随着迭代次数不断减小,但永远不会减小到0,这是因为alpha更新公式中存在一个常数项,必须这样做的原因是为了保证在多次迭代之后新数据仍然具有一定得影响。如果要处理的问题是动态变化的,那么可以适当加大上述常数项,来确保新的值获得更大的回归系数。另一点值得注意的是,在降低alpha的函数中,alpha每次减少i/(j+i)时,alpha就不是严格下降的。便面参数的严格下降也常见于模拟退火算法等其他优化算法中。
    • 另一方面,通过随机选取样本来更新回归系数,可以减少周期性的波动。

      同样的,下图反映了stocGradAscent1函数中,每次迭代时各个回归系数的变化情况。

    SouthEast

      我们可以看到,除了周期性波动的减少,上图的水平轴也少了很多(只迭代了40次),这是因为该函数可以收敛的更快。

    >>> reload(logRegres)
    <module 'logRegres' from 'logRegres.py'>
    >>> dataArr, labelMat = logRegres.loadDataSet()
    >>> weights=logRegres.stocGradAscent1(array(dataArr), labelMat)
    >>> logRegres.plotBestFit(weights)

      分类效果如图所示:

    SouthEast

      迄今为止我们分析了回归系数的变化情况,但还没有达到本章的最终目标,即完成具体的分类任务。下一届将使用随机梯度上升算法来解决病马的生死预测问题。

    系列教程持续发布中,欢迎订阅、关注、收藏、评论、点赞哦~~( ̄▽ ̄~)~

    完的汪(∪。∪)。。。zzz

    展开全文
  • Logistic回归虽然名字叫”回归”,但却是一种分类学习方法。使用场景大概有两个:第一用来预测,第二寻找因变量的影响因素。一 从线性回归到Logistic回归线性回归和Logistic回归都是广义线性模型的特例。假设有一个...

    Logistic回归虽然名字叫”回归”,但却是一种分类学习方法。使用场景大概有两个:第一用来预测,第二寻找因变量的影响因素。

    一 从线性回归到Logistic回归

    线性回归和Logistic回归都是广义线性模型的特例。

    假设有一个因变量y和一组自变量x1, x2,

    x3, ... ,

    xn,其中y为连续变量,我们可以拟合一个线性方程:

    y =β0+β1*x1+β2*x2+β3*x3+...+βn*xn

    并通过最小二乘法估计各个β系数的值。

    如果y为二分类变量,只能取值0或1,那么线性回归方程就会遇到困难:方程右侧是一个连续的值,取值为负无穷到正无穷,而左侧只能取值[0,1],无法对应。为了继续使用线性回归的思想,统计学家想到了一个变换方法,就是将方程右边的取值变换为[0,1]。最后选中了Logistic函数:

    y = 1 / (1+e-x)

    这是一个S型函数,值域为(0,1),能将任何数值映射到(0,1),且具有无限阶可导等优良数学性质。

    我们将线性回归方程改写为:

    y = 1 / (1+e-z),

    其中,z

    =β0+β1*x1+β2*x2+β3*x3+...+βn*xn

    此时方程两边的取值都在0和1之间。

    进一步数学变换,可以写为:

    Ln(y/(1-y)) =β0+β1*x1+β2*x2+β3*x3+...+βn*xn

    Ln(y/(1-y))称为Logit变换。我们再将y视为y取值为1的概率p(y=1),因此,1-y就是y取值为0的概率p(y=0),所以上式改写为:

    p(y=1) = ez/(1+ez),

    p(y=0) = 1/(1+ez),

    其中,z

    =β0+β1*x1+β2*x2+β3*x3+...+βn*xn.

    接下来就可以使用”最大似然法”估计出各个系数β。

    二 odds与OR复习

    odds:称为几率、比值、比数,是指某事件发生的可能性(概率)与不发生的可能性(概率)之比。用p表示事件发生的概率,则:odds

    = p/(1-p)。

    OR:比值比,为实验组的事件发生几率(odds1)/对照组的事件发生几率(odds2)。

    三 Logistic回归结果的解读

    我们用一个例子来说明,这个例子中包含200名学生数据,包括1个自变量和4个自变量:

    因变量: hon,表示学生是否在荣誉班(honors

    class),1表示是,0表示否;

    自变量:

    female:性别,分类变量,1=女,0=男

    read:阅读成绩,为连续变量

    write:写作成绩,为连续变量

    math:数学成绩,为连续变量

    1、不包含任何变量的Logistic回归

    首先拟合一个不包含任何变量的Logistic回归,

    模型为ln(p/(1-p)

    =β0

    回归结果如下(结果经过编辑):

    hon

    系数β

    标准误

    P

    截距

    -1.12546

    0.164

    0.000

    这里的系数β就是模型中的β0=

    -1.12546,

    我们用p表示学生在荣誉班的概率,所以有ln(p/(1-p)

    =β0=

    -1.12546,

    解方程得:p = 0.245。

    odds = p/1-p = 0.3245

    这里的p是什么意思呢?p就是所有数据中hon=1的概率。

    我们来统计一下整个hon的数据:

    hon

    例数

    百分比

    0

    151

    75.5%

    1

    49

    24.5%

    hon取值为1的概率p为49/(151+49)

    = 24.5% = 0.245,我们可以手动计算出ln(p/(1-p) =

    -1.12546,等于系数β0。可以得出关系:

    β0=ln(odds)。

    2、包含一个二分类因变量的模型

    拟合一个包含二分类因变量female的Logistic回归,

    模型为ln(p/(1-p)

    =β0+β1*female.

    回归结果如下(结果经过编辑):

    hon

    系数β

    标准误

    P

    female

    0.593

    .3414294

    0.083

    截距

    -1.47

    .2689555

    0.000

    在解读这个结果之前,先看一下hon和female的交叉表:

    hon

    female

    Total

    Male

    Female

    0

    74

    77

    151

    1

    17

    32

    49

    Total

    91

    109

    根据这个交叉表,对于男性(Male),其处在荣誉班级的概率为17/91,处在非荣誉班级的概率为74/91,所以其处在荣誉班级的几率odds1=(17/91)/(74/91)

    = 17/74 = 0.23;相应的,女性处于荣誉班级的几率odds2 =

    (32/109)/(77/109)=32/77 = 0.42。女性对男性的几率之比OR =

    odds2/odds1 = 0.42/0.23 =

    1.809。我们可以说,女性比男性在荣誉班的几率高80.9%。

    回到Logistic回归结果。截距的系数-1.47是男性odds的对数(因为男性用female=0表示,是对照组),ln(0.23)

    =

    -1.47。变量female的系数为0.593,是女性对男性的OR值的对数,ln(1.809)

    = 0.593。所以我们可以得出关系: OR =

    exp(β),或者β=

    ln(OR)(exp(x)函数为指数函数,代表e的x次方)。

    3、包含一个连续变量的模型

    拟合一个包含连续变量math的Logistic回归,

    模型为ln(p/(1-p)

    =β0+β1*math.

    回归结果如下(结果经过编辑):

    hon

    系数β

    标准误

    P

    math

    .1563404

    .0256095

    0.000

    截距

    -9.793942

    1.481745

    0.000

    这里截距系数的含义是在荣誉班中math成绩为0的odds的对数。我们计算出odds

    = exp(-9.793942) =

    .00005579,是非常小的。因为在我们的数据中,没有math成绩为0的学生,所以这是一个外推出来的假想值。

    怎么解释math的系数呢?根据拟合的模型,有:

    ln(p/(1-p)) = - 9.793942 +

    .1563404*math

    我们先假设math=54,有:

    ln(p/(1-p))(math=54) = - 9.793942 + .1563404 *54

    然后我们把math提高提高一个单位,令math=55,有:

    ln(p/(1-p))(math=55) = - 9.793942 + .1563404 *55

    两者之差:

    ln(p/(1-p))(math=55) - ln(p/1-p))(math = 54) =

    0.1563404.

    正好是变量math的系数。

    由此我们可以说,math每提高1个单位,odds(即p/(1-p),也即处于荣誉班的几率)的对数增加0.1563404。

    那么odds增加多少呢?根据对数公式:

    ln(p/(1-p))(math=55) - ln(p/1-p))(math = 54) =

    ln((p/(1-p)(math=55)/ (p/(1-p)(math=54))) = ln(odds(math=55)/

    odds(math=54)) = 0.1563404.

    所以:

    odds(math=55)/ odds(math=54) =

    exp(0.1563404) = 1.169.

    因此我们可以说,math每升高一个单位,odds增加16.9%。且与math的所处的绝对值无关。

    聪明的读者肯定发现,odds(math=55)/

    odds(math=54)不就是OR嘛!

    4、包含多个变量的模型(无交互效应)

    拟合一个包含female、math、read的Logistic回归,

    模型为ln(p/(1-p) =

    β0+β1*math+β2*female+β3*read.

    回归结果如下(结果经过编辑):

    hon

    系数β

    标准误

    P

    math

    .1229589

    0.000

    female

    0.979948

    0.020

    read

    .0590632

    0.026

    截距

    -11.77025

    0.000

    该结果说明:

    (1)性别:在math和read成绩都相同的条件下,女性(female=1)进入荣誉班的几率(odds)是男性(female=0)的exp(0.979948)

    = 2.66倍,或者说,女性的几率比男性高166%。

    (2)math成绩:在female和read都相同的条件下,math成绩每提高1,进入荣誉班的几率提高13%(因为exp(0.1229589)

    = 1.13)。

    (3)read的解读类似math。

    5、包含交互相应的模型

    拟合一个包含female、math和两者交互相应的Logistic回归,

    模型为ln(p/(1-p)

    =β0+β1*female+β2*math+β3*female

    *math.

    所谓交互效应,是指一个变量对结果的影响因另一个变量取值的不同而不同。

    回归结果如下(结果经过编辑):

    hon

    系数β

    标准误

    P

    female

    -2.899863

    0.349

    math

    .1293781

    0.000

    female*math

    .0669951

    0.210

    截距

    -8.745841

    0.000

    注意:female*math项的P为0.21,可以认为没有交互相应。但这里我们为了讲解交互效应,暂时忽略P值,姑且认为他们是存在交互效应的。

    由于交互效应的存在,我们就不能说在保持math和female*math不变的情况下,female的影响如何如何,因为math和female*math是不可能保持不变的!

    对于这种简单的情况,我们可以分别拟合两个方程,

    对于男性(female=0):

    log(p/(1-p))= β0+

    β2*math.

    对于女性(female=1):

    log(p/(1-p))= (β0+

    β1) +

    (β2+

    β3)*math.

    然后分别解释。

    展开全文
  • 一、 概述 Logistic回归主要用于因变量为分类变量(如疾病的缓解、不缓解,...因变量为二分类的称为二项logistic回归,因变量为分类的称为多元logistic回归。  下面学习一下Odds、OR、RR的概念: 在病例

    一、 概述

    Logistic回归主要用于因变量为分类变量(如疾病的缓解、不缓解,评比中的好、中、差等)的回归分析,自变量可以为分类变量,也可以为连续变量。他可以从多个自变量中选出对因变量有影响的自变量,并可以给出预测公式用于预测。

    因变量为二分类的称为二项logistic回归,因变量为多分类的称为多元logistic回归。 

    下面学习一下Odds、OR、RR的概念:

    在病例对照研究中,可以画出下列的四格表:

    ------------------------------------------------------

    暴露因素              病例             对照

    -----------------------------------------------------

    暴露                 a                 b 

    非暴露               c                 d

    -----------------------------------------------

    Odds: 称为比值、比数,是指某事件发生的可能性(概率)与不发生的可能性(概率)之比。在病例对照研究中病例组的暴露比值为:

    odds1 = (a/(a+c))/(c(a+c)) = a/c,

    对照组的暴露比值为:

    odds2 = (b/(b+d))/(d/(b+d)) = b/d

    OR比值比,为:病例组的暴露比值(odds1)/对照组的暴露比值(odds2) = ad/bc

     

    换一种角度,暴露组的疾病发生比值:

    odds1 = (a/(a+b))/(b(a+b)) = a/b

    非暴露组的疾病发生比值:

    odds2 = (c/(c+d))/(d/(c+d)) = c/d

    OR = odds1/odds2 = ad/bc

    与之前的结果一致。

     

    OR的含义与相对危险度相同,指暴露组的疾病危险性为非暴露组的多少倍。OR>1说明疾病的危险度因暴露而增加,暴露与疾病之间为“正”关联;OR<1说明疾病的危险度因暴露而减少,暴露与疾病之间为“负”关联。 还应计算OR的置信区间,若区间跨1,一般说明该因素无意义。

    关联强度大致如下:

    ------------------------------------------------------

           OR值                        联系强度

    ------------------------------------------------------

     0.9-1.0   1.0-1.1                    无

     0.7-0.8   1.2-1.4       弱(前者为负关联,后者为正关联)

     0.4-0.6   1.5-2.9                 中等(同上)

     0.1-0.3   3.0-9.0                  强(同上)

      <0.1     10.0以上                很强(同上)

    ------------------------------------------------------

     

    RR: 相对危险度(relative risk)的本质为率比(rate ratio)或危险比(risk ratio),即暴露组与非暴露组发病率之比,或发病的概率之比。但是病例对照研究不能计算发病率,所以病例对照研究中只能计算OR。当人群中疾病的发病率或者患病率很小时,OR近似等于RR,可用OR值代替RR。

    不同发病率情况下,OR与RR的关系图如下:


    SPSS学习笔记之——二项Logistic回归分析

     
    当发病率<10%时,RR与OR很接近。当发病率增大时,两者的差别增大。当OR>1时,OR高估了RR,当OR<1时,OR低估了RR。

    设疾病在非暴露人群中的发病为P0,则可用下列公式对RR记性校正:

    RR = OR/((1-P0)+(P0*OR))

    若P0未知,可以用c/(c+d)估计。

     

     


    二、 问题

    对银行拖欠贷款的影响因素进行分析,可选的影响因素有:客户的年龄、教育水平、工龄、居住年限、家庭收入、贷款收入比、信用卡欠款、其他债务等,从中选择出对是否拖欠贷款的预测因素,并进行预测。数据采用SPSS自带的bankloan.sav中的部分数据。

     

    三、 统计操作

    1、 准备数据 

    变量视图

    SPSS学习笔记之——二项Logistic回归分析

        数据视图

    SPSS学习笔记之——二项Logistic回归分析

    下面开始准备数据:

    由于“default”变量可能存在缺失值,所以要新建一个变量"validate",当default不为缺失值时,将validate=1,然后通过validate来判断将不缺失的值纳入回归分析:

    选择如下菜单:


    SPSS学习笔记之——二项Logistic回归分析

    点击进入“计算变量”对话框:


    SPSS学习笔记之——二项Logistic回归分析

    在“目标变量”看中输入“validate”,右边的“数字表达式”输入“1”。再点击下方的“如果...”按钮,进入对话框:


    SPSS学习笔记之——二项Logistic回归分析

    在框中输入missing(default)=0,含义是defalut变量不为缺失值。点击“继续”回到“计算变量”对话框:


    SPSS学习笔记之——二项Logistic回归分析

    点击确定,完成变量计算。 

    2、统计

    菜单选择


    SPSS学习笔记之——二项Logistic回归分析

    进入如下的对话框(下文称“主界面”):


    SPSS学习笔记之——二项Logistic回归分析

    将“是否拖欠贷款[default]”作为因变量选入“因变量”框中。将其与变量选入“协变量”框中,下方的“方法”下拉菜单选择“向前:LR”(即前向的最大似然法,选择变量筛选的方法,条件法和最大似然法较好,慎用Wald法)。将“validate”变量选入下方的“选择变量”框。点击“选择变量”框后的“规则”按钮,进入定义规则对话框:


    SPSS学习笔记之——二项Logistic回归分析

    设置条件为“validate=1”,点击“继续”按钮返回主界面:


    SPSS学习笔记之——二项Logistic回归分析

    点击右上角“分类”按钮,进入如下的对话框:


    SPSS学习笔记之——二项Logistic回归分析

    该对话框用来设置自变量中的分类变量,左边的为刚才选入的协变量,必须将所有分类变量选入右边的“分类协变量框中”。本例中只有“教育程度[ed]”为分类变量,将它选入右边框中,下方的“更改对比”可以默认。点击“继续”按钮返回主界面。

    回到主界面后点击“选项”按钮,进入对话框:


    SPSS学习笔记之——二项Logistic回归分析

    勾选“分类图”和“Hosmer-Lemeshow拟合度”复选框,输出栏中选择“在最后一个步骤中”,其余参数默认即可。“Hosmer-Lemeshow拟合度”能较好的检验该模型的拟合程度。

    点击继续回到主界面,点击“确定”输出结果。

     

    四、结果分析


    SPSS学习笔记之——二项Logistic回归分析

    以上是案例处理摘要及变量的编码。


    SPSS学习笔记之——二项Logistic回归分析

    上表是关于模型拟合度的检验。这用Cox&Snell R方和Negelkerke R方代替了线性回归中的R方,他们呢的值越接近1,说明拟合度越好,这个他们分别为0.2980.436,单纯看这一点,似乎模型的拟合度不好,但是该参数主要是用于模型之间的对比。


    SPSS学习笔记之——二项Logistic回归分析


    这是H-L检验表,P=0.381 > 0.05接受0假设,认为该模型能很好拟合数据。


    SPSS学习笔记之——二项Logistic回归分析


    H-L检验的随机性表,比较观测值与期望值,表中观测值与期望值大致相同,可以直观的认为,该模型拟合度较好。

    SPSS学习笔记之——二项Logistic回归分析

    这个是最终模型的预测结果列联表。在700例数据中进行预测,在未拖欠贷款的478+39=517例中,有478例预测正确,正确率92.5%;在91+92=183例拖欠贷款的用户中,有92例预测正确,正确率50.3%。总的正确率81.4%。可以看出该模型对于非拖欠贷款者预测效果较好。


    SPSS学习笔记之——二项Logistic回归分析


    这是最终拟合的结果,四个变量入选,P值均<0.05。列“B”为偏回归系数,“S.E.”为标准误差,“Wals”为Wald统计量。EXP(B)”即为相应变量的OR值(又叫优势比,比值比),为在其他条件不变的情况下,自变量每改变1个单位,事件的发生比“Odds”的变化率。如工龄为2年的用户的拖欠贷款的发生比(Odds)是工龄为1年的用户的0.785倍。

    最终的拟合方程式:logit(P)  =  -0.791 - 0.243*employ - 0.081*address + 0.088*detbinc + 0.573*creddebt。用该方程可以做预测,预测值大于0.5说明用户可能会拖欠贷款,小于0.5说明可能不会拖欠贷款。


    SPSS学习笔记之——二项Logistic回归分析


    这是不在方程中的变量,其P均大于0.05,没有统计学意义

    SPSS学习笔记之——二项Logistic回归分析

    这是预测概率的直方图。横轴为拖欠贷款的预测概率(0为不拖欠,1为拖欠),纵轴为观测的频数,符号“Y”代表拖欠,“N”代表不拖欠。若预测正确,所有的Y均应在横轴0.5分界点的右边,所有的N均应该在0.5分界点的左边,数据分布为“U”型,中间数据少,两头数据多。可以直观的看出,本模型对于不拖欠贷款的预测较好,对于拖欠贷款的预测相对较差。

    展开全文
  • Logistic回归

    2019-10-09 10:36:07
    Logistic回归算法中虽然也有“回归”,但是他并不是预测算法,而是一种分类算法,用于二分类的问题,但是它和线性回归还是有一定的关系的。 Logistic分布 首先我们给出Logistic分布函数如下: 其中μ是函数.....
  • 一文掌握分类logistic回归

    千次阅读 2020-08-21 11:55:28
    Logistic回归分析(logit回归)一般可分为3类,分别是二元Logistic回归分析、分类Logistic回归分析和有序Logistic回归分析。logistic回归分析类型如下所示。 Logistic回归分析用于研究X对Y的影响,并且对X的...
  • logistic回归分类与softmax回归

    千次阅读 2019-10-21 17:19:50
    目录 Logistic回归 逻辑回归的定义式: ...logistic回归分类)和softmax的关系: YOLOV3中的逻辑分类应用 Logistic回归 Logistic回归(LR):是一种常用的处理二分类问题的模型。 二分类...
  • logistic回归

    2019-11-22 15:17:03
    通常,Logistic回归用于二分类问题,例如预测明天是否会下雨。当然它也可以用于分类问题,不过为了简单起见,本文暂先讨论二分类问题。 利用logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归...
  • 使用Logistic回归模型来预测一个学生是否有资格入学。评估学生在两门test中的表现来决定录取率,通过以往的成绩和是否录取的学生数据建立模型,训练Logistic回归,对每一个新申请学生,你通过lr判定是否应该予以录取...
  • Logistic 回归 概述Logistic 回归虽然名字叫回归,但是它是用来做分类的。其主要思想是: 根据现有数据对分类边界线建立回归公式,以此进行分类。须知概念Sigmoid 函数回归 概念假设现在有一些数据点,我们用一条直线...
  • Logistic回归算法

    2018-11-19 12:54:49
    Logistic回归算法同样是需要通过样本空间学习的监督学习算法,并且适用于数值型和标称型数据,例如,我们需要根据输入数据的特征值(数值型)的大小来判断数据是某种分类或者不是某种分类。 #...
  • logistic回归改进

    千次阅读 2017-09-12 22:28:15
    在上一篇文章中,我们已经介绍过了logistic回归也用python代码实现了logistic回归,这张我们主要介绍如何来改进logistic回归算法的效率和性能。上篇文章中也介绍主要是使用了梯度上升算法进行迭代来计算参数的值,这...
  • 二元Logistic回归

    千次阅读 2020-10-16 22:58:08
    研究分类反应变量与个因素之间的关系,使用Logistic回归 典型例子:疾病的病因 (危险因素)分析 按反应变量分类 二分类:二元Logistic回归 分类无序:多元Logistic回归 分类有序:定序回归 (ordinal ...
  • 在医学研究中,为了控制一些重要的混杂因素,经常会把病例和对照按年龄,性别等条件进行配对,...病历对照研究或者倾向得分匹配研究(一种将研究数据处理成‘随机对照实验数据’的方法)中常使用条件Logistic回归进...
  • 逻辑斯蒂回归 基本思想 数学推导 基于R的案例 结论 基本思想这一讲给大家介绍一下...今天我们重点说一下,二项逻辑斯底回归多项逻辑斯底回归。我们先简单聊聊传统的线性回归,我们说线性回归就是y=k0+k1xy=k_0+k_1x,
  • 闲话:二项Logistic回归是我去年入门机器学习时学的第一个模型(忘记了为什么看完《统计学习方法》第一章之后直接就跳去了第六章,好像是对“逻辑斯蒂”这个名字很感兴趣?。。。),对照《机器学习实战》写了几行...
  • logistic回归详解

    万次阅读 多人点赞 2019-04-20 15:37:52
           逻辑斯谛回归(logistic regression)是统计学习中的经典分类方法,属于对数线性模型,...利用logistic回归进行分类的主要思想是:根据现有的数据对分类边界线建立回归...
  • 6、spss做logistic回归

    千次阅读 2015-04-15 15:29:38
    前边我们用两篇笔记讨论了线性回归的内容。线性回归是很重要的一种回归方法,但是线性回归...Logistic回归主要分为三类,一种是因变量为二分类得logistic回归,这种回归叫做二项logistic回归,一种是因变量为无序分类

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,723
精华内容 3,489
关键字:

多项logistic回归系数解释