【机器学习】 逻辑回归算法:原理、精确率、召回率、实例应用(癌症病例预测)

1. 概念理解

逻辑回归,简称LR,它的特点是能够将我们的特征输入集合转化为0和1这两类的概率。一般来说,回归不用在分类问题上,但逻辑回归却能在二分类(即分成两类问题)上表现很好。

逻辑回归本质上是线性回归,只是在特征到结果的映射中加入了一层Sigmod函数映射,即先把特征线形求和,然后使用Sigmoid函数将最为假设函数来概率求解,再进行分类

Sigmoid函数为: S(x)=\frac{1}{1+e^{-x}}

sigmoid函数形如s曲线下侧无限接近0,上侧无限接近1

例如,在进行预测的过程中,预测结果大于0.5的认为是属于一类,小于0.5的我们认为是第二类,进而我们实现二分类。

优点: 适合需要得到一个分类概率的场景,简单,速度快

缺点: 只能用来处理二分类问题,不好处理多分类问题

应用: 是否患病、金融诈骗、是否虚假账号等


2. 精确率和召回率

如下表所示,如果我预测出一个人得了癌症,他的真实值也是得了癌症,那么这种情况称为TP真正例;如果我预测出一个人得了癌症,而他的真实值是没有得癌症,这种情况称为FN假反例。

(1)精确率:预测结果为正例样本中真实为正例的比例(用于表示查得准不准)

        公式为: P=TP/(TP+FP)

        例:100个人中,我预测的结果是有20个人得了癌症。在这20个人中,真实得癌症的只有5个人,没得癌症的有15人。那么精确率为 P=5/(5+15)=0.25

(2)召回率:真实为正例的样本中预测结果为正例的比例(表示查的全,对正样本的区分能力)

        公式为: R=TP/(TP+FN)

        例:现在有20个人得了癌症,在这些人中我检测到有18个人得了癌症,还有2个人没有检测出来,召回率R=18/(18+2)

(3)综合指标:P和R指标有时候会出现的矛盾的情况,这样就需要综合考虑他们,最常见的方法就是F-Measure。

        公式为: F_{1}=\frac{2*P*R}{P+R}

        若F1较大的话,综合性能较好


导入方法: from sklearn.metrics import classification_report
classification_report()  函数参数

y_true1维数组,或标签指示器数组/稀疏矩阵,真实值。

y_pred1维数组,或标签指示器数组/稀疏矩阵,预测值

labels列表,shape = [n_labels],报表中包含的标签索引的可选列表。

target_names字符串列表,与标签匹配的可选显示名称(相同顺序)

sample_weight类似于shape = [n_samples]的数组,可选项,样本权重 

digitsint,输出浮点值的位数


3. 实例应用 -- 癌症病例预测

3.1 Sklearn 实现

逻辑回归方法导入: from sklearn.linear_model import LogisticRegression
参数设置: 参考博客 https://blog.csdn.net/jark_/article/details/78342644

penalty惩罚项,str类型,可选参数为l1和l2,默认为l2。用于指定惩罚项中使用的规范。

        L1规范假设的是模型的参数满足拉普拉斯分布L2假设的模型参数满足高斯分布。所谓的范式就是加上对参数的约束,使得模型不会过拟合,加约束的情况下,理论上应该可以获得泛化能力更强的结果。

dual对偶或原始方法,bool类型,默认为False。对偶方法只用在求解线性多核的L2惩罚项上。当样本数量>样本特征的时候,dual通常设置为False

tol停止求解的标准,float类型,默认为1e-4。就是求解到多少的时停止,认为已经求出最优解。

C正则化系数λ的倒数,float类型,默认为1.0。必须是正浮点型数。像SVM一样,越小的数值表示越强的正则化。

fit_intercept是否存在截距或偏差,bool类型,默认为True

