Logistic回归实战篇之预测病马死亡率(二)

2024-01-13 11:10

本文主要是介绍Logistic回归实战篇之预测病马死亡率(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作 者:崔家华
编 辑:李文臣


三、从疝气病症状预测病马的死亡率

1、实战背景

本次实战内容,将使用Logistic回归来预测患疝气病的马的存活问题。原始数据集下载地址:archive.ics.uci.edu/ml/

这里的数据包含了368个样本和28个特征。这种病不一定源自马的肠胃问题,其他问题也可能引发马疝病。该数据集中包含了医院检测马疝病的一些指标,有的指标比较主观,有的指标难以测量,例如马的疼痛级别。另外需要说明的是,除了部分指标主观和难以测量外,该数据还存在一个问题,数据集中有30%的值是缺失的。下面将首先介绍如何处理数据集中的数据缺失问题,然后再利用Logistic回归和随机梯度上升算法来预测病马的生死。

2、准备数据

数据中的缺失值是一个非常棘手的问题,很多文献都致力于解决这个问题。那么,数据缺失究竟带来了什么问题?假设有100个样本和20个特征,这些数据都是机器收集回来的。若机器上的某个传感器损坏导致一个特征无效时该怎么办?它们是否还可用?答案是肯定的。因为有时候数据相当昂贵,扔掉和重新获取都是不可取的,所以必须采用一些方法来解决这个问题。下面给出了一些可选的做法:

  • 使用可用特征的均值来填补缺失值;

  • 使用特殊值来填补缺失值,如-1;

  • 忽略有缺失值的样本;

  • 使用相似样本的均值添补缺失值;

  • 使用另外的机器学习算法预测缺失值。

预处理数据做两件事:

  • 如果测试集中一条数据的特征值已经确实,那么我们选择实数0来替换所有缺失值,因为本文使用Logistic回归。因此这样做不会影响回归系数的值。sigmoid(0)=0.5,即它对结果的预测不具有任何倾向性。

  • 如果测试集中一条数据的类别标签已经缺失,那么我们将该类别数据丢弃,因为类别标签与特征不同,很难确定采用某个合适的值来替换。

原始的数据集经过处理,保存为两个文件:horseColicTest.txt和horseColicTraining.txt。已经处理好的“干净”可用的数据集下载地址:

  • github.com/Jack-Cherish

  • github.com/Jack-Cherish

有了这些数据集,我们只需要一个Logistic分类器,就可以利用该分类器来预测病马的生死问题了。

3、使用Python构建Logistic回归分类器

在使用Sklearn构建Logistic回归分类器之前,我们先用自己写的改进的随机梯度上升算法进行预测,先热热身。使用Logistic回归方法进行分类并不需要做很多工作,所需做的只是把测试集上每个特征向量乘以最优化方法得来的回归系数,再将乘积结果求和,最后输入到Sigmoid函数中即可。如果对应的Sigmoid值大于0.5就预测类别标签为1,否则为0。

# -*- coding:UTF-8 -*-

import numpy as np

import random

"""函数说明:sigmoid函数

Parameters:

   inX - 数据

Returns:

   sigmoid函数

Author:    Jack Cui

Blog:

   http://blog.csdn.net/c406495762

Zhihu:

   https://www.zhihu.com/people/Jack--Cui/

Modify:

   2017-09-05

"""

def sigmoid(inX):

   return 1.0 / (1 + np.exp(-inX))

"""

函数说明:改进的随机梯度上升算法

Parameters:

   dataMatrix - 数据数组

   classLabels - 数据标签

   numIter - 迭代次数

Returns:

   weights - 求得的回归系数数组(最优参数)

Author:

   Jack Cui

Blog:    http://blog.csdn.net/c406495762

Zhihu:    https://www.zhihu.com/people/Jack--Cui/

Modify:

   2017-09-05

"""

def stocGradAscent1(dataMatrix, classLabels, numIter=150):
    #返回dataMatrix的大小。m为行数,n为列数。

   weights = np.ones(n)   #存储每次更新的回归系数for j in range(numIter):                                           dataIndex = list(range(m))for i in range(m):           alpha = 4/(1.0+j+i)+0.01
   #降低alpha的大小,每次减小1/(j+i)。randIndex = int(random.uniform(0,len(dataIndex)))
    #随机选取样本h = sigmoid(sum(dataMatrix[randIndex]*weights))
    #选择随机选取的一个样本,计算herror = classLabels[randIndex] - h
     #计算误差weights = weights + alpha
                 * error * dataMatrix[randIndex]
                          #更新回归系数del(dataIndex[randIndex])
                       #删除已经使用的样本

   return weights       #返回

"""

函数说明:使用Python写的Logistic分类器做预测

Parameters:

   无

Returns:

   无

Author:

   Jack Cui

Blog:

   http://blog.csdn.net/c406495762

Zhihu:

   https://www.zhihu.com/people/Jack--Cui/

Modify:

   2017-09-05

"""

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(len(currLine)-1):lineArr.append(float(currLine[i]))trainingSet.append(lineArr)trainingLabels.append(float(currLine[-1]))trainWeights =
   stocGradAscent1(np.array(trainingSet), trainingLabels, 500)
   
#使用改进的随即上升梯度训练errorCount = 0; numTestVec = 0.0for line in frTest.readlines():numTestVec += 1.0currLine = line.strip().split('\t')lineArr =[]for i in range(len(currLine)-1):lineArr.append(float(currLine[i]))if int(classifyVector
       (np.array(lineArr), trainWeights))!= int(currLine[-1]):errorCount += 1errorRate = (float(errorCount)/numTestVec) * 100  
    #错误率计算

   print("测试集错误率为: %.2f%%" % errorRate)


