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

news2024/11/15 22:33:56

文章目录

    • 项目六:分类分析
        • 实践目的
        • 实践平台
        • 实践内容
          • (一)数据理解及准备
          • (二)模型建立、预测及优化
            • 任务一:使用 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 = k
        best_accuracy = accuracy

print(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 LogisticRegression

lr = 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.coloradmin.cn/o/2143866.html

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

相关文章

Linux基础3-基础工具4(git,冯诺依曼计算机体系结构)

上篇文章:Linux基础3-基础工具3(make,makefile,gdb详解)-CSDN博客 本章重点: 1. git简易使用 2. 冯诺依曼计算机体系结构介绍 一. git使用 1.1 什么是git? git是用于管理代码版本的一种工具,我们在如GitHub&#xf…

C++ | (二)类与对象(上)

燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的假期为什么一去不复返呢? 目录 一、初识类 1.1 类的定义 1.2 C中…

面试真题-TCP的三次握手

TCP的基础知识 TCP头部 面试题:TCP的头部是多大? TCP(传输控制协议)的头部通常是固定的20个字节长,但是根据TCP选项(Options)的不同,这个长度可以扩展。TCP头部包含了许多关键的字…

depcheck 检查项目中依赖的使用情况 避免幽灵依赖的产生

depcheck 检查项目中依赖的使用情况 避免幽灵依赖的产生 什么是幽灵依赖 (幻影依赖) 形成原因 幽灵依赖是指node_modules中存在 而package.json中没有声明过的依赖 但却能够在项目的依赖树中找到并使用的模块 Node.js 的模块解析规则: Node.js 采用了一种非传统的模…

C++速通LeetCode简单第20题-多数元素

方法一&#xff1a;暴力解法&#xff0c;放multiset中排序&#xff0c;然后依次count统计&#xff0c;不满足条件的值erase清除。 class Solution { public:int majorityElement(vector<int>& nums) {int ans 0;multiset<int> s;for(int i 0;i < nums.s…

「iOS」viewController的生命周期

iOS学习 ViewController生命周期有关方法案例注意 ViewController生命周期有关方法 init - 初始化程序&#xff1b;loadView - 在UIViewController对象的view被访问且为空的时候调用&#xff1b;viewDidLoad - 视图加载完成后调用&#xff1b;viewWillAppear - UIViewControll…

给大模型技术从业者的建议,入门转行必看!!

01—大模型技术学习建议‍‍‍ 这个关于学习大模型技术的建议&#xff0c;也可以说是一个学习技术的方法论。 首先大家要明白一点——(任何)技术都是一个更偏向于实践的东西&#xff0c;具体来说就是学习技术实践要大于理论&#xff0c;要以实践为主理论为辅&#xff0c;而不…

换个手机IP地址是不是不一样?

在当今这个信息爆炸的时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。而IP地址&#xff0c;作为手机连接网络的桥梁&#xff0c;也时常引起我们的关注。你是否曾经好奇&#xff0c;换个手机&#xff0c;IP地址会不会也跟着变呢&#xff1f;本文将深入探讨这个问题&a…

Android15之编译Cuttlefish模拟器(二百三十一)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

直流斩波电路

目录 1. 降压斩波电路&#xff08;Buck Converter&#xff09; 2. 升压斩波电路&#xff08;Boost Converter&#xff09; 3. 升降压斩波电路&#xff08;Buck-Boost Converter&#xff09; 4. Cuk斩波电路&#xff08;Cuk Converter&#xff09; 直流斩波电路是一种将直流…

Unity3D下如何播放RTSP流?

技术背景 在Unity3D中直接播放RTSP&#xff08;Real Time Streaming Protocol&#xff09;流并不直接支持&#xff0c;因为Unity的内置多媒体组件&#xff08;如AudioSource和VideoPlayer&#xff09;主要设计用于处理本地文件或HTTP流&#xff0c;而不直接支持RTSP。所以&…

上海人工智能实验室开源视频生成模型Vchitect 2.0 可生成20秒高清视频

上海人工智能实验室日前推出的Vchitect2.0视频生成模型正在悄然改变视频创作的游戏规则。这款尖端AI工具不仅简化了视频制作流程&#xff0c;还为创作者提供了前所未有的灵活性和高质量输出。 Vchitect2.0的核心优势在于其强大的生成能力和高度的可定制性。用户只需输入文字描…

用Matlab求解绘制2D散点(x y)数据的最小外接圆、沿轴外接矩形

用Matlab求解绘制2D散点&#xff08;x y&#xff09;数据的最小外接圆、沿轴外接矩形 0 引言1 原理概述即代码实现1.1 最小外接圆1.2 沿轴外接矩形 2 完整代码3 结语 0 引言 本篇简单介绍下散点数据最小外接圆、沿轴外接矩形的简单原理和matlab实现过程。 1 原理概述即代码实现…

C语言-数据结构 有向图拓扑排序TopologicalSort(邻接表存储)

拓扑排序算法的实现还是比较简单的&#xff0c;我们需要用到一个顺序栈辅助&#xff0c;采用邻接表进行存储&#xff0c;顶点结点存储入度、顶点信息、指向邻接结点的指针&#xff0c;算法过程是&#xff1a;我们先将入度为0的顶点入栈&#xff0c;然后弹出栈顶结点&#xff0c…

使用CUBE_MX使用I2C通信,实现对EEPROM的读写

一、使用CUBE_MX配置 1.配置I2C 2.配置USART1 3.重中之重(在KEIL5打开串口使用的库) 二、KEIL5配置 #include "main.h" #include "i2c.h" #include "gpio.h" #include "usart.h"#include <stdio.h>void SystemClock_Config(vo…

flash_attention简要笔记

优化效果 原来&#xff0c;attention部分的计算量和中间激活占用显存的复杂度都是 O ( N 2 ) O(N^2) O(N2) 计算量部分原来QK矩阵乘和attn_scoreV矩阵乘的计算量&#xff0c;复杂度都是 O ( N 2 ) O(N^2) O(N2)&#xff1b;中间激活因为中间有一个attn_score&#xff0c;所以复…

如何接口对接发送视频短信

随着移动通信技术的飞速发展&#xff0c;视频短信作为一种创新的多媒体信息传递方式&#xff0c;正逐渐成为众多行业不可或缺的沟通工具。它不仅丰富了信息传递的形式&#xff0c;还显著提高了信息接收者的参与度和满意度。 支持免费对接试用乐讯通PaaS平台 找好用的短信平台,选…

数据结构:(OJ141)环形列表

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;…

探索iPhone一键删除重复照片的方法

在iPhone用户的生活中&#xff0c;存在一个不变的真理&#xff1a;不管你的照片库有多干净&#xff0c;重复的照片总会找到一种方法悄无声息地积累起来&#xff0c;就像袜子在洗衣机中神秘消失那样不可思议。而当你最终决定处理这些重复照片时&#xff0c;你可能已经面临着一个…

Electron 图标修改

目录 1. 图片基本要求 2. 在main.js中配置icon 位置 ​3. 在package.json 中配置icon 位置 4. 问题&#xff1a;左上角图片 开发环境下显示&#xff0c;生产环境下不显示 1. 图片基本要求 图片格式为ico&#xff0c;图片像素像素为256*256&#xff1b; 将ico文件放在pub…