医学数据分析实训 项目五 分类分析--乳腺癌数据分析与诊断

文章目录

    • 项目六:分类分析
        • 实践目的
        • 实践平台
        • 实践内容
          • (一)数据理解及准备
          • (二)模型建立、预测及优化
            • 任务一:使用 KNN算法进行分类预测
            • 任务二:使用贝叶斯分类算法进行分类预测
            • 任务三:使用支持向量机(SVM)算法进行分类预测
            • 任务四:使用逻辑回归算法进行分类预测
            • 任务五:使用决策树算法进行分类预测
    • 乳腺癌数据分析与诊断代码
      • (一)数据理解及准备
      • (二)模型建立、预测及优化
        • 任务一:使用KNN算法进行分类预测
        • 任务二:使用贝叶斯分类算法进行分类预测
        • 任务三:使用支持向量机(SVM)算法进行分类预测
        • 任务四:使用逻辑回归算法进行分类预测
        • 任务五:使用决策树算法进行分类预测

项目六:分类分析

实践目的
  • 理解分类分析算法原理;
  • 熟悉并掌握常用分类算法的使用方法;
  • 熟悉模型性能评估的方法;
  • 掌握模型优化的方法。
实践平台
  • 操作系统:Windows7及以上
  • Python版本:3.8.x及以上
  • 开发环境:PyCharm或Anoconda集成环境
实践内容

数据集文件名为“bc_data.csv”,数据内容来自“威斯康星乳腺癌数据库(Wisconsin Breast Cancer Database)”,该数据集主要记录了569个病例的32个属性。主要属性/字段如下:

  1. ID:病例的 ID;
  2. Diagnosis(诊断结果):M为恶性,B为良性。该数据集共包含357个良性病例和212个恶性病例;
  3. 细胞核的10个特征值,包括 radius(半径)、texture(纹理)、perimeter(周长)、面积(area)、平滑度(smoothness)、紧凑度(compactness)、凹面(concavity)、凹点(concave points)、对称性(symmetry)和分形维数(fractal dimension)。同时,为上述10个特征值分别提供了三种统计量,分别为均值(mean)、标准差(standard error)和最大值(worst or largest)。

本项目实践所涉及的业务为乳腺癌数据分析及自动诊断。将从数据库选取的569条数据分为训练集和测试集,通过分类算法模型预测诊断结果,并与实际诊断结果进行对比分析,从而验证模型的有效性。

(一)数据理解及准备
  1. 导入本案例所需的Python包;
  2. 通过describe()、info()方法、shape属性等对读入的数据对象进行探索性分析。
  3. 结合实际数据情况,对数据集进行适当的预处理;
  4. 提取用于诊断分析的细胞核的特征,并划分训练集和测试集。
(二)模型建立、预测及优化
任务一:使用 KNN算法进行分类预测
  1. 模型训练
    • 通过KNeighborsClassifier()方法进行模型训练;
    • 使用get_params()方法查询模型各参数。
    • 使用模型进行数据预测;
  2. 模型评价
    • 调用scikit-learn.metrics模块中的accuracy_scorer()方法对模型性能进行评价,并输出预测结果的准确率。
  3. 模型优化
    • 找出在1~22范围内最优k值,并使用最优值对模型进行优化;
    • 使用优化后的模型进行数据预测,并再次对模型进行评价;
任务二:使用贝叶斯分类算法进行分类预测
  1. 模型训练
    • 通过GaussianNB()方法建立模型并训练;
    • 使用模型进行数据预测;
  2. 模型评价
    • 调用scikit-learn.metrics模块中的accuracy_score(),precision_score(),recall_score(),f1_score()方法对模型的准确率、精确率、召回率、f1值性能进行评价,并输出评价结果。
  3. 模型优化
    • 调用sklearn.model_selection模块中的GridSearchCV()网格搜索函数,搜索GaussianNB模型中var_smoothing参数的最优值,拟将var_smoothing设置在[1e-7, 1e-8, 1e-9, 1e-10, 1e-11, 1e-12]范围中;
    • 使用最优值对模型进行优化和预测;
    • 再次对模型进行评价,对比评价结果;
任务三:使用支持向量机(SVM)算法进行分类预测
  1. 模型训练
    • 通过svm.SVC()方法建立模型并训练;
    • 使用模型进行数据预测;
  2. 模型评价
    • 调用scikit-learn.metrics模块中的confusion_matrix()、accuracy_scorer()、precision_score(),recall_score(),f1_score()方法分别对模型的混淆矩阵、准确率、精确率、召回率、f1值指标进行评价,并输出评价结果;
    • 使用support_属性找出各类支持向量在训练样本中的索引;
    • 使用support_vectors_属性输出所有的支持向量。
