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

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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【开源】基于JAVA的服装店库存管理系统

项目编号: S 052 ,文末获取源码。 \color{red}{项目编号:S052,文末获取源码。} 项目编号:S052,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服…

通过内网穿透技术实现USB设备共享(USB Redirector)逆向共享

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 USB Redirector是一款方便易用的USB设备共享服务应用程序,它提供了共享和访问本地或互联网上的U…

Leetcode—2760.最长奇偶子数组【简单】

2023每日刷题&#xff08;三十一&#xff09; Leetcode—2760.最长奇偶子数组 实现代码 #define MAX(a, b) ((a > b) ? (a): (b)) int longestAlternatingSubarray(int* nums, int numsSize, int threshold){int ans 0;int i 0;while(i < numsSize) {if(nums[i] >…

Nginx的使用

Nginx的使用 1、反向代理一 实现效果&#xff1a;使用 nginx 反向代理&#xff0c;访问 www.123.com 直接跳转到 127.0.0.1:8080 准备工作 : &#xff08;1&#xff09;在 linux 系统安装 tomcat&#xff0c;使用默认端口 8080 &#xff08;2&#xff09;tomcat 安装文件放…

基于Vue+SpringBoot的大学计算机课程管理平台 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…

2023数维杯数学建模C题完整版本

已经完成全部版本&#xff0c;获取请查看文末下方名片 摘要 随着人工智能在多个领域的快速发展&#xff0c;其在文本生成上的应用引起了广泛关注。本研究聚焦于辨识人工智能&#xff08;AI&#xff09;生成文本的基本规则&#xff0c;并探究AI文本的检测及其与人类文本的区分…

BlockCanary

卡顿检测框架,比如Activity Service ,BroadcastResoleve等,或者有延时执行造成卡顿 针对这些情况进行监控 引用: 初始化: 捕获异常结果: 源码: 使用双重锁的单例模式,enable 跳转到通知 主线程的监视器 Loop循环调用消息 根据dispathMessage判断是否造成卡顿,也就是消息的间…

「Verilog学习笔记」使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 当EI10时、U1禁止编码&#xff0c;其输出端Y为000&#xff0c;GS1、EO1均为0。同时EO1使EI00&#xff0c;U0也禁止编码&#xff0c;其输出端及GS0、EO0均为0。由电路…

一张图厘清各大操作系统的发展脉络

Unix&#xff1a;Unix是一种多用户、多任务、支持多种处理器架构的操作系统。它最初由贝尔实验室的Ken Thompson和Dennis Ritchie在20世纪70年代初开发&#xff0c;是第一个广泛使用的通用操作系统。Unix具有可移植性和可扩展性&#xff0c;因此被广泛应用于服务器、工作站和超…

精彩回顾|从架构到实践,AntDB融合型数据库揭秘

当今社会中的信息除了“多”&#xff0c;人们对于“效率”和“速度”的要求也越来越高。譬如&#xff0c;对于很多企业决策者来说&#xff0c;在当前的经济形势下需要尽一切可能降本增效。过去每周看看经营报表的习惯&#xff0c;现在慢慢转变为实时可视化分析企业当前的经营状…

将文件夹变为一个Python模块

__init__.py文件的作用是将文件夹变为一个Python模块&#xff0c;Python中的每个模块的包中&#xff0c;都有__init__.py文件。通常__init__.py文件为空&#xff0c;但是我们还可以为它增加其他的功能。我们在导入一个包时&#xff0c;实际上是导入了它的__init__.py文件。这样…

网络原理-IP/数据链路层协议

一. IP IP协议有两个版本,IPv4和IPv6.我们通常所用的IP协议,若没有特殊说明,默认都是IPv4. IPv4数量2^32,大约43亿左右,而TCP/IP协议规定,每个主机都需要有一个IP地址.对于全世界的计算机来说,这个数量是不够的,所以后来推出了IPv6(长度128位,是IPv4的4倍).但因为目前IPv4还广…

瑞萨RZ/G2L平台 初起动(SD卡启动)

文章目录 一 准备条件1 工具2 硬件3 镜像 二 烧录SD卡启动盘三 写Bootloader1 烧录文件2 启动烧录3 烧录 四 启动设置 一 准备条件 1 工具 ** BalenaEtcher&#xff08;俗称“ Etcher”&#xff09;&#xff0c;是一款快速将系统镜像文件&#xff08; .iso 或 .img 或 .zip或…

Babyk勒索病毒数据集恢复,计算机服务器中了babyk勒索病毒怎么办?

计算机网络技术的不断应用&#xff0c;为企业的生产运营提供了极大便利&#xff0c;网络技术的不断发展也带来了许多网络安全隐患&#xff0c;近期&#xff0c;云天数据恢复中心陆续接到许多企业的求助&#xff0c;企业的计算机服务器遭到了babyk勒索病毒的攻击&#xff0c;导致…

NVIDIA Jetson OTA升级

从 JetPack 4.4 开始,可以使用包管理工具升级到下一个 JetPack 版本。请按照以下步骤执行升级。 1,小版本升级 (如,从 JetPack 4.4 升级到 JetPack 4.4.1) 第一步: sudo apt update 第二步: apt list --upgradable 第三步: sudo apt upgrade更新完之后重新启动即可 …

IgH Master环境搭建

目标&#xff1a;实时linux内核中运行IgH主站&#xff0c;ethercat的用户态工具能看到主站信息。 一、需要的软件 1&#xff0c;vbox虚拟机 https://www.virtualbox.org/&#xff0c;下载VirtualBox 7.0, 备注&#xff1a;windows中不要用wsl开发&#xff0c;wsl运行unbuntu…

【VRTK】【VR开发】【Unity】6-设置interactor和虚拟手

【概述】 本篇先了解什么是interactor,什么是interactable。接着开始实操设置VRTK提供的默认控制器模型,其实就是两个长方体。接下来将长方体更换成更沉浸的带动画动作的虚拟手。最后则是介绍如何自由设置自定义手。 【Interactor和Interactable】 Interactor:互动动作的…

【机器学习】特征工程:特征预处理,归一化、标准化、处理缺失值

特征预处理采用的是特定的统计方法&#xff08;数学方法&#xff09;将数据转化为算法要求的数字 1. 数值型数据 归一化&#xff0c;将原始数据变换到[0,1]之间 标准化&#xff0c;数据转化到均值为0&#xff0c;方差为1的范围内 缺失值&#xff0c;缺失值处理成均值、中…

2023 年 数维杯(C题)国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

问题重述 信息技术和人工智能的迅速发展&#xff0c;特别关注大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;在全球范围内的广泛应用&#xff0c;以ChatGPT为代表。这些模型在机器人导航、语音识别、图像识别、自然语言处理和智能推荐等领域表现…

yolo增加Inner-IoU,一文搞定(Inner-SIoU,Inner-WIoU,Inner-EIoU,Inner-MPDIoU)

论文&#xff1a;https://arxiv.org/pdf/2311.02877.pdf 简介 随着检测器的迅速发展, 边框回归取得了巨大的进步。然而&#xff0c;现有的基于 IoU 的边框回归仍聚焦在通过加入新的损失项来加速收敛&#xff0c;忽视 IoU 损失项其自身的限制。尽管理论上 IoU 损失能够有效描述…