【数据科学系统学习】机器学习算法 # 西瓜书学习记录 [3] Logistic 回归实践

贾敦
• 阅读 2360

本篇内容为《机器学习实战》第 5 章 Logistic 回归程序清单。

书中所用代码为 python2,下面给出的程序清单是在 python3 中实践改过的代码,希望对你有帮助。


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

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

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

程序清单 5-1:Logisitc 回归梯度上升优化算法

# 打开文本文件 testSet.txt 并逐行读取
def loadDataSet():
    dataMat = []; lableMat = []
    fr = open('testSet.txt')
    for line in fr.readlines():
        lineArr = line.strip().split()
        # 为计算方便,将 X0 的值设为 1.0
        dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
        lableMat.append(int(lineArr[2]))
    return dataMat, lableMat

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

# 参数 dataMatIn 是一个 2 维 numpy 数组,存放的是一个 100*3 的矩阵
# 每列分别代表每个不同的特征,每行代表每个训练样本
def gradAscent(dataMatIn, classLabels):
    # 转换为 numpy 矩阵的数据类型
    dataMatrix = mat(dataMatIn)
    # classLabels 类别标签
    labelMat = mat(classLabels).transpose()
    # 得到矩阵大小
    m,n = shape(dataMatrix)

    # 设置梯度上升法所需参数
    # alpha 步长,maxCycles 迭代次数
    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

在 python 提示符下,执行代码并得到结果:

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

分析数据:画出决策边界

程序清单 5-2:画出数据集和 Logistic 回归最佳拟合直线的函数

# 画出数据集和logistic回归最佳拟合直线的函数
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)
    # 形状参数 marker 's':正方形,参数 s:点的大小
    ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
    ax.scatter(xcord2, ycord2, s=30, c='green')

    # arange(start, end, step),返回一个array对象
    x = arange(-3.0, 3.0, 0.1)
    # 设置 sigmoid 函数为0
    y = (-weights[0]-weights[1]*x)/weights[2]
    ax.plot(x, y)
    plt.xlabel('X1')
    plt.ylabel('X2')
    plt.show()

在 python 提示符下,执行代码并得到结果:

>>> import importlib
>>> importlib.reload(logRegres)
<module 'logRegres' from '/Users/Desktop/Coding/logRegres.py'>
>>> weights = logRegres.gradAscent(dataArr, labelMat)
>>> logRegres.plotBestFit(weights.getA())

【数据科学系统学习】机器学习算法 # 西瓜书学习记录 [3] Logistic 回归实践

训练算法:随机梯度上升

随机梯度上升算法的伪代码如下:
所有回归系数初始化为 1
对数据集中每个样本
————计算该样本的梯度
————使用 alpha $\times$ gradient 更新回归系数值
返回回归系数值

程序清单 5-3:随机梯度上升算法

# 随机梯度上升算法
def stocGradAscent0(dataMatrix, classLabels):
    m,n = shape(dataMatrix)
    alpha = 0.01
    weights = ones(n)
    for i in range(m):
        # 变量 h 和误差 error 都是向量
        h = sigmoid(sum(dataMatrix[i]*weights))
        error = classLabels[i] - h
        weights = weights + alpha * error * dataMatrix[i]
    return weights

在 python 提示符下,执行代码并得到结果:

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

【数据科学系统学习】机器学习算法 # 西瓜书学习记录 [3] Logistic 回归实践

程序清单 5-4:改进的随机梯度上升算法

# 改进的随机梯度上升算法
def stocGradAscent1(dataMatrix, classLabels, numIter=150):
    m,n = shape(dataMatrix)
    weights = ones(n)
    for j in range(numIter):
        dataIndex = list(range(m))
        for i in range(m):
            alpha = 4/(1.0+j+i)+0.01
            # uniform() 方法将随机生成下一个实数
            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

在 python 提示符下,执行代码并得到结果:

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

【数据科学系统学习】机器学习算法 # 西瓜书学习记录 [3] Logistic 回归实践

示例:从疝气病症预测病马的死亡率

使用 Logistic 回归估计马疝病的死亡率

  • 收集数据:给定数据文件。
  • 准备数据:用 Python 解析文本文件并填充缺失值。
  • 分析数据:可视化并观察数据。
  • 训练算法:使用优化算法,找到最佳的系数。
  • 测试算法:为了量化回归的效果,需要观察错误率。根据错误率决定是否回退到训练阶段,通过改变迭代的次数和步长等参数来得到更好的回归系数。
  • 使用算法:实现一个简单的命令行程序来收集马的症状并输出预测结果。