intercept_scaling仅在正则化项为”liblinear”,且fit_intercept设置为True时有用。float类型,默认为1。
class_weight用于标示分类模型中各种类型的权重,可以是一个字典或者’balanced’字符串,默认为不输入,也就是不考虑权重,即为None。

        如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者自己输入各个类型的权重。举个例子,比如对于0,1的二元模型,我们可以定义class_weight={0:0.9,1:0.1},这样类型0的权重为90%,而类型1的权重为10%。如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。当class_weight为balanced时,类权重计算方法如下:n_samples / (n_classes * np.bincount(y))。n_samples为样本数,n_classes为类别数量,np.bincount(y)会输出每个类的样本数,例如y=[1,0,0,1,1],则np.bincount(y)=[2,3]。

random_state随机数种子,int类型,可选参数,默认为无,仅在正则化优化算法为sag,liblinear时有用。

solver优化算法选择参数,只有五个可选参数,即newton-cg, lbfgs, liblinear, sag, saga。默认为liblinear。

solver参数决定了我们对逻辑回归损失函数的优化方法,有四种算法可以选择,分别是:
liblinear使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
lbfgs拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
newton-cg牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
sag即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
saga线性收敛的随机优化算法的的变重。

verbose日志冗长度,int类型。默认为0。就是不输出训练过程,1的时候偶尔输出结果,大于1,对于每个子模型都输出。

warm_start热启动参数,bool类型。默认为False。如果为True,则下一次训练是以追加树的形式进行(重新使用上一次的调用作为初始化)。


3.1 癌症预测

数据集包含10项特征值数据和1项目标数据,字符'?'代表缺失数据,目标中数字2代表癌症良性,4代表癌症恶性。

数据集下载地址:Index of /ml/machine-learning-databases/breast-cancer-wisconsin

names中存放的是每一项数据的列索引名称,pandas导入数据集时会默认将数据第一行当作数据索引名,而原数据没有列索引名,我们需要自定义列 pd.read_csv(文件路径,names=列名称)

#(1)数据获取
import pandas as pd
import numpy as np
# 癌症数据路径
filepath = 'C:\\Users\\admin\\.spyder-py3\\test\\文件处理\\癌症\\breast-cancer-wisconsin.data'
# 癌症的每一项特征名
names = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape','Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin','Normal Nucleoli', 'Mitoses', 'Class']
# breast存放癌症数据,不默认将第一行作为列索引名,自定义列索引名
breast = pd.read_csv(filepath,names=names)
# 查看唯一值,Class这列代表的是否得癌症,使用.unique()函数查看该列有哪些互不相同的值
unique = breast['Class'].unique()  #只有两种情况,是二分类问题,2代表良性,4代表恶性


3.2 数据处理 

首先通过 .info() 函数查看数据中是否存在缺失数据nan和重复数据,本例子中没有。然后对字符'?'进行处理,先将'?'转换成nan值,再使用 .dropna() 函数将nan所在的行删除。完成以后划分特征值和目标值。再划分训练集和测试集,测试集取25%的数据。

#(2)数据处理
breast.info()  #查看是否有缺失值、重复数据
# 该数据集存在字符串类型数据'?'
# 将'?'转换成nan
breast = breast.replace(to_replace='?',value=np.nan)
# 将nan所在的行删除
breast = breast.dropna()# 特征值是除了class列以外的所有数据
features = breast.drop('Class',axis=1)
# 目标值是class这一列
targets = breast['Class']#(3)划分训练集和测试集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(features,targets,test_size=0.25)

3.3 标准化处理

由于单位不一以及数据跨度过大等问题会影响模型准确度,因此对训练数据的和测试数据的特征值进行标准化处理。特征工程的具体方法会在后续章节中介绍,此处先做了解。

#(4)特征工程
# 导入标准化方法
from sklearn.preprocessing import StandardScaler
# 接收标准化方法
transfer = StandardScaler()
# 对训练的特征值x_train提取特征并标准化处理
x_train = transfer.fit_transform(x_train)
# 对测试的特征值x_test标准化处理
x_test = transfer.transform(x_test)

