python实现逻辑logistic回归:预测病马的死亡率

假设现在有一些数据点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称为回归。训练分类器就是为了寻找最佳拟合参数,使用的是最优化算法。

这就是简单的线性回归问题,可以通过最小二乘法求解其参数,最小二乘法和最大似然估计。 但是当有一类情况如判断邮件是否为垃圾邮件或者判断患者癌细胞为恶性的还是良性的,这就属于分类问题了,是线性回归所无法解决的。这里以线性回归为基础,讲解logistic回归用于解决此类分类问题。

python代码的实现

(1) 使用梯度上升找到最佳参数

from numpy import *  
#加载数据 
def loadDataSet():  
    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  
 
#计算sigmoid函数 
def sigmoid(inX):  
 return 1.0/(1+exp(-inX))  
 
#梯度上升算法-计算回归系数 
def gradAscent(dataMatIn, classLabels):  
    dataMatrix = mat(dataMatIn)          #转换为numpy数据类型 
    labelMat = mat(classLabels).transpose()  
    m,n = shape(dataMatrix)  
    alpha = 0.001 
    maxCycles = 500 
    weights = ones((n,1))  
 for k in range(maxCycles):  
        h = sigmoid(dataMatrix*weights)  
        error = (labelMat - h)  
        weights = weights + alpha * dataMatrix.transpose() * error  
 return weights  

(2) 画出决策边界

#画出决策边界 
def plotBestFit(wei):  
 import matplotlib.pyplot as plt  
    weights = wei.getA()  
    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()  

(3) 随机梯度上升算法

梯度上升算法在处理100个左右的数据集时尚可,但如果有数十亿样本和成千上万的特征,那么该方法的计算复杂度就太高了。改进方法为随机梯度上升算法,该方法一次仅用一个样本点来更新回归系数。它占用更少的计算资源,是一种在线算法,可以在数据到来时就完成参数的更新,而不需要重新读取整个数据集来进行批处理运算。一次处理所有的数据被称为批处理。

  1. #随机梯度上升算法
def stocGradAscent0(dataMatrix, classLabels):  
    dataMatrix = array(dataMatrix)  
    m,n = shape(dataMatrix)  
    alpha = 0.1 
    weights = ones(n)  
 for i in range(m):  
        h = sigmoid(sum(dataMatrix[i] * weights))  
        error = classLabels[i] - h  
        weights = weights + alpha * error * dataMatrix[i]  
 return weights  

(4) 改进的随机梯度上升算法

#改进的随机梯度上升算法 
def stocGradAscent1(dataMatrix, classLabels, numInter = 150):  
    dataMatrix = array(dataMatrix)  
    m,n = shape(dataMatrix)  
    weights = ones(n)  
 for j in range(numInter):  
        dataIndex = range(m)  
 for i in range(m):  
            alpha = 4 / (1.0+j+i) + 0.01 #alpha值每次迭代时都进行调整 
            randIndex = int(random.uniform(0, len(dataIndex)))            #随机选取更新 
            h = sigmoid(sum(dataMatrix[randIndex] * weights))  
            error = classLabels[randIndex] - h  
            weights = weights + alpha * error * dataMatrix[randIndex]  
 del[dataIndex[randIndex]]  
 return weights  

注意:主要做了三个方面的改进:<1>alpha在每次迭代的时候都会调整,这会缓解数据波动或者高频波动。<2>通过随机选取样本来更新回归系数,这样可以减少周期性波动<3>增加了一个迭代参数

3:案例—从疝气病症预测病马的死亡率

(1) 处理数据中缺失值方法:

但是对于类别标签丢失的数据,我们只能采用将该数据丢弃。

(2) 案例代码

#案例-从疝气病症预测病马的死亡率 
def classifyVector(inX, weights):  
    prob = sigmoid(sum(inX*weights))  
 if prob > 0.5: return 1.0 
 else: return 0.0 
 
def colicTest():  
    frTrain = open('horseColicTraining.txt')  
    frTest = open('horseColicTest.txt')  
    trainingSet = []; trainingLabels = []  
 for line in frTrain.readlines():  
        currLine = line.strip().split('\t')  
        lineArr =[]  
 for i in range(21):  
            lineArr.append(float(currLine[i]))  
        trainingSet.append(lineArr)  
        trainingLabels.append(float(currLine[21]))  
    trainWeights = stocGradAscent1(trainingSet, trainingLabels, 500)  
    errorCount = 0; numTestVec = 0.0 
 for line in frTest.readlines():  
        numTestVec += 1.0 
        currLine = line.strip().split('\t')  
        lineArr = []  
 for i in range(21):  
            lineArr.append(float(currLine[i]))  
 if int(classifyVector(array(lineArr), trainWeights))!= int(currLine[21]):  
            errorCount += 1 
    errorRate = (float(errorCount)/numTestVec)  
 print 'the error rate of this test is: %f' % errorRate  
 return errorRate  
 