任务四:使用逻辑回归算法进行分类预测
  1. 模型训练
    • 通过LogisticRegression()方法建立模型并训练;
    • 使用模型进行数据预测;
  2. 模型评价
    • 调用scikit-learn.metrics模块中的confusion_matrix()、accuracy_scorer()、precision_score(),recall_score(),f1_score()方法分别对模型的混淆矩阵、准确率、精确率、召回率、f1值指标进行评价,并输出评价结果;
    • 调用GridSearchCV函数确定模型的最佳参数。设置需要最优化的参数的取值范围(如{‘C’:[0.001,0.01,0.1,1,10,20,50,100],‘penalty’:[‘l1’,“l2”]})和交叉验证的折数(如cv=5);
    • 通过best_params_属性返回性能最好的参数组合;
    • 使用调参后的模型进行训练,并输出预测结果;
    • 输出调参后模型的评价指标:混淆矩阵、准确率、精确率、召回率和f1值。
任务五:使用决策树算法进行分类预测
  1. 模型训练
    • 通过DecisionTreeClassifier()方法建立模型并训练;
    • 使用模型进行数据预测,并输出预测结果;
  2. 模型评价
    • 调用scikit-learn.metrics模块中的accuracy_scorer()方法对模型性能进行评价,并输出预测结果的准确率。
    • 使用plot_tree()函数生成决策树图,观察决策树中不同特征出现的深度和频率;

乳腺癌数据分析与诊断代码

(一)数据理解及准备

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV# 读取数据
data = pd.read_csv('bc_data.csv')
# 初步数据检查
print(data.head())  # 查看前几行数据
print(data.describe())  # 查看数据统计信息
print(data.info())  # 查看数据类型和缺失信息# 检查缺失值
print(data.isnull().sum())
from sklearn.impute import SimpleImputer# 如果有缺失值,用均值填充
imputer = SimpleImputer(strategy='mean')
X = data.drop(['id', 'diagnosis'], axis=1)  # 假设 'id' 和 'diagnosis' 列是无关的
X_imputed = imputer.fit_transform(X)# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_imputed)# 提取标签
y = data['diagnosis']# 数据集分割
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

(二)模型建立、预测及优化

任务一:使用KNN算法进行分类预测
# 模型训练
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix# 创建 KNN 模型,n_neighbors 是最近邻的数量
knn = KNeighborsClassifier(n_neighbors=5)# 训练模型
knn.fit(X_train, y_train)# 对测试集进行预测
y_pred = knn.predict(X_test)# 计算并输出模型性能指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, pos_label='M')
recall = recall_score(y_test, y_pred, pos_label='M')
f1 = f1_score(y_test, y_pred, pos_label='M')
cm = confusion_matrix(y_test, y_pred)print(f"混淆矩阵:\n{cm}")
print(f"准确率: {accuracy}, 精确率: {precision}, 召回率: {recall}, F1 值: {f1}")

混淆矩阵:
[[68 3]
[ 3 40]]
准确率: 0.9473684210526315, 精确率: 0.9302325581395349, 召回率: 0.9302325581395349, F1 值: 0.9302325581395349

# 模型优化
best_k = 1
best_accuracy = 0# 寻找最佳的 k 值
for k in range(1, 23):knn = KNeighborsClassifier(n_neighbors=k)knn.fit(X_train, y_train)y_pred = knn.predict(X_test)accuracy = accuracy_score(y_test, y_pred)if accuracy > best_accuracy:best_k = kbest_accuracy = accuracyprint(f"最佳 k 值: {best_k}, 对应的准确率: {best_accuracy}")# 使用最佳 k 值重新训练模型
knn_best = KNeighborsClassifier(n_neighbors=best_k)
knn_best.fit(X_train, y_train)
y_pred_best = knn_best.predict(X_test)# 计算并输出优化后的模型性能指标
accuracy_best = accuracy_score(y_test, y_pred_best)
precision_best = precision_score(y_test, y_pred_best, pos_label='M')
recall_best = recall_score(y_test, y_pred_best, pos_label='M')
f1_best = f1_score(y_test, y_pred_best, pos_label='M')
cm_best = confusion_matrix(y_test, y_pred_best)print(f"优化后 - 混淆矩阵:\n{cm_best}")
print(f"优化后的准确率: {accuracy_best}, 精确率: {precision_best}, 召回率: {recall_best}, F1 值: {f1_best}")

