当前位置: 首页 > article >正文

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

文章目录

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

相关文章:

  • C# WPF FontDialog字体对话框,ColorDialog颜色对话框 引用
  • 四:HTTP的诞生:它解决了哪些网络通信难题?
  • [DEBUG] 服务器 CORS 已经允许所有源,仍然有 304 的跨域问题
  • GPT-5 要来了:抢先了解其创新突破
  • git没有识别出大写字母改成小写重命名的文件目录
  • 高效稳定!新加坡服务器托管方案助力企业全球化布局
  • mybatis-plus公共字段自动填充fillStrategy()方法和strictFill()方法
  • Windows环境运行.sh脚本提示找不到wget指令的问题
  • CSS基本概念以及CSS的多种引入方式
  • Python模拟真人鼠标轨迹算法
  • 使用umy-ui 优化带有大量输入框、下拉框的ElementUI el-table
  • Leetcode 1472. 设计浏览器历史记录
  • 开源音频处理项目推荐【持续更新】
  • 《C++设计新思维-泛型编程与设计模式之应用》阅读记录
  • DY按图搜索商品API:解锁电商新趋势
  • LeetCode 257. 二叉树的所有路径,dfs
  • 29. RabbitMQ队列模型
  • 多用户自定义商城小程序源码系统 独立部署 到源代码包以及搭建部署教程
  • 根据源码解析Vue2中对于对象的变化侦测
  • 搭建HAproxy----7层负载均衡集群
  • FDA辅料数据库在线免费查询-药用辅料
  • 灵当CRM multipleUpload.php 文件上传致RCE漏洞复现
  • 双11好物推荐有哪些?五大双十一好货推荐!
  • PHP如何从字符串中删除转义字符
  • 抽奖拼团卷轴模式系统开发小程序源代码解析
  • Flask 第十二课 -- 错误处理