3.4 逻辑回归预测

由于癌症数据中结果只有2和4,良性和恶性,属于二分问题,可以使用逻辑回归方法来预测,此处,为方便各位理解,采用默认参数的逻辑回归方法。其中.fit()函数接收训练模型所需的特征值和目标值,预测函数.predict()接收的是预测所需的特征值,评分法.score()通过真实结果和预测结果计算准确率。计算得到的模型准确率为0.97

#(5)逻辑回归预测
# 导入逻辑回归方法
from sklearn.linear_model import LogisticRegression
# 接收逻辑回归方法
logist = LogisticRegression()
# penalty=l2正则化;tol=0.001损失函数小于多少时停止;C=1惩罚项,越小惩罚力度越小,是岭回归的乘法力度的分之一
# 训练
logist.fit(x_train,y_train)
# 预测
y_predict = logist.predict(x_test)
# 评分法计算准确率
accuracy = logist.score(x_test,y_test)

3.5 准确率和召回率

#(6)准确率和召回率
# 导入
from sklearn.metrics import classification_report
# classification_report()
# 参数(真实值,预测值,labels=None,target_names=None)
# labelsclass列中每一项,如该题的24,给它们取名字
# target_names:命名# 计算准确率和召回率
res = classification_report(y_test,y_predict,labels=[2,4],target_names=['良性','恶性'])
print(res)

precision表示准确率;recall表示召回率;f1-score表示综合指标;support表示预测的人数。本模型的召回率,良性达到0.97,恶性达到0.96;该例子是检测癌症,我们希望能找到所有得癌症的人,即使他不是癌症,也可以做进一步检查,因此我们需要一个召回率高的模型。 


数据集获取:

Index of /ml/machine-learning-databases/breast-cancer-wisconsin

完整代码:
#(1)数据获取
import pandas as pd
import numpy as np
# 癌症数据路径
filepath = 'C:\\Users\\admin\\.spyder-py3\\test\\文件处理\\癌症\\breast-cancer-wisconsin.data'
# 癌症的每一项特征名
names = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape','Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin','Normal Nucleoli', 'Mitoses', 'Class']
# breast存放癌症数据,不默认将第一行作为列索引名,自定义列索引名
breast = pd.read_csv(filepath,names=names)
# 查看唯一值,Class这列代表的是否得癌症,使用.unique()函数查看该列有哪些互不相同的值
unique = breast['Class'].unique()  #只有两种情况,是二分类问题,2代表良性,4代表恶性#(2)数据处理
breast.info()  #查看是否有缺失值、重复数据
# 该数据集存在字符串类型数据'?'
# 将'?'转换成nan
breast = breast.replace(to_replace='?',value=np.nan)
# 将nan所在的行删除
breast = breast.dropna()# 特征值是除了class列以外的所有数据
features = breast.drop('Class',axis=1)
# 目标值是class这一列
targets = breast['Class']#(3)划分训练集和测试集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(features,targets,test_size=0.25)#(4)特征工程
# 导入标准化方法
from sklearn.preprocessing import StandardScaler
# 接收标准化方法
transfer = StandardScaler()
# 对训练的特征值x_train提取特征并标准化处理
x_train = transfer.fit_transform(x_train)
# 对测试的特征值x_test标准化处理
x_test = transfer.transform(x_test)#(5)逻辑回归预测
# 导入逻辑回归方法
from sklearn.linear_model import LogisticRegression
# 接收逻辑回归方法
logist = LogisticRegression()
# penalty=l2正则化;tol=0.001损失函数小于多少时停止;C=1惩罚项,越小惩罚力度越小,是岭回归的乘法力度的分之一
# 训练
logist.fit(x_train,y_train)
# 预测
y_predict = logist.predict(x_test)
# 评分法计算准确率
accuracy = logist.score(x_test,y_test)#(6)准确率和召回率
# 导入
from sklearn.metrics import classification_report
# classification_report()
# 参数(真实值,预测值,labels=None,target_names=None)
# labelsclass列中每一项,如该题的24,给它们取名字
# target_names:命名# 计算准确率和召回率
res = classification_report(y_test,y_predict,labels=[2,4],target_names=['良性','恶性'])
# precision准确率;recall召回率;综合指标F1-score;support:预测的人数
print(res)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/147638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据采集与大数据架构分享