最佳 k 值: 9, 对应的准确率: 0.9649122807017544
优化后 - 混淆矩阵:
[[69 2]
[ 2 41]]
优化后的准确率: 0.9649122807017544, 精确率: 0.9534883720930233, 召回率: 0.9534883720930233, F1 值: 0.9534883720930233

任务二:使用贝叶斯分类算法进行分类预测
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score# 创建高斯朴素贝叶斯模型
nb = GaussianNB()# 训练模型
nb.fit(X_train, y_train)# 对测试集进行预测
y_pred = nb.predict(X_test)# 计算并输出模型性能指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, pos_label='M')
recall = recall_score(y_test, y_pred, pos_label='M')
f1 = f1_score(y_test, y_pred, pos_label='M')print(f"准确率: {accuracy}, 精确率: {precision}, 召回率: {recall}, F1 值: {f1}")

准确率: 0.9649122807017544, 精确率: 0.975609756097561, 召回率: 0.9302325581395349, F1 值: 0.9523809523809523

# 模型优化:from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score# 定义参数搜索空间
params = {'var_smoothing': [1e-7, 1e-8, 1e-9, 1e-10, 1e-11, 1e-12]}# 使用 GridSearchCV 进行参数优化
gs = GridSearchCV(GaussianNB(), params, cv=5, scoring='accuracy', verbose=1)
gs.fit(X_train, y_train)# 输出最佳参数
print(f"最佳参数: {gs.best_params_}")# 使用最佳模型进行预测
y_pred_optimized = gs.predict(X_test)# 计算并输出优化后的模型性能指标
accuracy_optimized = accuracy_score(y_test, y_pred_optimized)
precision_optimized = precision_score(y_test, y_pred_optimized, pos_label='M')
recall_optimized = recall_score(y_test, y_pred_optimized, pos_label='M')
f1_optimized = f1_score(y_test, y_pred_optimized, pos_label='M')print(f"优化后的准确率: {accuracy_optimized}, 精确率: {precision_optimized}, 召回率: {recall_optimized}, F1 值: {f1_optimized}")

最佳参数: {‘var_smoothing’: 1e-07}
优化后的准确率: 0.9649122807017544, 精确率: 0.975609756097561, 召回率: 0.9302325581395349, F1 值: 0.9523809523809523

任务三:使用支持向量机(SVM)算法进行分类预测
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn import svm
# 模型训练
svc = svm.SVC()
svc.fit(X_train, y_train)
y_pred = svc.predict(X_test)cm = confusion_matrix(y_test, y_pred)
print(f"混淆矩阵:\n{cm}")# 计算准确率
accuracy = accuracy_score(y_test, y_pred)# 计算精确率、召回率和 F1 值,指定 pos_label 为 'M'
precision = precision_score(y_test, y_pred, pos_label='M')
recall = recall_score(y_test, y_pred, pos_label='M')
f1 = f1_score(y_test, y_pred, pos_label='M')print(f"准确率: {accuracy}, 精确率: {precision}, 召回率: {recall}, F1 值: {f1}")# 输出支持向量
support_vectors = svc.support_vectors_
print(f"支持向量: {support_vectors}")

[ 2 41]]
准确率: 0.9736842105263158, 精确率: 0.9761904761904762, 召回率: 0.9534883720930233, F1 值: 0.9647058823529412
在这里插入图片描述

任务四:使用逻辑回归算法进行分类预测
# 模型训练
from sklearn.linear_model import LogisticRegressionlr = LogisticRegression(max_iter=1000)
lr.fit(X_train, y_train)
y_pred = lr.predict(X_test)cm = confusion_matrix(y_test, y_pred)
print(f"混淆矩阵:\n{cm}")
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)# 计算精确率、召回率和 F1 值,指定 pos_label 为 'M'
precision = precision_score(y_test, y_pred, pos_label='M')
recall = recall_score(y_test, y_pred, pos_label='M')
f1 = f1_score(y_test, y_pred, pos_label='M')print(f"准确率: {accuracy}, 精确率: {precision}, 召回率: {recall}, F1 值: {f1}")

混淆矩阵:
[[70 1]
[ 2 41]]
准确率: 0.9736842105263158, 精确率: 0.9761904761904762, 召回率: 0.9534883720930233, F1 值: 0.9647058823529412

