基于随机森林的乳腺癌肿瘤分类实验

一、威斯康星州乳腺癌数据集介绍

威斯康星州乳腺癌数据集是scikit-learn库中的一个常用内置数据集,主要用于分类任务。该数据集包含了从乳腺癌患者收集的肿瘤特征的测量值,以及相应的良性(benign)或恶性(malignant)标签。

数据集简介

  • 数据集名称: 威斯康星州乳腺癌数据集(Breast Cancer Wisconsin Dataset)
  • 数据集来源: 由威斯康星州医院的Dr. William H. Wolberg收集
  • 特征: 数据集包含30个数值型特征,这些特征描述了乳腺肿瘤的不同测量值,如肿瘤的半径、纹理、对称性等
  • 目标变量: 二分类,代表肿瘤的良性(benign)或恶性(malignant)状态
  • 样本数量: 569个样本,其中良性样本357个,恶性样本212个

加载数据集

在使用sklearn库时,可以通过调用datasets.load_breast_cancer()函数加载威斯康星州乳腺癌数据集。加载后的数据集包含两个主要部分:datatargetdata存储特征数据,target存储目标变量(标签)数据。

二、参考代码

安装sklearn

python 复制代码
pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir

需调参代码

python 复制代码
# ===================== 1. 导入需要的工具库 =====================
# 加载内置数据集
from sklearn.datasets import load_breast_cancer
# 用于划分训练集和测试集
from sklearn.model_selection import train_test_split
# 随机森林分类算法
from sklearn.ensemble import RandomForestClassifier
# 模型评估指标:准确率、分类报告
from sklearn.metrics import classification_report, accuracy_score
# 数值计算库
import numpy as np

# ===================== 2. 加载并处理数据集 =====================
# 加载 sklearn 内置的乳腺癌分类数据集
data = load_breast_cancer()

# 特征数据(模型输入:肿瘤的各项测量指标)
X = data.data
# 标签数据(模型输出:良性/恶性)
y = data.target
# 特征名称(方便查看每个特征的含义)
feature_names = data.feature_names
# 类别名称(恶性 malignant / 良性 benign)
target_names = data.target_names

# ===================== 3. 增加噪声 =====================
# 设置随机种子,保证噪声可复现
np.random.seed(42)
# 生成高斯噪声
noise = np.random.normal(0, 12, X.shape)
# 将噪声加入原始数据
X = X + noise

# ===================== 4. 划分训练集与测试集 =====================
# 80% 数据用于训练模型,20% 用于测试
# stratify=y 保证训练集和测试集类别比例一致
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# ===================== 5. 构建模型 =====================
rf = RandomForestClassifier(
    n_estimators=3,      # 决策树数量
    max_depth=1,         # 树深度
    random_state=42      # 固定随机种子,保证结果可复现
)

# ===================== 6. 训练模型 =====================
# 用训练集数据训练随机森林
rf.fit(X_train, y_train)

# ===================== 7. 模型预测 =====================
# 用训练好的模型对测试集进行预测
y_pred = rf.predict(X_test)

# ===================== 8. 模型评估 =====================
# 输出测试集分类准确率
print("测试集准确率: {:.2f}%".format(accuracy_score(y_test, y_pred) * 100))

# 输出详细分类报告(精确率、召回率、F1分数)
print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=target_names))

# ===================== 9. 特征重要性排序 =====================
# 获取每个特征对分类结果的重要性分数
importances = rf.feature_importances_
# 按重要性从高到低排序
indices = np.argsort(importances)[::-1]

# 输出特征重要性排名
print("\n特征重要性排名:")
for i, index in enumerate(indices):
    print(f"{i + 1}. {feature_names[index]} ({importances[index]:.4f})")

三、实验结果与分析

  1. 实验结果展示

    • 准确记录并粘贴测试集准确率结果(保留两位小数);
    • 粘贴完整的分类报告(精确率、召回率、F1 分数、支持样本数);
    • 粘贴特征重要性排序结果。
  2. 结果分析

    • 模型性能分析:结合准确率、精确率、召回率等指标,评价模型在肿瘤良恶性分类任务中的效果;
    • 特征重要性分析:列出前 5 个最重要特征,分析其与肿瘤良恶性判断的关联性;
    • 异常/不足分析:若存在分类偏差、性能不足等问题,简要分析可能原因。
  3. 参数调优实验

    • 修改随机森林核心参数:n_estimators(50/200)、max_depth(3/10);
    • 记录不同参数组合下的模型准确率;
    • 对比分析参数变化对模型性能的影响,总结最优参数组合。

四、实验讨论

  1. 对比随机森林与单一决策树的优缺点,说明集成学习的优势;
  2. 说明如何判断模型是否过拟合/欠拟合,以及max_depth等参数的调优思路;
  3. 拓展思考:随机森林还可应用于哪些实际分类场景(如信用评估、疾病预测、文本分类等);
  4. 总结本次实验中数据分层采样(stratify=y)的作用与意义。

五、实验总结

  1. 说明本次实验是否完成预定目标,掌握了哪些核心技能;
  2. 梳理实现随机森林分类任务的完整流程(数据加载→划分→训练→评估→分析);
  3. 记录实验过程中遇到的问题(如代码报错、参数理解错误、结果异常等)及解决方法;
  4. 谈谈对机器学习分类任务、模型评估与特征分析的收获与体会。
相关推荐
yszaygr21382 小时前
Verilog参数化游程编码RLE模块
算法
望易2 小时前
刚设计的大模型架构-双域耦合认知框架
算法·架构
复杂网络6 小时前
多个 Claude Code 与多个 Codex 协同工作:设计与实现方案
算法
HjhIron1 天前
面试常客:字符串算法从入门到进阶
算法·面试
吴佳浩1 天前
DeepSeek DSpark:Confidence-Scheduled Speculative Decoding 技术解析
人工智能·算法·deepseek
触底反弹1 天前
🧠 搞懂 Token,才算真正入门大模型——从分词原理到 Embedding 语义实战
javascript·人工智能·算法
vivo互联网技术1 天前
ICLR 2026 | 基于后验采样的图像恢复方法LearnIR:人脸去阴影、去雾
人工智能·算法·aigc
浮生望1 天前
JS字符串与回文算法:从包装类到双指针的面试进阶之路
javascript·算法
黄敬峰1 天前
面试必刷:从JS底层包装类到双指针,彻底搞懂字符串与回文算法
算法
地平线开发者2 天前
J6B vio scenario sample
算法