def multiTest():  
    numTests = 10;errorSum = 0.0 
 for k in range(numTests):  
        errorSum += colicTest()  
 print 'after %d iterations the average error rate is: %f' %(numTests, errorSum/float(numTests))  
 

4:总结

Logistic回归的目的是寻找一个非线性函数sigmoid的最佳拟合参数,求解过程可以由最优化算法来完成。在最优化算法中,最常用的就是梯度上升算法,而梯度上升算法又可以简化为随机梯度上升算法。

随机梯度上升算法和梯度上升算法的效果相当,但占用更少的计算资源。此外,随机梯度是一种在线算法,可以在数据到来时就完成参数的更新,而不需要重新读取整个数据集来进行批处理运算。

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2016-09-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏专知

【论文推荐】最新八篇强化学习相关论文—残差网络、QMIX、元学习、动态速率分配、分层强化学习、抽象概况、快速物体检测、SOM

【导读】专知内容组整理了最近八篇强化学习(Reinforcement learning)相关文章,为大家进行介绍,欢迎查看! 1.BlockDrop: Dyna...

58550
来自专栏专知

计算机视觉经典论文荟萃,深度学习方法占领9大方向,建议收藏

【导读】近日,大连理工大学的学生ArcherFMY针对近几年深度学习在计算机视觉领域的应用提供了一个非常详细的阅读清单。如果你在深度学习领域是一个新手,你可以会...

65590
来自专栏专知

【论文推荐】最新八篇图像描述生成相关论文—比较级对抗学习、正则化RNNs、深层网络、视觉对话、婴儿说话、自我检索

【导读】专知内容组整理了最近八篇图像描述生成(Image Captioning)相关文章,为大家进行介绍,欢迎查看! 1.Generating Diverse ...

558100
来自专栏专知

【论文推荐】最新八篇图像检索相关论文—三元组、深度特征图、判别式、卷积特征聚合、视觉-关系知识图谱、大规模图像检索

37130
来自专栏专知

【论文推荐】最新六篇深度强化学习( DRL)相关论文—VR眼镜、参数噪声、恶意软件、合成复杂程序、深度继承表示、自适应

【导读】专知内容组整理了最近六篇深度强化学习( Deep Reinforcement Learning)相关文章,为大家进行介绍,欢迎查看! 1. VR Gog...

47860
来自专栏专知

【论文推荐】最新6篇主题模型相关论文—正则化变分推断主题模型、非参数先验、在线聊天、词义消歧、神经语言模型

【导读】专知内容组整理了最近六篇主题模型(Topic Modeling)相关文章,为大家进行介绍,欢迎查看! 1. Topic Modeling on Heal...

32350
来自专栏大数据挖掘DT机器学习

Python机器学习——线性模型

最近断断续续地在接触一些python的东西。按照我的习惯,首先从应用层面搞起,尽快入门,后续再细化一 些技术细节。找了一些资料,基本语法和数据结构搞定之后...

40460
来自专栏大数据挖掘DT机器学习

数据挖掘算法-python实现:Logical回归

比如说我们有两类数据,各有50十个点组成,当我门把这些点画出来,会有一条线区分这两组数据,我们拟合出这个曲线(因为很有可能是非线性),就是回归。我们通过大量的...

35780
来自专栏专知

【论文推荐】最新5篇推荐系统相关论文—文档向量矩阵分解、异构网络融合、树结构深度模型、深度强化学习、负二项矩阵分解

【导读】专知内容组整理了最近五篇推荐系统(Recommender System)相关文章,为大家进行介绍,欢迎查看! 1. ParVecMF: A Paragr...

48340
来自专栏生信技能树

第4篇:对ATAC-Seq/ChIP-seq的质量评估(一)——phantompeakqualtools

在下游分析前,最好是先对peak calling 后的ChIP-Seq数据进行质量评估。

85130

扫码关注云+社区

领取腾讯云代金券