Logistic回归

一、Logistic回归介绍

逻辑回归也称作logistic回归分析,是一种广义的线性回归分析模型,属于机器学习中的监督学习。其推导过程与计算方式类似于回归的过程,但实际上主要是用来解决二分类问题(也可以解决多分类问题)。通过给定的n组数据(训练集)来训练模型,并在训练结束后对给定的一组或多组数据(测试集)进行分类。其中每一组数据都是由p 个指标构成。
 

二、Logistic算法的一般流程

logistic回归一般过程就是:(1)收集数据       

                                                (2)准备数据         

                                                (3)分析数据         

                                                (4)训练算法       

                                                (5)测试算法        

                                                (6)使用算法
 

三、算法原理分析

3.1 Sigmoid函数

 对于logistic回归,我们需要一个函数,接受所有的输入然后预测出类别。例如,在数据只有两个类别的情况下,上述函数应该要输出0或1。《机器学习实战》一书中提到过海维塞德阶跃函数,又称单位阶跃函数,如下图:

单位阶跃函数的问题在于:在0点位置该函数从0瞬间跳跃到1,这个瞬间跳跃过程很难处理(不好求 导)。幸运的是,Sigmoid函数也有类似的性质,且数学上更容易处理。

Sigmoid函数公式:

 在图像中,当x=0时,sigmoid函数值为0.5,随着x的增大,sigmoid的值逼近于1;而随着x的减小,sigmoid的值逼近于0。将坐标轴无限放大,也类似一种阶跃函数。这就实现了0和1的分类,并且0到1的过程中是平滑的。

        因此,为了实现logistic回归分类器,我们可以在每个特征上都乘以一个回归系数,然后把所有的结果值相加,将这个总和代入sigmoid函数中,得到一个范围在0~1之间的数值。任何大于0.5的数据被分入1类 ,小于0.5即被归入0类 。所以,Logistic回归也可以被看成是一种概率估计。

3.2极大似然估计

极大似然估计是数理统计中参数估计的一种重要方法。其思想就是一个事件发生了,那么发生这个事件的概率就是最大的。对于样本i,其类别为。对于样本i,可以把看成是一种概率。yi对应是1时,概率是h(xi),即xi属于1的可能性;yi对应是0时,概率是1-h(xi),即xi属于0的可能性 。那么它构造极大似然函数:

其中i从0到k是属于类别1的个数k,i从k+1到n是属于类别0的个数n-k。由于y是标签0或1,所以上面的式子也可以写成:

这样无论y是0还是1,其中始终有一项会变成0次方,也就是1,和第一个式子是等价的。

为了方便,我们对式子取对数。因为是求式子的最大值,可以转换成式子乘以负1,之后求最小值。同时对于n个数据,累加后值会很大,之后如果用梯度下降容易导致梯度爆炸。所以可以除以样本总数n。

求最小值方法很多,机器学习中常用梯度下降系列方法。也可以采用牛顿法,或是求导数为零时w的数值等。

四、算法实现

4.1数据处理

读取两个数据集

def loadDataSet():   
    dataMat = []
    labelMat = []
    fr = open(filename)
    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

4.2.定义sigmoid函数

def sigmoid(inX): 
    return 1.0/(1+exp(-inX))

4.3 梯度上升法求参数

def gradAscent(dataMat, labelMat): 
    dataMatrix=mat(dataMat) 
    classLabels=mat(labelMat).transpose() 
    m,n = shape(dataMatrix)
    alpha = 0.001  
    maxCycles = 500 
    weights = ones((n,1)) 
 
    for k in range(maxCycles):
        h = sigmoid(dataMatrix*weights)
        error = (classLabels - h)    
        weights = weights + alpha * dataMatrix.transpose()* error 
    return weights

4.4完整代码

import numpy as np
import matplotlib.pyplot as plt
 
filename='C:/Desktop/LogisticTest.txt' 
def loadDataSet():   
    dataMat = []
    labelMat = []
    fr = open(filename)
    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): 
    return 1.0/(1+exp(-inX))
 
def gradAscent(dataMat, labelMat): 
    dataMatrix=mat(dataMat) 
    classLabels=mat(labelMat).transpose()
    m,n = shape(dataMatrix)
    alpha = 0.001  
    maxCycles = 500 
    weights = ones((n,1)) 
    for k in range(maxCycles):
        h = sigmoid(dataMatrix*weights)
        error = (classLabels - h)     
        weights = weights + alpha * dataMatrix.transpose()* error 
    return weights
 
 
def plotBestFit(weights):  
    import matplotlib.pyplot as plt
    dataMat,labelMat=loadDataSet()
    dataArr = array(dataMat)
    n = shape(dataArr)[0]
    xcord1 = []; ycord1 = []
    xcord2 = []; ycord2 = []
    for i in range(n):
        if int(labelMat[i])== 1:
            xcord1.append(dataArr[i,1])
            ycord1.append(dataArr[i,2])
        else:
            xcord2.append(dataArr[i,1])
            ycord2.append(dataArr[i,2])
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
    ax.scatter(xcord2, ycord2, s=30, c='green')
    x = arange(-3.0, 3.0, 0.1)
    y = (-weights[0]-weights[1]*x)/weights[2]
    ax.plot(x, y)
    plt.xlabel('X1')
    plt.ylabel('X2')
    plt.show()
 
def main():
    dataMat, labelMat = loadDataSet()
    weights=gradAscent(dataMat, labelMat).getA()
    plotBestFit(weights)
 
if __name__=='__main__':
    main()
 

运行结果:

五、实验总结(逻辑回归的优缺点

1、优点

(1)适合分类场景

(2)计算代价不高,容易理解实现。

(3)不用事先假设数据分布,这样避免了假设分布不准确所带来的问题。

(4)不仅预测出类别,还可以得到近似概率预测。

(5)目标函数任意阶可导。

2、缺点

(1)容易欠拟合,分类精度不高。

(2)数据特征有缺失或者特征空间很大时表现效果并不好。
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值