实现场景 要实现亿级数据的长期收集更新,并对采集后的数据进行整理和加工,用于人工智能的训练数据素材集。 数据采集 java支持的爬虫框架还是有很多的,如:webMagic、Spider、Jsoup等添加链接描述 pipeline处理管道 数据并发开发…

2023年【危险化学品经营单位安全管理人员】考试题及危险化学品经营单位安全管理人员模拟试题

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试题是安全生产模拟考试一点通总题库中生成的一套危险化学品经营单位安全管理人员模拟试题,安全生产模拟考试一点通上危险化学品经营单位安全管理人员作业手机同步练习。…

操作系统(五)| 文件系统上 结构 存取方式 文件目录 检索

文章目录 1 文件系统概述2 文件的结构与存取方式2.1 磁盘2.2 文件的物理结构2.2.1 连续结构2.2.2 链式结构2.2.3 索引结构 2.3 文件的存取方式 3 文件目录3.1 基本概念3.2 目录结构单级目录结构多级目录结构 3.3 文件目录检索3.3.1 目录检索文件寻址 3.4 文件目录的实现 1 文件…

从0开始学习JavaScript--JavaScript 字符串与文本内容使用

JavaScript中的字符串和文本内容处理是前端开发中的核心技能之一。本文将深入研究字符串的创建、操作,以及文本内容的获取、修改等操作,并通过丰富的示例代码,帮助读者更全面地了解和应用这些概念。 JavaScript 字符串基础 字符串是JavaScr…

微服务实战系列之Nacos

导语 欢迎来到 “Nacos” 的世界! Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单…

Ubuntu环境下以编译源码的方式安装Vim

目录 1. Ubuntu环境 2. 下载编译vim 2.1 效果截图 3. 配置环境变量 1. Ubuntu环境 Linux chris-166 6.2.0-36-generic #37~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Oct 9 15:34:04 UTC 2 x86_64 x86_64 x86_64 GNU/Linux 2. 下载编译vim // 源码下载 chris_166chris-16…

文件传输客户端 SecureFX mac中文版支持多种协议

SecureFX mac是一款功能强大的文件传输客户端,可在 Mac 操作系统上使用。它由 VanDyke Software 公司开发,旨在为用户提供安全、可靠、高效的文件传输服务。 SecureFX 支持多种协议,包括 SFTP、SCP、FTP、FTP over SSL/TLS 和 HTTP/S。它使用…

联想系列台式机Win11系统改Win7系统BIOS设置步骤

联想最新一代的台式机默认操作系统Win11,采用UEFIGPT启动模式,并且开启了安全启动功能,一般用户不能直接将Win11改成Win7,如果需要更改操作系统,是需要再BIOS菜单中关闭安全启动功能的,并且把启动模式设置成…

2018年五一杯数学建模C题江苏省本科教育质量综合评价解题全过程文档及程序

2019年五一杯数学建模 C题 江苏省本科教育质量综合评价 原题再现 随着中国的改革开放,国家的综合实力不断增强,中国高等教育发展整体已进入世界中上水平。作为一个教育大省,江苏省的本科教育发展在全国名列前茅,而江苏省13个地级…

Django测试环境搭建及ORM查询(创建外键|跨表查询|双下划线查询 )

文章目录 一、表查询数据准备及测试环境搭建模型层前期准备测试环境搭建代码演示 二、ORM操作相关方法三、ORM常见的查询关键字四、ORM底层SQL语句五、双下划线查询数据查询(双下划线)双下划线小训练Django ORM __双下划线细解 六、ORM外键字段创建基础表…