使用 Logistic 回归方法进行分类所需做的是把测试集上每个特征向量乘以最优化方法得来的回归系数,再将该乘积结果求和,最后输入到 sigmoid 函数即可。如果对应的 sigmoid 值大于 0.5 就预测类别标签为 1,否则为 0。

程序清单 5-5:Logistic 回归分类函数

# 以回归系数和特征向量作为输入来计算对应的 sigmoid 值
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(array(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('这个测试集的错误率是:%f' % errorRate)
    return errorRate

def multiTest():
    numTests = 10
    errorSum = 0.0
    
    for k in range(numTests):
        errorSum += colicTest()
        
    print('经过 %d 次迭代后平均错误率是:%f' % (numTests, errorSum/float(numTests)))

在 python 提示符下,执行代码并得到结果:

>>> importlib.reload(logRegres)
<module 'logRegres' from '/Users/Desktop/Coding/logRegres.py'>
>>> logRegres.multiTest()
这个测试集的错误率是:0.358209
这个测试集的错误率是:0.373134
这个测试集的错误率是:0.253731
这个测试集的错误率是:0.402985
这个测试集的错误率是:0.358209
这个测试集的错误率是:0.298507
这个测试集的错误率是:0.343284
这个测试集的错误率是:0.298507
这个测试集的错误率是:0.402985
这个测试集的错误率是:0.417910
经过 10 次迭代后平均错误率是:0.350746

Logistic 回归的目的是寻找一个非线性函数 sigmoid 的最佳拟合参数,求解过程可以由最优化算法来完成。


不足之处,欢迎指正。

$$$$

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
深度学习技术开发与应用
关键点1.强化学习的发展历程2.马尔可夫决策过程3.动态规划4.无模型预测学习5.无模型控制学习6.价值函数逼近7.策略梯度方法8.深度强化学习DQN算法系列9.深度策略梯度DDPG,PPO等第一天9:0012:0014:0017:00一、强化学习概述1.强化学习介绍2.强化学习与其它机器学习的不同3.强化学习发展历史4.强化学习典
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
黎明之道 黎明之道
4年前
天池比赛数据挖掘心电图模型调参
Task4建模与调参4.1学习目标学习机器学习模型的建模过程与调参流程完成相应学习打卡任务4.2内容介绍逻辑回归模型:理解逻辑回归模型;逻辑回归模型的应用;逻辑回归的优缺点;树模型:理解树模型;树模型的应用;树模型的优缺点;集成模型基于bagging思想的集成
Wesley13 Wesley13
4年前
AI金融知识自学偏量化方向
前提:统计学习(统计分析)和机器学习之间的区别金融公司采用机器学习技术及招募相关人才要求第一个问题:  机器学习和统计学都是数据科学的一部分。机器学习中的学习一词表示算法依赖于一些数据(被用作训练集),来调整模型或算法的参数。这包含了许多的技术,比如回归、朴素贝叶斯或监督聚类。但不是所有的技术都适合机器学习。例如有一种统计和数
Stella981 Stella981
4年前
Python——sklearn 中 Logistics Regression 的 coef_ 和 intercept_ 的具体意义
sklearn中LogisticsRegression的coef\_和intercept\_的具体意义​使用sklearn库可以很方便的实现各种基本的机器学习算法,例如今天说的逻辑斯谛回归(LogisticR
机器学习基础
本章涵盖了以下主题:分类和回归之外的其他类型的问题;评估问题,理解过拟合、欠拟合,以及解决这些问题的技巧;为深度学习准备数据。请记住,在本章中讨论的大多数技术都是机器学习和深度学习通用的,一部分用于解决过拟合问题的技术(如dropout)除外。4.1 三类机器学习问题在之前的所有例子中,尝试解决的是分类(预测猫或狗)或回归(预测用户在平台上花费的平均时
机器学习基础
机器学习基础本章涵盖了以下主题:分类和回归之外的其他类型的问题;评估问题,理解过拟合、欠拟合,以及解决这些问题的技巧;为深度学习准备数据。请记住,在本章中讨论的大多数技术都是机器学习和深度学习通用的,一部分用于解决过拟合问题的技术(如dropout)除外。4.1 三类机器学习问题在之前的所有例子中,尝试解决的是分类(预测猫或狗)或回归(预测用户在平台上
迁移学习核心技术的开发与应用
一、机器学习简介与经典机器学习算法介绍1.什么是机器学习?2.机器学习框架与基本组成3.机器学习的训练步骤4.机器学习问题的分类5.经典机器学习算法介绍章节目标:机器学习是人工智能的重要技术之一,详细了解机器学习的原理、机制和方法,为学习深度学习与迁移学习打下坚实的基础。二、深度学习简介与经典网络结构介绍1.神经网络简介2.神经网络组件简介3.神经网