基于逻辑回归构建肿瘤预测模型

news/2025/2/22 2:53:01/

使用逻辑回归构建肿瘤预测模型

描述

乳腺癌数据集包括569个样本,每个样本有30个特征值(病灶特征数据),每个样本都属于恶性(0)或良性(1)两个类别之一,要求使用逻辑回归(LR)算法建立预测模型,实现准确预测新的病灶数据的类型(恶性或良性)。

样本特征数据为病灶影像的测量数据,部分特征如下:

请添加图片描述

本任务的主要实践内容:

1、 逻辑回归-肿瘤预测模型的构建、预测及评估

2、 逻辑回归-鸢尾花(Iris)分类模型的实现

源码下载

环境

  • 操作系统:Windows 10、Ubuntu18.04

  • 工具软件:Anaconda3 2019、Python3.7

  • 硬件环境:无特殊要求

  • 依赖库列表

    matplotlib	3.3.4
    numpy 			1.19.5
    pandas			1.1.5
    scikit-learn	0.24.2
    mglearn        0.1.9
    

分析

逻辑回归(LogisticRegression)虽然名字中带有“回归”,却是一个经典的分类算法, 本任务通过完成乳腺癌肿瘤预测(通过病灶特征数据预测肿瘤为恶性还是良性,属于监督学习中二分类问题),熟练掌握逻辑回归的原理及编程应用。

本任务涉及以下几个环节:

a)加载、查看乳腺癌数据集

b)数据集拆分

d)构建模型、评估并优化模型、

e)在测试集上预测结果,并输出预测概率

f)利用逻辑回归实现鸢尾花分类(多分类)

实施

1、加载、查看乳腺癌数据集

from sklearn.datasets import load_breast_cancercancer = load_breast_cancer() # 加载cancer数据集
print(cancer.keys()) # 查看数据有哪些keys(与鸢尾花数据集相同)

输出结果:

dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])
print('Shape of data:', cancer.data.shape) # 数据集尺寸

输出结果:

Shape of data: (569, 30)
print(cancer.target_names) # 标签名称(malingant-恶性,begin-良性)
print(cancer.target) # 标签数据(569个0或1, 0-恶性,1-良性)

输出结果:

['malignant' 'benign']
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 01 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 11 1 1 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 11 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 01 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 11 0 1 1 1 1 1 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 00 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 11 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 11 1 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 00 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 11 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 10 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 11 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 01 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 0 0 0 0 0 0 1]

2、拆分数据集

from sklearn.model_selection import train_test_split# 随机拆分数据集
# X_train 训练集
# X_test 测试集
# y_train 训练集标签(即训练集数据对应的类别)
# y_test 测试集标签(即测试集数据对应的类别)
# test_size 测试集比例
# random_state 随机状态(设置为固定值可以锁定拆分结果,用于数据复现)
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.25, random_state=0)
# 查看拆分情况
print(X_train.shape, X_test.shape)
print(y_train.shape, y_test.shape)

输出结果:

(426, 30) (143, 30)
(426,) (143,)

3、构建模型、评估

from sklearn.linear_model import LogisticRegression# 采用默认参数创建LR模型,并拟合训练数据
model = LogisticRegression().fit(X_train, y_train)# 评估模型在训练集和测试集上的成绩
score_train = model.score(X_train, y_train)
score_test = model.score(X_test, y_test)
print(score_train, score_test)

输出结果:

0.9553990610328639 0.958041958041958

4、在测试集上预测结果,并输出预测概率

这里我们预测测试集中的前三个样本,输出预测结果(0-恶性,1-良性),并输出0和1对应的概率值。

# 预测结果(0-恶性,1-良性)
y_pred = model.predict(X_test[:3]) # 预测测试集前三个样本
print(y_pred)# 输出预测的概率值(0和1的概率值)
y_pred_proba = model.predict_proba(X_test[:3]) # 预测测试集前三个样本
print(y_pred_proba)

输出结果:

[0 1 1]
[[0.99284545 0.00715455][0.0332907  0.9667093 ][0.00271258 0.99728742]] # 该样本属于0的概率为0.002,属于1的概率为0.997,所以判断为类别1

强调:逻辑回归算法计算样本属于每个类别的概率值(即可能性),取概率值最大的类别作为预测结果。

5、扩展练习——基于逻辑回归实现鸢尾花分类(多分类问题)