Linux常用命令——bye命令

在线Linux命令查询工具 bye 命令用于中断FTP连线并结束程序。。 补充说明 bye命令在ftp模式下,输入bye即可中断目前的连线作业,并结束ftp的执行。 语法 bye实例 bye在线Linux命令查询工具

蓝眼开源云盘部署全过程(手动安装)

环境概述: 系统-Centos7.4 数据库-MySQL8 云盘系统-Tank4.0.1 前提:操作系统已完成安装,有外部网络。 一.安装数据库 cd到合适的目录进行下载安装操作,期间不要切换出去。 wget https://dev.mysql.com/get/mysql80-community-r…

Linux使用ifconifg命令,没有显示ens33

Linux使用ifconifg命令,没有显示ens33 1.问题2.步骤2.1 查看虚拟机的组件是否启动了2.2 修改网络配置文件 ONBOOT修改为yes2.3 重启网络2.4 修改网络服务配置 3.解决 1.问题 打开虚拟机准备使用xshell连接时发现连接失败,在机器上查看ip发现ens33不现实…

C++项目案例圆和点的关系 (涉及知识点:头文件定义类,cpp文件实现类,类和作用域,linux编译运行c++项目)

一.项目描述 点与圆有三种关系&#xff1a; 点在圆外 点在圆上 点在圆内计算点到圆心的距离就能判断点在圆的哪个地方。二.项目结构 三.include文件 3.1 Circle类的声明 Circle.h // 防止头文件重复包含 #pragma once // #include<iostream> #include "Point.h&…

互联网上门预约洗衣洗鞋店小程序;

拽牛科技干洗店洗鞋店软件&#xff0c;方便快捷&#xff0c;让你轻松洗衣。只需在线预约洗衣洗鞋服务&#xff0c;附近的门店立即上门取送&#xff0c;省心省力。轻松了解品牌线下门店&#xff0c;通过列表形式展示周围门店信息&#xff0c;自动选择最近门店为你服务。简单填写…

SpringSecurity5|12.实现RememberMe 及 实现原理分析

security/day08 这个功能大家还熟悉么&#xff1f;我们在登录网站的时候&#xff0c;除了让你输入用户名和密码&#xff0c;还会有个勾选框&#xff1a; 记住我&#xff01;&#xff01;&#xff01;不是让大家记住我哈。 值得一提的是&#xff0c;Spring Security 也提供了这个…

设计模式篇---装饰模式

文章目录 概念结构实例总结 概念 装饰模式&#xff1a;动态的给一个对象增加一些额外的职责。就扩展功能而言&#xff0c;装饰模式提供了 一种比使用子类更加灵活的替代方案。 装饰模式是一种对象结构型模式&#xff0c;它以对客户透明的方式动态地给一个对象附加上更多的责任…

asp.net学生成绩评估系统VS开发sqlserver数据库web结构c#编程计算机网页项目

一、源码特点 asp.net 学生成绩评估系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 系统运行视频连接&#xff1a;https://www.bilibili.com/video/BV1Wz4y1A7CG/ 二、功能介绍 本系统使用Microsof…

Mysql主从搭建

Mysql主从搭建 1.Mysql下载1.1 查看操作系统2.2 下载mysql安装包 2.Mysql安装2.1 解压2.2 目录重命名2.3 创建data&#xff0c;存储文件2.4 创建用户组2.5 授权用户2.6 配置环境变量2.7 编辑my.cnf2.8 创建相关目录和文件2.9 初始化数据库2.10 复制mysql.server到/etc/init.d/下…

要做好解决方案工程师,这些核心技能是必须要掌握的。

要做好解决方案工程师&#xff0c;以下是一些比较中肯的建议&#xff1a; 1、了解客户需求&#xff1a;解决方案工程师需要深入了解客户的需求和挑战&#xff0c;以便为他们提供定制化的解决方案。通过与客户交流、调研市场趋势等方式&#xff0c;了解客户的业务需求和目标&…