"""

函数说明:分类函数

Parameters:

   inX - 特征向量

   weights - 回归系数

Returns:

   分类结果

Author:    Jack Cui

Blog:

   http://blog.csdn.net/c406495762

Zhihu:

   https://www.zhihu.com/people/Jack--Cui/

Modify:

   2017-09-05

"""

def classifyVector(inX, weights):

   prob = sigmoid(sum(inX*weights))if prob > 0.5: return 1.0else: return 0.0if __name__ == '__main__':colicTest()

运行结果如下:

错误率还是蛮高的,而且耗时1.9s,并且每次运行的错误率也是不同的,错误率高的时候可能达到40%多。为啥这样?首先,因为数据集本身有30%的数据缺失,这个是不能避免的。另一个主要原因是,我们使用的是改进的随机梯度上升算法,因为数据集本身就很小,就几百的数据量。用改进的随机梯度上升算法显然不合适。让我们再试试梯度上升算法,看看它的效果如何?

# -*- coding:UTF-8 -*-

import numpy as np

import random

"""函数说明:sigmoid函数

Parameters:

   inX - 数据

Returns:

   sigmoid函数

Author:

   Jack Cui

Blog:

   http://blog.csdn.net/c406495762

Zhihu:

   https://www.zhihu.com/people/Jack--Cui/

Modify:

   2017-09-05

"""

def sigmoid(inX):

   return 1.0 / (1 + np.exp(-inX))


"""

函数说明:梯度上升算法

Parameters:

   dataMatIn - 数据集

   classLabels - 数据标签

Returns:

   weights.getA() - 求得的权重数组(最优参数)

Author:

   Jack Cui

Blog:

   http://blog.csdn.net/c406495762

Zhihu:

   https://www.zhihu.com/people/Jack--Cui/

Modify:

   2017-08-28

"""

def gradAscent(dataMatIn, classLabels):

   dataMatrix = np.mat(dataMatIn)
   #转换成numpy的matlabelMat = np.mat(classLabels).transpose()