from sklearn.datasets import load_iris # 加载Iris数据集
iris = load_iris()# 数据集拆分
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.25, random_state=0)
# 创建LR模型
# model = LogisticRegression().fit(X_train, y_train) # 0.9821428571428571 0.9736842105263158
# 优化模型参数,提升模型性能(C正则化系数,penalty正则化类型l1 or l2)
model = LogisticRegression(C=10, penalty='l2').fit(X_train, y_train)   # 0.9910714285714286 0.9736842105263158# 评估模型成绩
score_train = model.score(X_train, y_train)
score_test = model.score(X_test, y_test)
print(score_train, score_test)# 预测鸢尾花种类并与实际种类做对比(前十个样本)
y_pred = model.predict(X_test)
print('预测类别:' ,y_pred[:10])
print('实际类别:' ,y_test[:10])

输出结果:

0.9821428571428571 0.9736842105263158
预测类别: [2 1 0 2 0 2 0 1 1 1]
实际类别: [2 1 0 2 0 2 0 1 1 1]

优化参数,提升模型性能:

model = LogisticRegression(C=10, penalty='l2').fit(X_train, y_train) # 0.9910714285714286 0.9736842105263158

优化后结果为:

0.9910714285714286 0.9736842105263158
预测类别: [2 1 0 2 0 2 0 1 1 1]
实际类别: [2 1 0 2 0 2 0 1 1 1]

http://www.ppmy.cn/news/41835.html

相关文章

async/await 函数到底要不要加 try catch ?

前言 写异步函数的时候,promise 和 async 两种方案都非常常见,甚至同一个项目里,不同的开发人员都使用不同的习惯, 不过关于两者的比较不是本文关注的重点,只总结为一句话:“async 是异步编程的终极解决方案”。 当使…

Linux 下编译 thrift

thrift编译需要依赖 openssl,首先按照文章《Openssl在Linux下编译/交叉编译》编译openssl。 网上有文章说thrift编译还需要依赖Boost,libevent,但是我发现不依赖这两个库也能把thrift编译出来。在 https://github.com/apache/thrift/releases…

List接口中的ArrayList与LinkedList

ArrayList ArrayList的继承实现关系图 ArrayList 底层就是⼀个 Object[] 数组,当实例化ArrayList时没有指定数组容量大小,、第⼀次添加元素(调⽤ add() ⽅法)时会初始化为⼀个⻓度为 10 的数组(即默认初始化容量为 1…

Golang编译报错 ‘invalid char’

现象 最近在新电脑安装go环境,发现 golang 包名如果有汉字就不能编译运行。 具体来讲,就是 go mod tidy 报错 ‘invalid char’ 但是,我在以前的电脑上运行 go mod tidy 没有问题 原因 我对比了 go sdk 版本,旧电脑用 go 1.13…

国产化复旦微电子 FMQL45T900 替代Xilinx ZYNQ ARM+FPGA 7045方案(评论区有联系方式)

FM4550国产化开发板 功能接口 - - 系统框图 - - 对应参数 - 1.主要参数 系统1: FPGA型号:FMQL45T900 PS内核:四核ARM Cortex-A7,主频800MHz PS端内存:1GB DDR3,数据速率1066Mbps,32bit PL端内存&…

通过实战探究 GraalVM 静态编译

通过实战探究 GraalVM 静态编译GraalVM 是什么什么是 Java 静态编译GraalVM 静态编译优点GraalVM 静态编译缺点Substrate VM 是什么native image 运行时的内存管理Serial GCG1 GCEpsilon GC预执行目标应用程序静态编译目标应用流程命令行模式配置文件模式Maven 模式Gradle 模式…

CefSharp.WinForms 112.2.70最新版体验

一、准备 下载最新包及依赖包(对应.NET4.5.2,后续版本可能4.6.2+)到packages中,本地升级更快 NuGet Gallery | CefSharp.WinForms 112.2.70 NuGet Gallery | CefSharp.Common 112.2.70 NuGet Gallery | cef.redist.x64 112.2.7 NuGet Gallery | cef.redist.x86 112.2.…

解决debian升级后没有声音

快速方案: apt update apt install firmware-sof-signed firmware-misc-nonfree #安装两个驱动 ## 然后添加一个内核参数,inteldsp.conf这个文件原来是不存在的,保险起见还是附加写入。 echo "options snd-intel-dspcfg dsp_driver1&qu…