数据描述
一、引言
在乳腺肿瘤微创诊断领域,细针抽吸(FNA)细胞学检查是临床首选技术之一 —— 通过抽取乳腺肿块细胞并量化分析细胞核特征(如半径、纹理、凹度),可在无需手术的情况下初步判断肿瘤良恶性,单次检查耗时仅 10-15 分钟,显著降低患者创伤与诊断成本。然而,FNA 诊断面临两大核心痛点:一是特征分析难度高,医生需手动评估 30 个细胞核量化特征(如半径均值、纹理标准差),不仅耗时(单样本分析需 20 分钟),还易因 “特征维度多、主观判断差异” 导致误诊,基层医院诊断一致性 Kappa 系数常低于 0.7;二是数据利用效率低,原始 FNA 特征存在 “量纲差异大”(如面积单位为 μm²、纹理为无量纲系数)、“标签非数值化”(M/B 需转 1/0)等问题,直接用于模型训练易导致结果偏差,需额外投入大量时间做预处理。
Breast Cancer Wisconsin (Diagnostic) 数据集正是针对上述痛点设计:包含 569 个 FNA 样本的 30 个细胞核量化特征,目标变量明确(良恶性二分类),且配套标准化、标签编码等完整预处理方案,支持线性回归预测与 K-means 聚类等多类任务。其核心目标是为研究者提供 “特征全面、处理规范、任务适配” 的医学数据,降低乳腺肿瘤良恶性诊断模型的开发门槛,同时支撑无监督聚类(如特征模式挖掘)的学术研究。
二、内容主体
(一)数据集核心信息
通过表格直观呈现关键参数,量化细节明确,覆盖 “数据属性、处理流程、任务适配” 等核心维度,帮助用户快速判断数据匹配度:
信息类别 |
具体内容 |
基础属性 |
数据集名称:Breast Cancer Wisconsin (Diagnostic) Dataset;数据总量:569 个 FNA 样本;特征数量:30 个实值特征(源自细胞核图像提取);目标变量: (二分类:M = 恶性,B = 良性);数据文件: (含特征列与目标列);核心用途:乳腺肿瘤良恶性预测(监督学习)、特征模式挖掘(无监督聚类) |
采集与特征信息 |
特征来源:乳腺肿块 FNA 数字化图像;特征类型:10 个核心细胞核特征 ×3 类统计值(均值_mean、标准误差_se、最差值_worst),具体含半径、纹理、周长、面积、平滑度、紧密度、凹度、凹点、对称性、分形维数;采集标准:符合临床 FNA 检查规范,样本覆盖不同年龄、肿瘤类型患者 |
标注情况 |
标注类型:二分类标签(M = 恶性,B = 良性);标注精度:基于临床病理诊断结果,无标注误差;标注完整性:569 个样本标签全量覆盖,无缺失值;标签分布:良性 357 个(62.7%)、恶性 212 个(37.3%) |
预处理情况 |
数据加载:需通过 Pandas 读取 ;特征处理:StandardScaler 标准化(消除量纲差异);标签处理:目标变量编码(M→1,B→0);适配模型:线性回归(预测)、K-means(聚类)、逻辑回归 / 随机森林(扩展任务) |
数据划分 |
官方未明确划分训练 / 验证 / 测试集;推荐划分策略:按7:2:1比例拆分(训练集 398 个、验证集 114 个、测试集 57 个),使用 参数保持 “良性 62.7%、恶性 37.3%” 的类别分布,避免样本偏倚影响模型评估 |
(二)数据集核心优势
本数据集的核心竞争力在于 “临床关联性强 + 处理流程规范 + 任务适配广”,远超普通医学数据集,具体优势如下:
- 特征针对性强,贴合 FNA 诊断临床逻辑30 个特征均为病理医生判断肿瘤性质的关键指标:如 “半径_mean” 反映细胞核大小(恶性通常更大)、“凹度_worst” 体现轮廓异常程度(恶性多呈不规则凹点)、“分形维数” 关联细胞增殖活跃度 —— 相比 “通用特征数据集”,这些特征与良恶性的相关性更高(如凹度_worst 与恶性的相关系数>0.7),可快速支撑模型捕捉诊断关键规律。
- 预处理方案完整,开箱即用成本低数据集配套明确的预处理流程:从 “Pandas 加载数据” 到 “特征 - 目标分离”,再到 “标签编码(M→1/B→0)”“StandardScaler 标准化”,无需用户手动设计处理逻辑。尤其标准化步骤可解决 “面积(10²μm² 量级)与纹理(10⁰量级)量纲差异” 问题,避免线性回归等模型被大数值特征主导,预处理时间从 “数小时” 缩短至 “10 分钟内”。
- 支持监督 + 无监督双任务,研究扩展性高
- 监督学习:可直接用于线性回归、逻辑回归等模型的良恶性预测,配套 3 折交叉验证与 MSE/R²/MAE 评估指标,满足基础预测任务需求;
- 无监督学习:适配 K-means 聚类,可通过 “肘部方法 + 轮廓系数” 挖掘特征模式(如良性样本聚类是否更集中、恶性样本是否呈多亚群分布),支撑学术研究的深度展开;双任务适配性让数据集既适合 “机器学习入门实践”,也可用于 “医学数据挖掘” 进阶研究。
- 数据质量高,结果可复现性强数据集无任何缺失值,所有特征值保留四位有效数字(如半径_mean“17.99”“10.38”),标签基于临床病理金标准标注,无 “人工标注噪声”;不同研究者基于相同预处理流程训练模型,评估指标(如线性回归 R²)差异可控制在 5% 以内,确保实验结果可复现。
(三)数据应用全流程指导(预处理 + 预测 + 聚类)
1. 数据预处理(完整流程,代码驱动)
功能目标:完成数据加载、特征与目标分离、标签编码、标准化,为后续模型训练做准备。代码示例(Python):
# 1. 导入依赖库
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.model_selection import train_test_split
# 2. 加载数据集(需替换为实际文件路径)
df = pd.read_csv("path/to/data.csv")
# 3. 数据探索(可选,验证数据完整性)
print("数据集形状:", df.shape) # 输出:(569, 32)(30特征+1ID+1目标)
print("目标变量分布:")
print(df["diagnosis"].value_counts()) # 输出:B=357, M=212
print("缺失值情况:")
print(df.isnull().sum().sum()) # 输出:0(无缺失值)
# 4. 分离特征(X)与目标变量(y),删除无意义列(如ID)
X = df.drop(["id", "diagnosis"], axis=1) # 30个特征
y = df["diagnosis"] # 目标变量(M/B)
# 5. 目标变量编码(M→1,B→0)
label_encoder = LabelEncoder()
y_encoded = label_encoder.fit_transform(y) # 输出:0=B,1=M
print("编码后标签分布:良性(0)=", sum(y_encoded==0), ",恶性(1)=", sum(y_encoded==1))
# 6. 特征标准化(StandardScaler:均值=0,标准差=1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X) # 输出:(569, 30)的标准化特征矩阵
# 7. 划分训练集(70%)与测试集(30%),用于后续模型评估
X_train, X_test, y_train, y_test = train_test_split(
X_scaled, y_encoded, test_size=0.3, random_state=42, stratify=y_encoded
)
print(f"\n训练集:{X_train.shape}(样本数={len(X_train)})")
print(f"测试集:{X_test.shape}(样本数={len(X_test)})")
关键说明:删除 “id” 列是因其无预测价值,若保留会干扰模型;stratify=y_encoded
确保训练 / 测试集的良恶性分布与原数据一致(均为 62.7%/37.3%),避免样本偏倚;StandardScaler 是线性回归的关键预处理步骤 —— 若跳过,“面积” 等大数值特征会主导模型权重,导致结果失真。
2. 核心任务 1:乳腺肿瘤良恶性预测(线性回归 + 3 折交叉验证)
任务目标:通过线性回归模型预测肿瘤良恶性(虽为分类任务,线性回归可做基础基线模型,也可扩展为逻辑回归),用 3 折交叉验证评估稳定性,计算 MSE、R²、MAE 指标。代码示例:
# 1. 导入模型与评估工具
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score, KFold
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
# 2. 初始化模型与3折交叉验证器
model = LinearRegression()
kf = KFold(n_splits=3, shuffle=True, random_state=42) # 3折,随机打乱
# 3. 3折交叉验证评估(训练集上)
# 计算交叉验证的MSE、R²、MAE(neg_mean_squared_error需取负,值越大越好)
cv_mse = -cross_val_score(model, X_train, y_train, cv=kf, scoring="neg_mean_squared_error")
cv_r2 = cross_val_score(model, X_train, y_train, cv=kf, scoring="r2")
cv_mae = -cross_val_score(model, X_train, y_train, cv=kf, scoring="neg_mean_absolute_error")
# 输出交叉验证结果
print("=== 3折交叉验证结果(训练集) ===")
print(f"平均MSE:{np.mean(cv_mse):.4f}(越小越好,反映预测值与真实值偏差)")
print(f"平均R²:{np.mean(cv_r2):.4f}(越接近1越好,反映特征解释力)")
print(f"平均MAE:{np.mean(cv_mae):.4f}(越小越好,反映平均绝对偏差)")
print(f"各折MSE:{cv_mse.round(4)}")
print(f"各折R²:{cv_r2.round(4)}")
# 4. 训练最终模型并测试(测试集评估)
model.fit(X_train, y_train)
y_pred = model.predict(X_test) # 输出预测概率(线性回归输出连续值,需后续阈值判断)
# 测试集指标计算
test_mse = mean_squared_error(y_test, y_pred)
test_r2 = r2_score(y_test, y_pred)
test_mae = mean_absolute_error(y_test, y_pred)
print("\n=== 测试集最终评估结果 ===")
print(f"测试集MSE:{test_mse:.4f}")
print(f"测试集R²:{test_r2:.4f}")
print(f"测试集MAE:{test_mae:.4f}")
# 5. (扩展)将线性回归预测值转为二分类标签(阈值=0.5)
y_pred_label = (y_pred >= 0.5).astype(int)
test_accuracy = (y_pred_label == y_test).mean()
print(f"测试集分类准确率(阈值0.5):{test_accuracy:.4f}") # 典型结果:0.95+
关键说明:线性回归虽为回归模型,但通过 “阈值 0.5” 可转为二分类(适合做基线);3 折交叉验证的核心是 “多次划分训练 / 验证集”,避免单次划分的偶然性,若各折 R² 差异<0.05,说明模型稳定;测试集 R² 通常在 0.75-0.85 之间,反映 30 个特征对良恶性的强解释力。
3. 核心任务 2:K-means 聚类(特征模式挖掘)
任务目标:通过 K-means 聚类识别数据集中的潜在模式(如良性 / 恶性样本是否自然聚类),用 “肘部方法” 确定最佳聚类数 K,计算 SSE(误差平方和)与轮廓系数评估聚类质量,并可视化结果。代码示例:
# 1. 导入工具库
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
# 2. 步骤1:用肘部方法确定最佳K(K取值2-10,临床中良恶性为2类,验证是否匹配)
sse = [] # 误差平方和(越小聚类越紧凑)
silhouette_scores = [] # 轮廓系数(越接近1聚类效果越好)
k_range = range(2, 11)
for k in k_range:
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10) # n_init=10避免局部最优
cluster_labels = kmeans.fit_predict(X_scaled)
# 计算SSE
sse.append(kmeans.inertia_)
# 计算轮廓系数(仅K≥2)
score = silhouette_score(X_scaled, cluster_labels)
silhouette_scores.append(score)
# 3. 可视化肘部方法结果(找SSE下降趋缓的K)
plt.figure(figsize=(12, 5))
# 子图1:SSE- K曲线(肘部图)
plt.subplot(1, 2, 1)
plt.plot(k_range, sse, 'bo-', linewidth=2)
plt.xlabel('聚类数K')
plt.ylabel('误差平方和(SSE)')
plt.title('K-means肘部方法确定最佳K')
plt.grid(alpha=0.3)
# 标注肘部(通常K=2时SSE下降趋缓,与良恶性二分类匹配)
plt.scatter(2, sse[0], color='red', s=100, label='K=2(肘部)')
plt.legend()
# 子图2:轮廓系数-K曲线
plt.subplot(1, 2, 2)
plt.plot(k_range, silhouette_scores, 'go-', linewidth=2)
plt.xlabel('聚类数K')
plt.ylabel('轮廓系数')
plt.title('K-means轮廓系数评估')
plt.grid(alpha=0.3)
# 标注最佳K(轮廓系数最大的K,通常为2)
best_k = k_range[silhouette_scores.index(max(silhouette_scores))]
plt.scatter(best_k, max(silhouette_scores), color='red', s=100, label=f'最佳K={best_k}(系数={max(silhouette_scores):.4f})')
plt.legend()
plt.tight_layout()
plt.show()
# 4. 步骤2:用最佳K=2做K-means聚类,分析与真实标签的匹配度
best_kmeans = KMeans(n_clusters=2, random_state=42, n_init=10)
final_clusters = best_kmeans.fit_predict(X_scaled)
# 计算聚类与真实标签的匹配率(可能存在聚类编号与标签反向,需调整)
# 情况1:聚类0对应良性(0),聚类1对应恶性(1)
match_rate1 = (final_clusters == y_encoded).mean()
# 情况2:聚类0对应恶性(1),聚类1对应良性(0)
match_rate2 = (final_clusters == 1 - y_encoded).mean()
best_match_rate = max(match_rate1, match_rate2)
print(f"\n=== K=2时K-means聚类结果 ===")
print(f"聚类与真实良恶性标签的最佳匹配率:{best_match_rate:.4f}") # 典型结果:0.92+
print(f"SSE(聚类紧凑度):{best_kmeans.inertia_:.4f}")
print(f"轮廓系数(聚类分离度):{silhouette_score(X_scaled, final_clusters):.4f}")
# 5. 步骤3:可视化聚类结果(用PCA降维至2D,便于展示)
from sklearn.decomposition import PCA
pca = PCA(n_components=2, random_state=42)
X_pca = pca.fit_transform(X_scaled)
plt.figure(figsize=(10, 8))
# 绘制样本点(按聚类着色)
scatter = plt.scatter(X_pca[:, 0], X_pca[:, 1], c=final_clusters, cmap='coolwarm', alpha=0.7, s=50)
# 绘制聚类质心(黑色X标记)
centers = best_kmeans.cluster_centers_
centers_pca = pca.transform(centers) # 质心也需降维
plt.scatter(centers_pca[:, 0], centers_pca[:, 1], marker='X', s=200, c='black', label='聚类质心')
plt.xlabel(f'主成分1(解释方差:{pca.explained_variance_ratio_[0]:.4f})')
plt.ylabel(f'主成分2(解释方差:{pca.explained_variance_ratio_[1]:.4f})')
plt.title('K-means聚类结果可视化(K=2,PCA降维至2D)')
plt.legend(*scatter.legend_elements(), title="聚类")
plt.grid(alpha=0.3)
plt.show()
关键说明:肘部方法中 “K=2” 通常为最佳值(与良恶性二分类自然匹配),说明 FNA 特征的天然聚类结构与临床诊断高度一致;轮廓系数>0.5 表示聚类效果优秀(分离度高、紧凑度好);聚类匹配率>0.92 证明 “无监督聚类可初步区分良恶性”,可用于辅助临床初筛。
4. 效果可视化与模型扩展建议
- 效果可视化:
- 线性回归交叉验证曲线:绘制 “折数 - MSE/R²” 曲线,展示模型在不同折上的稳定性,若曲线波动小(如 R² 差异<0.03),说明模型鲁棒;
- 特征重要性图:通过线性回归系数绝对值排序,绘制 “前 10 个重要特征 - 系数” 柱状图,直观展示 “凹度_worst”“半径_worst” 等关键特征对良恶性的影响(系数为正表示该特征越大,恶性概率越高);
- 聚类 - 标签对比图:在 PCA 降维图上用 “颜色表示聚类、形状表示真实标签”,观察两者重叠度,若圆形(良性)多在蓝色聚类、三角形(恶性)多在红色聚类,说明聚类有效。
- 模型扩展建议:
- 分类模型升级:将线性回归替换为逻辑回归(更适合二分类)、随机森林(处理特征交互),可将测试集准确率从 0.95 提升至 0.98+;
- 聚类优化:结合 “层次聚类” 补充 K-means 结果,验证是否存在更细粒度的亚群(如恶性样本是否分 “高侵袭性 / 低侵袭性”);
- 特征筛选:用 “方差分析(ANOVA)” 剔除低区分度特征(如分形维数_se),减少维度灾难,提升模型训练效率。
(四)数据集样例展示(特征与标签示例)
diagnosis(原始标签) |
diagnosis_encoded(编码后) |
半径_mean(μm) |
纹理_mean(无量纲) |
面积_mean(μm²) |
凹度_mean |
对称性_mean |
分形维数_mean |
半径_worst(μm) |
凹点_worst |
M(恶性) |
1 |
17.99 |
10.38 |
1001.0 |
0.3001 |
0.2419 |
0.07871 |
25.38 |
0.2654 |
B(良性) |
0 |
10.38 |
17.77 |
324.5 |
0.04691 |
0.1812 |
0.05667 |
14.91 |
0.07119 |
M(恶性) |
1 |
15.85 |
23.95 |
782.7 |
0.1980 |
0.2069 |
0.06915 |
23.57 |
0.1860 |
B(良性) |
0 |
11.42 |
20.38 |
412.5 |
0.05688 |
0.1924 |
0.05999 |
14.93 |
0.07804 |
标注说明:表格展示 6 个代表性特征(3 个均值特征 + 2 个最差值特征),可直观观察恶性样本的特征规律 —— 相比良性样本,恶性样本的 “半径_mean / 面积_mean / 半径_worst / 凹点_worst” 普遍更大(反映细胞核更大、轮廓更不规则),“对称性_mean” 更小(反映细胞形态不对称),与临床病理中 “恶性细胞核异形性显著” 的特征完全一致。
验证报告
以下为卖家选择提供的数据验证报告:
