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

文章目录

项目六:分类分析

实践目的
  • 理解分类分析算法原理;
  • 熟悉并掌握常用分类算法的使用方法;
  • 熟悉模型性能评估的方法;
  • 掌握模型优化的方法。
实践平台
  • 操作系统: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()函数生成决策树图,观察决策树中不同特征出现的深度和频率;

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

(一)数据理解及准备

python 复制代码
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())
python 复制代码
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算法进行分类预测
python 复制代码
# 模型训练
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

python 复制代码
# 模型优化
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

任务二:使用贝叶斯分类算法进行分类预测
python 复制代码
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

python 复制代码
# 模型优化: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)算法进行分类预测
python 复制代码
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

任务四:使用逻辑回归算法进行分类预测
python 复制代码
# 模型训练
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

python 复制代码
# 模型优化
# 定义参数搜索空间
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

任务五:使用决策树算法进行分类预测
python 复制代码
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

相关推荐
xuehaisj1 小时前
论文内容分类与检测系统源码分享
人工智能·分类·数据挖掘
xuehaisj5 小时前
食品检测与分类系统源码分享
人工智能·分类·数据挖掘
惟长堤一痕6 小时前
医学数据分析实训 项目九 糖尿病风险预测
机器学习·数据分析
will_guofeng6 小时前
数据分析-螺旋环状气泡图
数据挖掘·数据分析
惟长堤一痕11 小时前
医学数据分析实训 项目七 集成学习--空气质量指标--天气质量分析和预测
学习·数据挖掘·数据分析
YoLo-811 小时前
《机器学习》周志华-CH7(贝叶斯分类)
人工智能·机器学习·分类
Kenneth風车11 小时前
【机器学习(七)】分类和回归任务-K-近邻 (KNN)算法-Sentosa_DSML社区版
人工智能·算法·低代码·机器学习·分类·数据分析·回归
lizi8888819 小时前
足球大小球及亚盘数据分析与机器学习实战详解:从数据清洗到模型优化
java·人工智能·机器学习·数据挖掘·数据分析
~在杰难逃~20 小时前
关于订单信息的Excel数据分析报告
笔记·数据分析·excel·数据分析报告
python15620 小时前
Python Numpy布尔数组在数据分析中的应用
python·数据分析·numpy