#转换成numpy的mat,并进行转置m, n = np.shape(dataMatrix)
   #返回dataMatrix的大小。m为行数,n为列数。alpha = 0.01
   #移动步长,也就是学习速率,控制更新的幅度。maxCycles = 500
   #最大迭代次数weights = np.ones((n,1))
      #梯度上升矢量化公式error = labelMat - hweights = weights + alpha *
                        dataMatrix.transpose() * error

   return weights.getA()  
   #将矩阵转换为数组,并返回


"""

函数说明:使用Python写的Logistic分类器做预测

Parameters:

   无

Returns:

   无

Author:

   Jack Cui

Blog:

   http://blog.csdn.net/c406495762

Zhihu:

   https://www.zhihu.com/people/Jack--Cui/

Modify:

   2017-09-05

"""

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(len(currLine)-1):lineArr.append(float(currLine[i]))trainingSet.append(lineArr)trainingLabels.append(float(currLine[-1]))trainWeights = gradAscent(np.array(trainingSet), trainingLabels)
     #使用改进的随即上升梯度训练errorCount = 0; numTestVec = 0.0for line in frTest.readlines():numTestVec += 1.0currLine = line.strip().split('\t')lineArr =[]for i in range(len(currLine)-1):lineArr.append(float(currLine[i]))if int(classifyVector
       (np.array(lineArr), trainWeights[:,0]))!= int(currLine[-1]):errorCount += 1errorRate = (float(errorCount)/numTestVec) * 100

#错误率计算

   print("测试集错误率为: %.2f%%" % errorRate)


"""

函数说明:分类函数

Parameters:

   inX - 特征向量

   weights - 回归系数

Returns:

   分类结果

Author:

   Jack Cui

Blog:

   http://blog.csdn.net/c406495762

Zhihu:

   https://www.zhihu.com/people/Jack--Cui/

Modify:

   2017-09-05

"""

def classifyVector(inX, weights):

   prob = sigmoid(sum(inX*weights))if prob > 0.5: return 1.0else: return 0.0if __name__ == '__main__':colicTest()

运行结果如下:

可以看到算法耗时减少了,错误率稳定且较低。很显然,使用随机梯度上升算法,反而得不偿失了。所以可以得到如下结论:

  • 当数据集较小时,我们使用梯度上升算法

  • 当数据集较大时,我们使用改进的随机梯度上升算法

对应的,在Sklearn中,我们就可以根据数据情况选择优化算法,比如数据较小的时候,我们使用liblinear,数据较大时,我们使用sag和saga。


本系列篇章:

Logistic回归实战篇之预测病马死亡率(一)

Logistic回归实战篇之预测病马死亡率(二)

Logistic回归实战篇之预测病马死亡率(三)


往期精彩文章推荐


支持向量机原理篇之手撕线性SVM 

章神的私房菜之数据预处理 

深入浅出--基于密度的聚类方法 

贝叶斯系列-贝叶斯与其它统计流派的区别和联系


扫描燕哥微信号,

拉你进机器学习大牛群。

福利满满,名额已不多…

群里目前包括:

清华张长水教授,

清华顾险峰教授,

北大黄铁军教授,

西安电子科技大学焦李成教授,

新加坡南洋理工大学黄广斌教授,

北交李清勇教授

等等……





