KMeans+KNN乳腺癌预测课设:从聚类到分类的完整实战指南

发布时间:2026/9/8 11:42:37
KMeans+KNN乳腺癌预测课设:从聚类到分类的完整实战指南 简介乳腺癌预测是机器学习中典型的二分类应用这份课设项目将均值聚类与近邻分类相结合系统实现数据读取、缺失值处理、特征筛选、聚类结果可视化、按8:2划分训练集与测试集、网格搜索最佳近邻数并完成模型评估适合正在完成算法课设、毕业设计或想学习聚类与分类联合建模的读者。资源打包为RAR格式共5个文件包含Python实现脚本、乳腺癌CSV数据集、Jupyter Notebook分析文档、HTML可视化报告以及Word版设计说明整体大小仅1.05MB下载后即可对照运行便于快速了解项目全貌。该资源已有142人浏览学习内容经过整理且步骤完整。通过这份资料读者可掌握完整的实验链条从数据清洗到准确率输出皆可直接复现同时雷达图和分类结果能直观展示均值聚类如何提升近邻分类的预测效果大幅节省课设编码与排错时间非常适合作为高分参考。 这段时间帮人参谋了好几个机器学习方向的课设发现大家最拿不准的其实不是某个算法怎么写而是怎么把KMeans和KNN这两个名字放在一起做成一个能讲清楚、能展示、还不显水的东西。KMeans是无监督聚类KNN是有监督分类这两者单独写都很常规但组合起来做乳腺癌预测配合数据可视化在老师眼里的完成度和思考深度完全不一样。这篇博文就围绕这个课设项目展开数据集用什么、两个算法怎么配合、可视化怎么做、答辩问到的点在哪里以及我踩过的几个坑。目标是让拿到类似题目的同学能从零开始搭出一个拿得出手的高分课设。我默认你的环境是Python 3.8以上会用到pandas、numpy、matplotlib、scikit-learn这些库。项目主线有两个先用KMeans对样本做无监督聚类观察乳腺癌数据的天然分布结构再用KNN做有监督分类完成“良性/恶性”预测。两个阶段用同一套可视化逻辑串联起来成绩和项目价值都在这个过程里面。1. 项目背景与方案选型——为什么是KMeansKNN1.1 两个算法是什么、为什么会同时出现先从头捋一下。KMeans和KNN看起来像两兄弟名字里都带K但做的事完全不一样。KMeans是原型聚类算法输入一堆没有标签的数据算法按距离自动把样本分成K个簇每个簇中心是它的“原型”。KNN是惰性分类算法输入有标签的数据新样本进来以后看离它最近的K个邻居的类别分布投票决定它属于哪一类。我讲课设思路的时候习惯用一个比喻KMeans像是整理衣柜你不管衣服是谁的只按颜色、季节、材质把它们分类堆放目标是让每个格子里东西越像越好KNN则是问隔壁邻居你到新小区不认识路就挨个问附近几家“这里是什么片区”大家说“住宅区”你就信“住宅区”。两者的关系不是替代而是互补KMeans擅长发现数据中的结构KNN擅长利用已有的标签做精准判断。放在乳腺癌预测的项目里这是个很有意思的组合。医学数据里很多场景是你不知道病人有没有变成某个健康风险只知道一堆化验指标数值这时候KMeans可以先帮你看看这些数值有没有自然的群聚结构。一旦某些群组明显偏向患病或健康那就给后续KNN分类提供很好的验证基础。这也是为什么很多课设题目会同时点名这两个算法。1.2 为什么选择威斯康星乳腺癌数据集做乳腺癌预测目前公开可得的经典数据集是威斯康星乳腺癌数据集sklearn里直接内置了一份不需要自己去爬数据或手动处理表格。这个数据集有569个样本每个样本有30个特征维度都是细胞的若干几何和纹理指标比如半径、纹理、周长、面积、平滑度、凹陷度等等。标签只有两类恶性malignant和良性benign。选这个数据集的理由很实际。第一30个特征做可视化时有得可做——你可以降维看散点也可以挑两个关键特征画分布素材够多。第二类别分布相对均衡良性357例、恶性212例不需要花太多篇幅处理严重的类别不平衡问题适合课设展示。第三这个数据集的分类难度适中KNN在做好标准化的前提下准确率能到95%以上效果“好看”不打击人。1.3 整体技术栈与项目流程这个项目用的是纯Python生态核心组件就四个pandas做数据处理、matplotlib和seaborn做可视化、scikit-learn提供模型和评估工具。整个流程分为五步。第一步加载数据集并做探索性分析看特征分布、缺失值、样本分布。第二步标准化处理把所有特征压缩到同一个尺度。第三步KMeans聚类通过肘部法则确定簇数量K可视化聚类结果。第四步KNN分类用交叉验证确定邻居数K训练模型并评估。第五步把聚类结果和分类结果放到一起分析整理成长图或大屏可视化效果。技术栈简单不代表项目简单。关键在怎么把每一步都讲出道理来尤其是参数选择的过程这部分是答辩中老师最常追问的地方。2. 数据理解与预处理——先把手里的牌摸清楚2.1 数据集结构30个特征在说什么拿到威斯康星乳腺癌数据先别急着写模型。我习惯先看数据长什么样。每个样本有30个特征实际上分三组第一组是细胞核的均值指标第二组是标准差指标第三组是“最差值”指标。每一组里都包含半径、纹理、周长、面积、平滑度、紧凑度、凹陷度、凹点、对称性、分形维数这10个维度。举个例子mean radius表示细胞核的平均半径radius error表示半径的波动情况worst radius表示最大的半径值。恶性肿瘤的细胞通常形状更不规则、尺寸更不均匀所以这些特征在两类之间有明显的区分度。从这个数据出发才能理解为什么KNN能有效——因为不同类别样本在特征空间里的确呈现可区分的聚集。这也是整个项目最值得在报告里铺陈的内容。别急着上代码先用两三页把特征含义和分布可视化的图放上去老师会觉得你是真理解了问题本身而不仅仅是会调库。2.2 预处理标准化是绕不开的一步KNN和KMeans都严重依赖距离计算。KNN要算新样本到每个训练样本的距离KMeans要算样本到簇中心的距离。这个时候如果某个特征数值特别大比如area动不动就几百上千而另一个特征数值特别小比如smoothness只有零点零几大的特征就会主导距离计算模型实际上等于只看了面积这一个维度其他特征全是摆设。解决办法就是标准化让每个特征都变成均值约0、标准差约1的分布。sklearn里直接调用StandardScaler先fit训练集再transform训练集和测试集。这里有个细节很多人会犯测试集一定要用训练集的均值方差来做标准化不能自己单独fit_transform否则测试数据的信息提前泄漏评估结果就会虚高。from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)注意fit_transform只用一次之后对测试集只用transform。数据泄漏是课设里被老师抓得最多的问题没有之一。2.3 数据集划分与评估指标的选择数据划分我用train_test_split按7:3拆训练集和测试集同时设好random_state42方便复现。这个random_state也得强调一下很多同学不设置每次跑结果都不一样写报告的时候数据对不上。设置一个固定值既保证实验可重复也方便你在报告里贴出稳定结果。评估指标方面二分类问题不能只盯准确率一个数字。乳腺癌预测场景里漏诊恶性假阴性比误诊良性假阳性后果更严重所以我同时看精确率、召回率、F1分数和AUC值。KNN在这个数据集上准确率通常在95%上下AUC能到0.98左右效果相当好看。如果看到准确率虚高到99%反而要警觉是不是数据泄漏了。3. KMeans聚类先用无监督方法探查数据3.1 聚类数量K怎么选——肘部法则KMeans第一步就是定K这个K不是拍脑袋定的。最常用的方法是肘部法则跑多个K值每个K算一次所有样本到所属簇中心的距离平方和SSE然后把K和SSE画成折线图。K从1增加到2时SSE会大幅下降增加到某个点之后SSE下降幅度变小折线出现一个像手肘一样的拐点这个拐点就是合理的簇数量。代码就是我之前说的那几步循环K值调用KMeans记录inertia_属性画折线图。from sklearn.cluster import KMeans import matplotlib.pyplot as plt sse [] k_range range(1, 11) for k in k_range: model KMeans(n_clustersk, random_state42, n_init10) model.fit(X_scaled) sse.append(model.inertia_) plt.plot(k_range, sse, markero) plt.xlabel(K) plt.ylabel(SSE) plt.title(Elbow Method) plt.show()因为这个数据集本身是二分类所以K2时SSE下降最猛拐点就会出现在K2附近。多试几个K会看到类似效果图画出来很直观这也是可视化加分项之一。3.2 PCA降维与聚类可视化画聚类结果图有个关键问题数据是30维的没法直接在二维平面上展示。这时候需要做PCA降维把30维特征压缩成2个主成分。主成分本身是原始特征的线性组合它保留了数据中最大的方差也就是最核心的结构。在实际操作里我先把标准化之后的数据做PCA降到2维然后再把KMeans的簇标签画到散点图上。注意顺序上通常是降维后再聚类但严格说是先聚类还是先降维其实有争议。课设里我建议用降维后的二维数据聚类这样师兄师姐老师听的时候更容易理解示意图也更直观。提示PCA降维会丢失少量信息如果你追求分类性能在原始30维上跑KMeans和KNN指标往往更好。做可视化时再用降维数据两条线分开走效果和性能都兼顾。3.3 聚类结果的业务解读KMeans聚类结果出来以后光画图不够还要做业务解读。我的做法是把聚类标签和真实标签做交叉分析看看每个簇里恶性样本占比多少、良性样本占比多少。如果聚类结果和真实标签高度吻合说明数据本身的区分度好也侧面验证了用KNN做分类是靠谱的。比如输出一个类似“簇0中恶性占比87%、簇1中良性占比92%”的结果这就是能在报告里重点说的发现。同时算一下聚类准确率、纯度等指标和KNN的分类效果做个对比——无监督和有监督的效果差异会有说服力。这种对比分析是高分课设的常见特征不是“跑完了”而是“跑完还做了验证和解释”。4. KNN分类核心模型的训练与调优4.1 K值选择——交叉验证才是靠谱的做法到了KNN阶段第一个要解决的就是邻居数K。K太小模型会受单个离群点影响噪声很大K太大模型过于平滑边界容易被拉偏。选K最稳妥的办法是用交叉验证在训练集上划分若干小份轮流用其中一份做验证其余做训练看不同K值下的平均准确率。sklearn里GridSearchCV可以自动完成这件事也可以自己写循环交叉验证。我比较喜欢自己写因为能画出“K值-准确率”曲线让整个调参过程可视化报告里直接多一张图。下面这段代码用的是KFold加cross_val_score的简写。from sklearn.model_selection import cross_val_score, KFold from sklearn.neighbors import KNeighborsClassifier k_values range(1, 21) cv_scores [] for k in k_values: knn KNeighborsClassifier(n_neighborsk) scores cross_val_score(knn, X_train_scaled, y_train, cv5) cv_scores.append(scores.mean()) best_k k_values[cv_scores.index(max(cv_scores))] plt.plot(k_values, cv_scores, markero) plt.xlabel(K) plt.ylabel(CV Accuracy) plt.title(fBest K {best_k}) plt.show()测试下来这个数据集的K值落在5到9之间效果最好准确率曲线也比较平稳。如果看到某个K在训练集上准确率特别高但验证集上掉下来那就是过拟合了说明K选小了。4.2 距离度量与权重策略KNN还有一个容易被忽略的参数是距离度量和权重。默认情况下用的是欧氏距离每个邻居投票时权重一样。你也可以改成distance权重即越近的邻居投票权重越大这在很多场景下能带来一点提升。在scikit-learn里通过设置weightsdistance即可。真实项目中我会两个都跑一遍比较测试集上的性能差异。对威斯康星数据集来说两种方式得分接近但至少这个对比过程反映你在意细节不是直接把默认参数跑完就交差了事。千万不要忽略的就是需要确认数据是连续的数值特征。如果未来项目遇到离散特征就得用汉明距离或其他更适合的度量方式。4.3 用聚类结果辅助KNN的几个思路KMeans和KNN在一个项目里同时出现不只是各做各的完全可以串联起来。这里我给出几个自己觉得有价值的做法。一是聚类标签作为辅助特征。把KMeans输出的簇标签作为一个新特征拼到原始特征后面再喂给KNN。这样做有意义的前提是聚类结构确实和类别相关否则会引入噪声。在威斯康星数据集上这个做法提升有限但实验过程可写进报告。二是基于聚类中心的降维加速。KMeans把数据压缩成K个质心后KNN可以在质心上先粗分类再细查样本减少距离计算量。这个对大数据集有意义对569个样本没什么必要但作为扩展讨论能体现你的知识面。三是聚类结果做噪声检测。某些样本距离自己所在簇的中心很远可以视为疑似异常点。去除这些离群点再训练KNN有时候能提升准确率这个思路没有标准答案但很有故事可讲。建议课设里主线和副线要分清。主线是KMeans探索 KNN分类副线是聚类辅助分类的扩展实验。副线不要求效果多惊艳但有了它你的项目就从“调包”变成了“摸索”。5. 可视化设计完整拆解——让报告会说话5.1 六张核心图表的设计与实现可视化是这个课设的亮眼点也是拉开分数差距的地方。我按分析顺序整理了6张图每张的用途都不同全部画出来组合成一套完整叙事。第一张是数据分布箱线图选mean radius、mean texture、mean area、mean smoothness四个特征按良性恶性分组画箱线图直观展示特征区分度。第二张是特征相关性热力图挑10个有代表性的特征用seaborn的heatmap看它们之间的相关程度。第三张是簇数量肘部图用于KMeans选K。第四张是PCA降维后的散点图用不同颜色标出真实标签。第五张是KMeans聚类散点图用不同颜色和标记标出聚类结果。第六张是KNN的混淆矩阵热力图和ROC曲线安排在一起展示分类效果。相关性热力图的代码大概是这样的import seaborn as sns import pandas as pd df pd.DataFrame(X, columnsfeature_names) df[label] y plt.figure(figsize(12, 10)) sns.heatmap(df.corr(), cmapRdBu_r, annotFalse) plt.title(Feature Correlation Heatmap) plt.show()六张图画下来既覆盖了数据探索、无监督聚类、有监督分类、模型评估四个阶段又形成了“数据长什么样→数据怎么分堆→分类准不准”的完整故事链。每张图旁边配两三句话说明你看到了什么这就是老师最想看到的分析能力。5.2 可视化图表串成汇报故事线图表单独放是零散的你得把它们串成一条线来汇报。我的汇报逻辑是这样的开头先展示相关性热力图提出“特征之间存在较强相关性需要用距离类模型处理”接着展示箱线图说明“存在明显区分性的特征但也需要标准化”然后引出PCA降维散点图让老师对整体数据分布有个直观印象自然过渡到KMeans聚类展示无监督方式下的分簇效果再进入KNN分类用混淆矩阵和ROC曲线收尾给出最终结论。这个过程不需要每张图都讲很久但顺序要顺。老师提问的时候也跟着这条线走不容易被问乱也显得对项目理解比较系统。6. 常见问题与课设避坑经验6.1 数据集和代码层面的典型坑第一个坑是忘记标准化。这个问题很隐蔽因为“标准化”只是改变特征尺度不改变数据本身初学者很难看出问题。但只要把标准化前后的KNN准确率对比一下——这个数据集里能差出5到10个百分点就明白它有多重要了。第二个坑是PCA的位置。有的同学先对整份数据做PCA再切训练测试集这相当于用测试集的信息指导了训练过程会造成数据泄漏。正确做法是先在训练集上fit PCA的变换参数再transform测试集跟标准化是同一个逻辑。第三个坑是KMeans的n_init参数。sklearn新版中如果只跑一次聚类容易落入局部最优解结果不稳定。我建议设置n_init10让算法跑10次取最优保证展示结果是可复现的。第四个坑比较隐蔽是关于seaborn和matplotlib的中文显示。如果你在报告图里用了中文标签默认字体大概率会显示成方框。解决办法是提前设置字体比如用plt.rcParams[font.sans-serif] [SimHei]或者干脆图内全用英文标签注释部分在正文里写中文。下面这个表总结了我课上踩过的高频坑可以直接参考对照排查。问题现象根本原因解决办法准确率虚高到99%测试集参与了fit过程标准化和PCA都只用训练集fit再transform测试集KMeans每次结果不一样随机初始化的质心不同设置random_state或调大n_init图里中文全是方框matplotlib字体库缺中文字体设置中文字体或全用英文标签KNN准确率偏低没有标准化大数值特征主导距离用StandardScaler预处理后再训练网格搜索非常慢特征量太大且没降维先PCA降维到主要维度再搜索6.2 报告和答辩层面的经验报告不是代码的堆叠而是“问题—方法—实验—结论”的叙述。开头讲清楚为什么要做乳腺癌预测接着说明为什么选KMeans和KNN然后展示实验过程和可视化结果最后给出结论与改进方向。每张图都要有“你看到了什么”和“这说明什么”不要只贴图不解释。答辩的时候老师最常问的几个问题我提前列一下。第一个是“为什么用KMeans不用别的聚类算法”可以从KMeans简单高效、适合凸簇数据、配合肘部法则容易解释等角度回答。第二个是“KNN的K怎么确定”直接说交叉验证选出来的。第三个是“KMeans和KNN的区别”这是个高频概念题要能说清楚无监督和有监督的区别。第四个是“如果数据维度更高怎么办”可以回答引入PCA降维或者换用更适合高维距离度量的方法。提示课设展示时准备一两张“失败尝试”的截图反而加分。比如“我一开始没标准化准确率只有88%标准化之后到了95%”这个对比比单纯展示完美结果有说服力得多。6.3 后续可以怎么扩展做完这个课设如果还有余力有几个扩展方向值得考虑。一是换用逻辑回归、随机森林、SVM做对比实验形成多模型对比的完整章节这是拉开评分差距最快的方式。二是对特征做筛选用特征重要性排序后保留前10个特征看看模型效果是否下降也能写进报告。三是做一个简单的Streamlit页面把模型封装成交互界面让用户输入细胞指标直接看到预测结果可视化效果直接上了一个量级。我自己写过威斯康星数据集相关项目的完整代码和可视化实际跑完之后最大的体会是这两个算法组合起来并不是为了“显得会得多”而是真的能在数据处理流程上形成互补。无监督让你看见结构有监督让你验证判断两者一对比报告的故事性就出来了。最后再分享一个小技巧。做这种课设不用追求算法多复杂、代码多长关键在于每个参数你都说得出理由、每张图你都能讲出含义。把KMeans的K和KNN的K怎么选讲清楚把标准化的必要性讲清楚把PCA降维的取舍讲清楚这个项目拿高分就有了底气。做的时候多留几个中间过程的图表最后挑最顺眼的放进报告效果比贴一大段代码好很多。本文还有配套的精品资源点击获取