# 模型优化
# 定义参数搜索空间
params = {'C': [0.001, 0.01, 0.1, 1, 10, 20, 50, 100],'penalty': ['l1', 'l2'],'solver': ['liblinear']  # 'liblinear' 支持 'l1' 和 'l2' 正则化
}# 使用 GridSearchCV 进行参数优化
gs = GridSearchCV(LogisticRegression(max_iter=1000), params, cv=5)
gs.fit(X_train, y_train)# 输出最佳参数
print(f"最佳参数: {gs.best_params_}")# 使用最佳模型进行预测
y_pred = gs.predict(X_test)# 计算混淆矩阵
cm = confusion_matrix(y_test, y_pred)# 计算性能指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, pos_label='M')
recall = recall_score(y_test, y_pred, pos_label='M')
f1 = f1_score(y_test, y_pred, pos_label='M')# 输出结果
print(f"混淆矩阵:\n{cm}")
print(f"优化后的准确率: {accuracy}, 精确率: {precision}, 召回率: {recall}, F1 值: {f1}")

最佳参数: {‘C’: 0.1, ‘penalty’: ‘l2’, ‘solver’: ‘liblinear’}
混淆矩阵:
[[71 0]
[ 1 42]]
优化后的准确率: 0.9912280701754386, 精确率: 1.0, 召回率: 0.9767441860465116, F1 值: 0.9882352941176471

任务五:使用决策树算法进行分类预测
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score# 构建决策树分类器
dt = DecisionTreeClassifier()
dt.fit(X_train, y_train)
y_pred = dt.predict(X_test)# 计算并输出模型准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy}")feature_names = data.drop('diagnosis', axis=1).columns# 绘制决策树
plt.figure(figsize=(20, 10))
plot_tree(dt,feature_names=feature_names,  # 这里传入你的特征名称class_names=["M", "B"],  # 类标签名称filled=True
)
plt.show()

准确率: 0.9298245614035088

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

星云股份战略运营副总裁袁智勇︱如何培养“能打胜仗”的项目经理

全国项目经理专业人士年度盛会 福建星云电子股份有限公司总裁办战略运营副总裁袁智勇先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾,演讲议题为“如何培养“能打胜仗”的项目经理”。大会将于10月26-27日在北京举办&…

56.【C语言】字符函数和字符串函数(strtok函数)(未完)

目录 12.strtok函数(较复杂) *简单使用 总结: *优化 12.strtok函数(较复杂) *简单使用 strtok:string into tokens cplusplus的介绍 点我跳转 翻译: 函数 strtok char * strtok ( char * str, const char * delimiters ); 总结: delimiters参数指向一个字符串&#xff0…

波士顿机器人滑环的技术特点与应用前景

机器人滑环在现代自动化和机器人技术中扮演着至关重要的角色。作为一种关键的机械组件,滑环允许机器人在旋转和移动的过程中保持稳定的电信号和数据传输。波士顿机器人滑环作为行业中的领先产品,具有多项独特的技术特点和优势,为各种机器人系…

Packet Tracer - 配置编号的标准 IPv4 ACL(两篇)

Packet Tracer - 配置编号的标准 IPv4 ACL(第一篇) 目标 第 1 部分:计划 ACL 实施 第 2 部分:配置、应用和验证标准 ACL 背景/场景 标准访问控制列表 (ACL) 为路由器 配置脚本,基于源地址控制路由器 是允许还是拒绝数据包。本练习的主要内…

如何学习React?一些学习React的网站

React相关网站集锦 React入门 React 官网:https://react.zcopy.site/docs/getting-started.html 深入React原理 1. 图解React:https://7kms.github.io/react-illustration-series/main/bootstrap 帮助我们快速学习React Fiber架构相关知识,主…

STM32—MPU6050

