《机器学习实战》学习笔记———使用logistic回归预测患有疝病的马的存活
- 拟解决基本问题描述
- 数据准备与数据预处理
- 模型基本原理与算法实现
- 测试方法与结果
- 总结
- 代码
- 参考文献
拟解决基本问题描述
本文拟解决预测患有疝病的马的存活问题,logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域。例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等。以胃癌病情分析为例,选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群必定具有不同的体征与生活方式等。因此因变量就为是否胃癌,值为“是”或“否”,自变量就可以包括很多了,如年龄、性别、饮食习惯、幽门螺杆菌感染等。自变量既可以是连续的,也可以是分类的。然后通过logistic回归分析,可以得到自变量的权重,从而可以大致了解到底哪些因素是胃癌的危险因素。同时根据该权值可以根据危险因素预测一个人患癌症的可能性。
这里的数据包含了医院检测马疝病的一些指标,有的指标比较主观,有的指标难以测量,例如马的痛疼级别。
数据准备与数据预处理
数据准备
数据来源于一些马的一些指标以及马的存货情况。
数据预处理
除了部分指标主观和难以测量外,该数据还存在一个问题,数据集中有30%是缺失的。对于训练集将训练集的缺失值附0,而在测试集中,对于有缺失的数据,则将该条数据丢弃
模型基本原理与算法实现
对于logistic回归,它包含一个logistic回归分类函数:
然后需要打开数据集和测试集,并对数据进行格式化处理
然后使用改进后的随机梯度下降算法求得在此数据集上的最佳回归系数
然后就可以进行对测试集的测试了,并进行错误率的统计
测试方法与结果
通过进行十次测试,再对每次的错误率求和并取平均
10次迭代之后的平均错误率为35%。由于有30%的数据缺失,这个结果还是较为不错。
总结
Logistic回归的优缺点
优点:
实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低。
缺点:
容易欠拟合,分类精度可能不高。
Logistic回归的目的是寻找一个非线性函数Sigmoid对最佳拟合参数,求解过程可以由最优化算法来完成。在最优化算法中,最常用的就是梯度上升算法,而梯度上升算法又可以简化为随机梯度上升算法。
随机梯度上升算法与梯度上升算法的效果相当,但占用更少的计算资源。
代码
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,labelMatdef sigmoid(inX):return 1.0/(1+exp(-inX))def gradAscent(dataMatIn, classLabels):dataMatrix = mat(dataMatIn) #convert to NumPy matrixlabelMat = mat(classLabels).transpose() #convert to NumPy matrixm,n = shape(dataMatrix)alpha = 0.001maxCycles = 500weights = ones((n,1))for k in range(maxCycles): #heavy on matrix operationsh = sigmoid(dataMatrix*weights) #matrix multerror = (labelMat - h) #vector subtractionweights = weights + alpha * dataMatrix.transpose()* error #matrix multreturn weightsdef plotBestFit(weights):import matplotlib.pyplot as pltdataMat,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 stocGradAscent0(dataMatrix, classLabels):m,n = shape(dataMatrix)alpha = 0.01weights = ones(n) #initialize to all onesfor i in range(m):h = sigmoid(sum(dataMatrix[i]*weights))error = classLabels[i] - hweights = weights + alpha * error * dataMatrix[i]return weightsdef stocGradAscent1(dataMatrix, classLabels, numIter=150):m,n = shape(dataMatrix)weights = ones(n) #initialize to all onesfor j in range(numIter):dataIndex = list(range(m))for i in range(m):alpha = 4/(1.0+j+i)+0.0001 #apha decreases with iteration, does not randIndex = int(random.uniform(0,len(dataIndex)))#go to 0 because of the constanth = sigmoid(sum(dataMatrix[randIndex]*weights))error = classLabels[randIndex] - hweights = weights + alpha * error * dataMatrix[randIndex]del(dataIndex[randIndex])return weightsdef classifyVector(inX, weights):prob = sigmoid(sum(inX*weights))if prob > 0.5: return 1.0else: return 0.0def 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, 1000)errorCount = 0; numTestVec = 0.0for line in frTest.readlines():numTestVec += 1.0currLine = 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 += 1errorRate = (float(errorCount)/numTestVec)print ("the error rate of this test is: %f" % errorRate)return errorRatedef multiTest():numTests = 10; errorSum=0.0for k in range(numTests):errorSum += colicTest()print ("after %d iterations the average error rate is: %f" % (numTests, errorSum/float(numTests)))multiTest()
参考文献
【1】《机器学习实战》
《机器学习实战》学习笔记———使用logistic回归预测患有疝病的马的存活相关推荐
- 《机器学习实战》学习笔记:Logistic回归预测疝气病证的死亡率
前言: 生活中,人们经常会遇到各种最优化问题,比如如何在最短时间从一个地点到另外一个地点?如何在投入最少的资金而却能得到最高的受益?如何设计一款芯片使其功耗最低而性能最好?这一节就要学习一种最优化算法 ...
- 机器学习实战 学习笔记
jupyter notebook机器学习基础from numpy import * random.rand(4,4) randMat=mat(random.rand(4,4)) mat 把数组转化为矩 ...
- 《机器学习实战 学习笔记》(二):端到端的机器学习项目
文章目录 第2章 端到端的机器学习项目 1 使用真实数据( 加州房价预测 ) 1.1 流行的各个领域的开放数据集存储库 2 观察大局 2.1 框架问题 2.2 选 ...
- python的knn算法list_机器学习实战学习笔记1——KNN算法
一.KNN算法概述: 1.KNN算法的工作原理是: (1)存在一个训练样本集,并且知道样本集中每一数据与所属分类的对应关系,即每个数据都存在分类标签. (2)若此时输入不带标签的新数据之后,将新数据的 ...
- 机器学习实战学习笔记 一 k-近邻算法
k-近邻算法很简单,这里就不赘述了,主要看一下python实现这个算法的一些细节.下面是书中给出的算法的具体实现. def clssify(inX,dataset,label,k):#计算距离data ...
- 《机器学习实战》 Logistic回归预测患有疝气病的马的存活问题
<机器学习实战> 实现使用Logistic回归来预测患有疝气病的马的存活问题: 结果截图: 完整代码: # -*- coding: utf-8 -*- # @Time : 2021/6/2 ...
- 机器学习入门学习笔记:(2.2)线性回归python程序实现
上一篇博客中,推导了线性回归的公式,这次试着编程来实现它.(机器学习入门学习笔记:(2.1)线性回归理论推导 ) 我们求解线性回归的思路有两个:一个是直接套用上一篇博客最后推导出来的公式:另一 ...
- 机器学习实战学习提纲
机器学习实战学习提纲 学习目录 第一部分 分类 第1章 机器学习基础 第2章 k-近邻算法 第3章 决策树 第4章 基于概率论的分类方法:朴素贝叶斯 第5章 Logistic回归 第6章 支持向量机 ...
- 机器学习入门学习笔记:(3.2)ID3决策树程序实现
前言 之前的博客中介绍了决策树算法的原理并进行了数学推导(机器学习入门学习笔记:(3.1)决策树算法).决策树的原理相对简单,决策树算法有:ID3,C4.5,CART等算法.接下来将对ID3决策树算法 ...
最新文章
- Android中的Touch事件处理流程
- 退出页面删除cookie_Cookie 机制
- twisted 网络通信的简单例子
- 山西铁警演练防暴处突
- SpringMVC -- 梗概--源码--贰--RestFul收参(了解) @PathVariable
- 检查mysql被挂马_对付数据库被挂马有绝招
- 元宇宙持续引发关注,微软计划明年发布相关产品 | 产业区块链发展周报
- 【微信小程序】使用 Cryptojs 解密微信绑定手机号码
- eclipse中如何把中文变成英文?
- oracle 求正数总和,为什么sum时负数不能相加?
- USB U盘Linux mass_storage驱动学习笔记(1)
- QMC5883L磁力计驱动
- 编写python代码获取4k高清壁纸
- 【安卓学习笔记】安卓的事件处理
- Mac在Dock程序坞上添加分割线,分割APP图标
- cma检测认证机构推荐 检测机构的分类
- vue使用e-charts制作专题图(广西省为例)---第一篇
- 设计师需要学习的软件
- Quartus II添加器件库方法
- 算法题记录2:跳格子问题