这篇关于Logistic回归实战篇之预测病马死亡率(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/601248

相关文章

✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降

1️⃣线性回归(linear regression) f w , b ( x ) = w x + b f_{w,b}(x) = wx + b fw,b​(x)=wx+b 🎈A linear regression model predicting house prices: 如图是机器学习通过监督学习运用线性回归模型来预测房价的例子,当房屋大小为1250 f e e t 2 feet^

用Python实现时间序列模型实战——Day 14: 向量自回归模型 (VAR) 与向量误差修正模型 (VECM)

一、学习内容 1. 向量自回归模型 (VAR) 的基本概念与应用 向量自回归模型 (VAR) 是多元时间序列分析中的一种模型,用于捕捉多个变量之间的相互依赖关系。与单变量自回归模型不同,VAR 模型将多个时间序列作为向量输入,同时对这些变量进行回归分析。 VAR 模型的一般形式为: 其中: ​ 是时间  的变量向量。 是常数向量。​ 是每个时间滞后的回归系数矩阵。​ 是误差项向量,假

Tensorflow lstm实现的小说撰写预测

最近,在研究深度学习方面的知识,结合Tensorflow,完成了基于lstm的小说预测程序demo。 lstm是改进的RNN,具有长期记忆功能,相对于RNN,增加了多个门来控制输入与输出。原理方面的知识网上很多,在此,我只是将我短暂学习的tensorflow写一个预测小说的demo,如果有错误,还望大家指出。 1、将小说进行分词,去除空格,建立词汇表与id的字典,生成初始输入模型的x与y d

临床基础两手抓!这个12+神经网络模型太贪了,免疫治疗预测、通路重要性、基因重要性、通路交互作用性全部拿下!

生信碱移 IRnet介绍 用于预测病人免疫治疗反应类型的生物过程嵌入神经网络,提供通路、通路交互、基因重要性的多重可解释性评估。 临床实践中常常遇到许多复杂的问题,常见的两种是: 二分类或多分类:预测患者对治疗有无耐受(二分类)、判断患者的疾病分级(多分类); 连续数值的预测:预测癌症病人的风险、预测患者的白细胞数值水平; 尽管传统的机器学习提供了高效的建模预测与初步的特征重

深度学习与大模型第3课:线性回归模型的构建与训练

文章目录 使用Python实现线性回归:从基础到scikit-learn1. 环境准备2. 数据准备和可视化3. 使用numpy实现线性回归4. 使用模型进行预测5. 可视化预测结果6. 使用scikit-learn实现线性回归7. 梯度下降法8. 随机梯度下降和小批量梯度下降9. 比较不同的梯度下降方法总结 使用Python实现线性回归:从基础到scikit-learn 线性

【python因果推断库11】工具变量回归与使用 pymc 验证工具变量4

目录  Wald 估计与简单控制回归的比较 CausalPy 和 多变量模型 感兴趣的系数 复杂化工具变量公式  Wald 估计与简单控制回归的比较 但现在我们可以将这个估计与仅包含教育作为控制变量的简单回归进行比较。 naive_reg_model, idata_reg = make_reg_model(covariate_df.assign(education=df[

什么是GPT-3的自回归架构?为什么GPT-3无需梯度更新和微调

文章目录 知识回顾GPT-3的自回归架构何为自回归架构为什么架构会影响任务表现自回归架构的局限性与双向模型的对比小结 为何无需梯度更新和微调为什么不需要怎么做到不需要 🍃作者介绍:双非本科大四网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发,目前开始人工智能领域相关知识的学习 🦅个人主页:@逐梦苍穹 📕所属专栏:人工智能 🌻gitee地址:x

结合Python与GUI实现比赛预测与游戏数据分析

在现代软件开发中,用户界面设计和数据处理紧密结合,以提升用户体验和功能性。本篇博客将基于Python代码和相关数据分析进行讨论,尤其是如何通过PyQt5等图形界面库实现交互式功能。同时,我们将探讨如何通过嵌入式预测模型为用户提供赛果预测服务。 本文的主要内容包括: 基于PyQt5的图形用户界面设计。结合数据进行比赛预测。文件处理和数据分析流程。 1. PyQt5 图形用户界面设计

CNN-LSTM模型中应用贝叶斯推断进行时间序列预测

这篇论文的标题是《在混合CNN-LSTM模型中应用贝叶斯推断进行时间序列预测》,作者是Thi-Lich Nghiem, Viet-Duc Le, Thi-Lan Le, Pierre Maréchal, Daniel Delahaye, Andrija Vidosavljevic。论文发表在2022年10月于越南富国岛举行的国际多媒体分析与模式识别会议(MAPR)上。 摘要部分提到,卷积

多维时序 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测

多维时序 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测 目录 多维时序 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测(完整源码和数据) 2.SS