1.MPU6050简介 MPU6050是一个6轴姿态传感器可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景3轴加速度计(Accelerometer:测量X、Y、Z轴的加速度3…

智源推出下一代检索增强大模型框架MemoRAG

北京智源人工智能研究院与中国人民大学高瓴人工智能学院联合发布了一款创新的人工智能模型框架——MemoRAG。该框架基于长期记忆,旨在推动检索增强生成(RAG)技术的发展,使其能够处理更复杂的任务,而不仅限于简单的问答…

Vue3 : Pinia的性质与作用

目录 一.性质 二.作用 三.Pinia 的核心概念 四.使用 1.count.ts 2.count.vue Vue 3 中 Pinia 是一个专为 Vue 3 设计的状态管理库,它旨在提供一种简单、直观的方式来管理应用的状态。 一.性质 1.集成性:Pinia 是 Vue 3 官方推荐的状态管理库&…

全志T507-H国产平台Ubuntu系统正式发布,让您的应用开发更便捷!

为了满足广大工业用户的需求,创龙科技针对全志T507-H工业平台进行了Ubuntu系统适配,开发环境如下: Ubuntu:Ubuntu18.04.4 U-Boot:U-Boot-2018.05 Kernel:Linux-4.9.170、Linux-RT-4.9.170 LinuxSDK&…

【AprilTag】视觉定位实战 | 使用 ROS 驱动的 USB 摄像头进行相机标定与 AprilTag 识别

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

Mapsui:一个 .NET 开源的地图组件库

前言 今天大姚给大家分享一个.NET开源(MIT License)、免费、同时支持多平台框架(MAUI、WPF、Avalonia、Uno、Blazor、WinUI、Eto、.NET Android 和 .NET iOS)地图组件库:Mapsui。 项目源代码 支持的UI框架的NuGet包 创…

文章排名优化@大众点评代发灰色词是什么软件

文章排名优化大众点评代发灰色词是什么软件 如何优化灰色词百度排名推广(灰色词推广代发/代做)#百度推广#关键词排名#灰色词排名 欢迎来到百收网SEO搜索群,我是狂潮老师,这一节我们来讲一下 on page SEO是什么?大众点…

【JAVA入门】Day46 - Commons-io

【JAVA入门】Day46 - Commons-io 文章目录 【JAVA入门】Day46 - Commons-io一、Commons-io 的常见方法 Commons-io 其实是一个工具包,它里面包含一系列有关IO操作的方法。它的作用就是来提高IO流的开发效率。 Commons 工具包中包含了很多很多有用的工具类&a…

【专题】2024中国生物医药出海现状与趋势蓝皮书报告合集PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p37719 出海已成为中国医药产业实现提速扩容的重要途径。目前,中国医药产业发展态势良好,创新能力不断增强,然而也面临着医保政策改革和带量集采带来的压力。政府积极出台多项政策支持医药企业出海…

【新手上路】衡石分析平台使用手册-租户管理

租户管理​ 衡石系统支持服务一个平台方和多个企业客户的租户模式,平台方管理租户,为租户提供数据,租户在系统内进行数据分析。 衡石系统增加工作空间的设计,在平台方和租户之间提供单向的传递通道,平台厂商可以轻松…

nature communications |多层次蛋白质组分析揭示弥漫型和肠型胃癌之间的分子多样性

文章信息 发表期刊:nature communications 发表日期:2023年2月14日 影响因子:14.7 研究背景 胃癌是世界上主要的癌症类型之一。弥漫型胃癌(DGC)和肠型胃癌(IGC)是胃癌(GC)的主要组织学类型,DGC呈分散的细胞组织,黏…

Vue3使用shapefile读取矢量数据,以数组形式返回坐标点

npm安装: npm install shapefile --save-dev 源码: <script setup> import { ElMessage } from element-plus; import { ref } from vue; // 引入 ref import * as shapefile from "shapefile";// 使用 ref 创建一个引用 const uploadRef ref(null);// 解析…

怎么能让电脑屏幕显示多个监控画面?电脑监控如何多画面显示?

想象一下&#xff0c;你的电脑屏幕变成了一个“指挥中心”&#xff0c;上面同时显示多个监控画面&#xff0c;每个角落都有重要的信息。无论是监控员工的工作情况、实时查看服务器状态&#xff0c;还是观看监控视频&#xff0c;一切尽在掌握中。这不是科幻电影里的场景&#xf…

使用IDA Pro动态调试Android APP

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 关于 android_server android_server 是 IDA Pro 在 Android 设备上运行的一个调试服务器。 通过在 Android 设备上运行android_server&#xff0c;IDA Pro …

最新简洁大方的自动发卡网站源码/鲸发卡v11.61系统源码/修复版

源码简介&#xff1a; 最新简洁大方的自动发卡网站源码&#xff0c;它就是鲸发卡v11.61系统源码&#xff0c;它是修复版。 说到鲸发卡系统&#xff0c;鲸发卡系统在发卡圈很多人都知道的&#xff0c;它是市面最好发卡系统之一&#xff0c;操作起来简单得很&#xff0c;界面也…