MachineLearning:四、逻辑回归in python

原创 2016年08月29日 15:41:38

前面讲了logistic的理论部分,这里我参照《机器学习实战》写了logistic的实现部分。如果对logistic不清楚,请看逻辑回归。 我建立了一个逻辑回归的类,类中包含三个主要函数:

  • fit:拟合模型.
  • predict:进行预测
  • score:求错误率

数据我使用预测患有疝病的马的存活问题。这里面的数据包含368个样本和28个特征。下面是详细代码,我的github上面有数据和代码:logistic regression
下面是具体代码,如果知道logistic原理,下面的代码并不难理解

# -*- coding: utf-8 -*-
"""python
Created on Fri Apr  8 23:59:45 2016

@author: wq

逻辑回归
"""
from numpy import  *


class LogisticRegression():
    '''
    二项逻辑回归模型

    参数
    --------

    '''
    def __init__(self, alpha=1):
        '''
        初始化
        参数
        ---------
        alpha,梯度下降迭代步长
        '''
        self.alpha = alpha
        self.weights = []     #模型权值

    def sigmoid(self, inX):
        #print inX
        return 1/(1+sum(exp(-inX)))

    def fit(self, dataMatrix, classLabels):
        '''根据训练数据拟合模型

        参数
        ------------
        dataMatrix:
            训练样本属性矩阵
            类型:array
        classLabels:
            训练样本标签
            类型:list

        '''
        row,col = dataMatrix.shape
        if len(self.weights) == 0:
            weights = ones(col)   #初始化权值矩阵2
        else:
            weights = self.weights
        diff = weights      #权值变化矩阵,初始化为权值矩阵
        j = 0 #迭代次数
        while(abs(max(diff))>0.001):     #当权值变化很小的时停止迭代。
            dataIndex = range(row)
            for i in range(row):
                alpha = 4/(self.alpha+i)+0.0001    #alpha随着每次迭代,下降。参数趋于稳定
                randIndex = int(random.uniform(0,len(dataIndex)))#随机选取训练对象
                h = self.sigmoid(sum(dataMatrix[randIndex]*weights))#sigmoid求值
                error = classLabels[randIndex] - h      #误差项

                diff = weights      
                weights = weights + alpha * error * dataMatrix[randIndex]#权值更新
                diff = weights - diff                #权值差异
                del(dataIndex[randIndex])
        self.weights = weights
        #print weights

    def predict(self,dataList):
        '''
        训练的二项逻辑回归预测

        参数
        --------
        dataList:
            待预测样本属性,
            类型:list
        '''
        if len(self.weights) == 0:
            raise KeyError,("没有进行模型训练")#如果没有进行fit预测,抛出异常
        prob = self.sigmoid(sum(dataList*self.weights))#概率
        if prob > 0.5:return 1
        else: return 0

    def score(self,dataMatrix, classLabels):
        '''
        评价模型性能


        参数
        ------------
        dataMatrix:
            测试样本属性举证
            属性:array
        classLabels:
            测试样本类别,这里只有1、0两类
            属性:list

        return
        ---------
        errorRate:错误率
        '''
        numData = len(dataMatrix)
        errorCount = 0
        j = 0 #行数记录,
        for line in dataMatrix:
            #print '预测结果',self.predict(line)
            #print '样本标签',classLabels[j]
            if int(self.predict(line)) != int(classLabels[j]):
                errorCount += 1
            j += 1
        #print errorCount
        errorRate = (float(errorCount)/numData)
        print "the error rate of this test is: %f" % errorRate
        return errorRate

if __name__=='__main__':
    frTrain = open('horseColicTraining.txt')#读取数据
    frTest = open('horseColicTest.txt')

    #读取训练集
    trainingSet = []; trainingLabels = []
    for line in frTrain.readlines():
        line = line.strip().split('\t')
        trainingSet.append(map(float, line)[:-1])
        trainingLabels.append(float(line[21]))

    #读取测试集
    testSet = [];testLabels = []
    for line in frTest:
        line = line.strip().split('\t')
        testSet.append(map(float, line)[:-1])
        testLabels.append(line[21])

    #实例化
    clf = LogisticRegression(1.0)
    #迭代10次
    for i in range(10):
        clf.fit(array(trainingSet), trainingLabels)
        clf.score(array(testSet), testLabels)

参考资料

《机器学习实战》

版权声明:本文为博主原创文章,未经博主允许不得转载。

MachineLearning—Logistic Regression(四)-逻辑回归应用于手写数字识别

之前的文章对逻辑回归已经进行了较为详尽的介绍,在此我们为了更为迅速方便的理解逻辑回归在手写数字识别当中的应用,我们仅仅做简单快速的回顾。逻辑回归通常应用于二分类问题,而经过拓展其也可以应用于多分类问题...

MachineLearning:三、聊聊逻辑回归

在Machine Learning中,逻辑斯蒂回归(Logistic Regression)是十分经典的方法,简称LR,虽然名字叫回归,但是这是线性分类模型而不是回归模型。这里面涉及到一些知识点,包括...
  • Earl211
  • Earl211
  • 2016年08月29日 15:25
  • 742

学习Machine Leaning In Action(四):逻辑回归

第一眼看到逻辑回归(Logistic Regression)这个词时,脑海中没有任何概念,读了几页后,发现这非常类似于神经网络中单个神经元的分类方法。 书中逻辑回归的思想是用一个超平面将数据集分...

python 逻辑回归 程序解析

python《机器学习实战》逻辑回归部分,用全部样本多次进行梯度上升的程序如下: # coding=utf-8 __author__ = 'Administrator' from numpy impo...

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) zouxy09@qq.com http://blog.csdn.net/zouxy09        ...

逻辑回归python实现实例

这个例子是《机器学习实战》()逻辑回归的一个实例:从疝气病症预测病马的死亡率。 疝病是描述马胃肠痛的术语。该数据集中包含了医院检查马疝病的一些指标,我们的目标是通过这些指标(特征),来预测马是否会...

逻辑回归python实现(随机增量梯度下降,变步长)

关于逻辑回归的学习,建议大家看看这篇blog,讲的很清楚:点击打开链接 逻辑回归,实际上就是对线性回归多增加了一个函数映射,使其值域由无穷区间映射到[0,1]区间 在线性回归中,估计函数为  其中d...

逻辑回归和Python应用举例

逻辑回归和Python应用举例 1. 概率:      1.1 定义   概率(P)robability: 对一件事情发生的可能性的衡量      1.2 范围   0      1.3...
  • A784586
  • A784586
  • 2017年05月09日 17:08
  • 155
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MachineLearning:四、逻辑回归in python
举报原因:
原因补充:

(最多只允许输入30个字)