尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

肿瘤识别机器学习实战:四种算法源码解析与调参指南

发布时间:2026/9/28 17:06:20

资讯中心
01
ARTICLE

肿瘤识别机器学习实战:四种算法源码解析与调参指南

肿瘤识别机器学习实战:四种算法源码解析与调参指南
简介这是一套基于多种机器学习算法实现的肿瘤识别项目面向计算机、人工智能、数据科学与大数据技术等专业的在校学生、教师及从业者尤其适合作为毕业设计、课程设计、期末大作业或初期项目演示的参考方案。项目完整覆盖支持向量机、逻辑回归、决策树、K近邻、随机森林、梯度提升等主流分类算法并附带肿瘤数据集与超详细中文注释帮助学习者快速掌握特征工程、模型训练与结果对比的完整流程。压缩包共8个文件包含6个算法脚本、1个数据文件与1个说明文档整体仅142KB体积小巧、结构清晰便于本地运行与二次开发。目前已有250人学习使用。代码均已验证可稳定运行注释细致到关键步骤既适合初学者入门进阶也可在课程答辩中直接展示对比实验结果通过在不同模型间横向比较读者能直观理解各算法在医疗诊断场景下的适用性与差异并基于现有框架继续调参、增加特征或集成模型完成更具个人特色的项目。1. 肿瘤识别用机器学习这份源码到底能帮你解决什么拿到「基于多种机器学习算法实现肿瘤识别 python源码数据集超详细注释(SVM、逻辑回归、决策树、K近邻等)」这个包时多数人的第一反应是赶紧跑一遍看准确率能到多少。这个方向在医学数据分析入门里相当典型样本量不大、特征维度适中、二分类问题恰好能把机器学习算法里最常用的几个模型全部串起来对比一遍。它解决的问题不是“研发出一套临床诊断系统”而是用一套完整可复现的流程让你看清不同算法在同一份肿瘤数据上的真实差距并理解为什么有的模型在这个场景下表现稳定、有的却容易翻车。适合两类人刚学完 Python 和 sklearn、想用真实数据集练手的初学者以及有基础但想系统梳理模型选型、交叉验证和调参思路的从业者。本文按“数据理解 → 四种算法复现 → 调参 → 踩坑 → 验证”的顺序把这份源码背后的落地方案讲透。2. 先看数据再谈算法肿瘤数据集的结构与预处理2.1 数据来源与特征语义为什么细胞核特征能区分良恶性这类肿瘤识别项目最常见的是乳腺癌数据集其中威斯康星乳腺癌数据集WBCD几乎成了教学标准。原始数据里每一条记录代表一个细胞核样本标签是良性或恶性。特征不是影像像素而是从细胞核图像里计算出来的几何与纹理指标比如半径均值、纹理标准差、周长、面积、平滑度、凹度、对称性等。每个指标又按均值mean、标准差se和最差值worst三组展开最终形成 30 个数值特征。这样的数据分布有一个明显特点良性和恶性样本在部分特征上重叠严重但在少数特征如面积最差值、周长最差值上分得比较开。这决定了模型选择的基调——单靠一两个阈值做规则判断是不够的需要算法自动学出特征组合。数据规模上常见的公开版本有 569 个样本其中良性约 357、恶性约 212。这个体量对深度学习来说太小但对传统机器学习恰好合适逻辑回归、SVM、KNN、决策树都能在几秒内完成训练也方便做交叉验证。用这个数据集还有一个隐含好处——特征维度 30、样本量 569属于“中维小样本”正是 SVM 发挥优势的区间。2.2 加载与切分先让数据露出原始面目不管 zip 里的数据集是 CSV 还是 sklearn 内置格式第一步都是把它读进来、看清形状和标签分布再做训练测试切分。源码里通常采用类似下面的写法from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split # 加载内置乳腺癌数据集 data load_breast_cancer() X data.data # 30 个特征569 行 y data.target # 0恶性, 1良性 # 分层切分保证训练集和测试集里良恶性比例一致 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy # 类别不平衡时这个参数很关键 ) print(X_train.shape, X_test.shape) # 输出类似(455, 30) (114, 30)逻辑说明这里用了分层抽样stratify而不是简单随机切分。癌症数据里良恶性本来就 6:4 左右如果随机切分可能碰到训练集里恶性样本特别少、测试集里恶性样本特别多的糟糕情况模型评估结果就会剧烈波动。固定 random_state42 是为了让每次复现得到同一份切分这对对比算法公平性很重要。如果源码里用的是 CSV 读取只需把 load_breast_cancer() 换成 pd.read_csv()注意把标签列从特征矩阵里拆出来其余流程不变。参数说明test_size 一般取 0.2 或 0.25569 个样本取 0.2 后有 455 个训练样本足够训练传统模型random_state 可以选任意整数但同一份源码里要保持一致否则不同模型在不同切分下对比就失去了意义。这里最容易被忽略的是 stratify——后面做网格搜索和交叉验证时如果数据集类别不平衡问题更严重比如换成其他医学数据集忽略分层带来的误差会被成倍放大。2.3 特征标准化SVM 和 KNN 的成与败都在这一步肿瘤数据集的 30 个特征量纲差异很大半径均值在 10 左右面积均值却可能到 600 甚至上千。对逻辑回归、SVM、KNN 这类基于距离或梯度的模型量纲差异直接决定模型能不能学得动。标准化是这类项目里默认的前置步骤常见做法是 StandardScaler也就是把每个特征减去均值、除以标准差让所有特征落在近似同一尺度上。from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) # 先拟合训练集 X_test_scaled scaler.transform(X_test) # 再用同一套参数转换测试集 # 查看标准化前后某个特征的变化 import numpy as np print(标准化前 mean area:, X_train[:, 3].mean().round(2)) print(标准化后 mean area:, X_train_scaled[:, 3].mean().round(6))逻辑说明代码里 fit_transform 和 transform 分两步这是为了防止数据泄露。scaler 只从训练集上学习均值和标准差然后把这个学到的变换直接应用到训练集和测试集。如果对全量数据做标准化再切分测试集的信息就已经混进了训练过程后面对测试集评估得到的指标会偏乐观这在学术和临床场景里都是不能接受的。标准化后每个特征的均值接近 0、标准差接近 1SVM 的 RBF 核计算距离时就不会被面积、周长这类大数值特征主导。参数说明StandardScaler 本身没有需要调的参数真正要注意的是“只 fit 训练集”这个使用位置。如果源码里用的是 MinMaxScaler把数据映射到 0-1 区间对肿瘤识别这种没有极端离群点的数据也可以但 SVM 的 RBF 核配合 StandardScaler 是更常见的组合。决策树和基于树的模型不受量纲影响这也是后文选择是否缩放时要区分的点。3. 四种算法逐个复现从线性基线到非线性边界3.1 逻辑回归在肿瘤识别里为什么是首选基线逻辑回归是这类项目里最值得先跑的模型不是因为它准确率最高而是因为它给出一个可解释的线性基线。肿瘤识别场景里医生不仅想知道“良性还是恶性”更想知道“是哪些特征让模型做出了这个判断”。逻辑回归的权重系数正好能回答这个问题权重绝对值越大对应特征对判别的贡献越大。它假设特征与标签的对数几率呈线性关系虽然对复杂非线性边界拟合能力有限但肿瘤数据本身在标准化后就已经有不错的线性可分性。from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, roc_auc_score model_lr LogisticRegression( C1.0, # 正则化强度的倒数越小正则越强 max_iter1000, # 增大迭代上限避免收敛警告 penaltyl2, # L2 正则适合特征间相关性较高的场景 random_state42 ) model_lr.fit(X_train_scaled, y_train) y_pred model_lr.predict(X_test_scaled) y_proba model_lr.predict_proba(X_test_scaled)[:, 1] print(LR 准确率:, accuracy_score(y_test, y_pred).round(4)) print(LR AUC:, roc_auc_score(y_test, y_proba).round(4))逻辑说明注意这里用的是标准化后的数据。如果不缩放逻辑回归虽然也能收敛但 L2 正则的惩罚会不均匀作用在不同量纲的特征上小量纲特征被惩罚得更狠模型学出来的权重含义就扭曲了。predict_proba 取第二列得到的是预测为良性的概率后续画 ROC 曲线、做概率校准都需要它而不是直接用 predict 的硬标签。参数说明C 是逻辑回归最重要的超参数默认 1.0。C 越小正则化越强模型越不容易过拟合但也可能欠拟合肿瘤数据 30 个特征 455 个训练样本C 在 0.1 到 10 之间通常是合理搜索范围。max_iter 设成 1000 是为了避免数据标准化前偶发的收敛警告标准化后一般几十次迭代就收敛了。3.2 SVMRBF 核与 C、gamma 两个关键参数SVM 是肿瘤识别项目里最值得细看的模型。它在这类中维小样本数据上常常表现最好但也是调参最讲究的一个。线性 SVM 只能学出直线边界对肿瘤数据也已经够用但为了覆盖更复杂的特征交互源码里普遍会用 RBF 径向基核。RBF 核的本质是把样本映射到高维空间在高维空间里找一个最大间隔超平面。RBF 核有两个核心参数C 和 gamma。C 控制对误分类样本的惩罚力度C 越大模型越努力把训练集分对但也更容易过拟合gamma 控制单个样本的影响半径gamma 越大决策边界越复杂、越容易贴着训练样本走。from sklearn.svm import SVC model_svm SVC( kernelrbf, C10.0, # 误分类惩罚中等偏大的值 gammascale, # 自动按特征数量计算 gamma probabilityTrue, # 启用概率估计才能计算 AUC random_state42 ) model_svm.fit(X_train_scaled, y_train) y_pred_svm model_svm.predict(X_test_scaled) y_proba_svm model_svm.predict_proba(X_test_scaled)[:, 1] print(SVM 准确率:, accuracy_score(y_test, y_pred_svm).round(4)) print(SVM AUC:, roc_auc_score(y_test, y_proba_svm).round(4))逻辑说明SVC 默认不输出概率只有设置 probabilityTrue 才会在训练时多做一个 Platt 缩放把决策边界的距离换算成概率值。这个开关会让训练时间变长但对评估来说值得开。gammascale 是 sklearn 的默认策略实际值等于 1 / (特征数 × 输入方差)对标准化后的数据效果比较稳。SVM 对特征缩放极度敏感上一章做标准化就是为这一步铺路——如果不缩放RBF 核计算样本间距离时会被量纲大的特征主导模型等于看不见其他特征。参数说明C 和 gamma 是网格搜索的主角。C 常用候选范围是 [0.1, 1, 10, 100]gamma 常用 [0.001, 0.01, 0.1, scale]。对肿瘤数据集C10、gammascale 往往是一个不会出错的起点。如果测试集准确率明显低于训练集说明 C 或 gamma 偏大往小调如果两个都低可能是标准化没做好或数据本身线性可分性差需要检查特征预处理。3.3 决策树可解释性最强的非线形模型决策树在肿瘤识别项目里扮演的角色和 SVM 相反它不强但能看懂。树模型通过递归切分特征空间每次选择一个特征和一个阈值把样本分成两组直到满足停止条件。它的最大优势是规则可视化——你可以把训练好的树画出来直接看到“面积最差值小于某个阈值时判为恶性”这类明确规则。这在医学场景里非常有价值因为临床专家可以审视规则是否符合病理知识。from sklearn.tree import DecisionTreeClassifier model_tree DecisionTreeClassifier( max_depth4, # 限制树深防止过拟合默认不限制 min_samples_split10, # 内部节点至少需要 10 个样本才继续分裂 min_samples_leaf5, # 叶节点至少保留 5 个样本 criteriongini, # 基尼系数也可以用 entropy random_state42 ) model_tree.fit(X_train_scaled, y_train) y_pred_tree model_tree.predict(X_test_scaled) y_proba_tree model_tree.predict_proba(X_test_scaled)[:, 1] print(决策树准确率:, accuracy_score(y_test, y_pred_tree).round(4)) print(决策树 AUC:, roc_auc_score(y_test, y_proba_tree).round(4))逻辑说明这里故意把 max_depth 限制到 4而不是用默认的不限制深度。决策树在不限制深度时会把训练集每个样本都分到自己专属的叶节点训练集准确率轻松接近 100%但测试集表现急剧下降——这是这个项目里最经典的过拟合示例。限制深度后的树虽然准确率可能不如 SVM但规则数量少、可解读性高适合作为向非技术人员解释模型逻辑的窗口。注意决策树不需要特征标准化因为树的切分只依赖特征排序不受量纲影响代码里仍然用缩放后的数据是为了保持与其他模型输入一致省事。参数说明max_depth 在肿瘤数据上取 3 到 6 比较合理超过 8 层基本就开始过拟合。min_samples_split 和 min_samples_leaf 是第二道防线它们强迫树在样本量不足时停止分裂效果等价于剪枝。这里三个参数是配合使用的深度限制防止纵向膨胀叶节点最小样本数防止横向细碎分裂。3.4 KNNK 值、距离度量与样本密度的影响K 近邻是四种算法里原理最简单的一个新样本来的时候找训练集中距离最近的 K 个邻居让它们投票决定类别。它没有训练过程或者说训练就是记住所有样本。在肿瘤识别这个小数据集上KNN 的准确率不一定比 SVM 低但它的结果非常依赖两个选择K 取多大以及用什么距离度量。K 太小比如 1会让决策边界非常抖任何一个噪声样本都能影响结果K 太大又会让远处样本参与投票把边界抹平。肿瘤数据 455 个训练样本K 取 5 到 15 之间比较常见。from sklearn.neighbors import KNeighborsClassifier model_knn KNeighborsClassifier( n_neighbors5, # K 值 weightsdistance, # 距离越近权重越大也可以是 uniform metricminkowski, # 闵可夫斯基距离 p2 # p2 即欧氏距离 ) model_knn.fit(X_train_scaled, y_train) y_pred_knn model_knn.predict(X_test_scaled) y_proba_knn model_knn.predict_proba(X_test_scaled)[:, 1] print(KNN 准确率:, accuracy_score(y_test, y_pred_knn).round(4)) print(KNN AUC:, roc_auc_score(y_test, y_proba_knn).round(4))逻辑说明KNN 是距离类算法特征标准化对它来说不是可选项而是必选项。如果不缩放面积、周长这类大数值特征会主导距离计算其他 20 多个特征等于没用。weightsdistance 让邻居投票时按距离加权距离近的样本说话权重更大这比 uniform 等权投票在肿瘤数据上通常更稳。KNN 的评估指标里 AUC 通常比准确率更有参考价值因为概率值是直接按邻居类别的加权比例算出来的。参数说明n_neighbors 是唯一必须调的核心参数。一个实用的检查方法分别跑 K3、5、7、9、15看测试集准确率和 AUC 的走势如果 K 越大结果越差说明数据分布里有大量重叠区域小 K 更能捕捉局部结构如果 K 越大结果越好说明数据本身噪声多需要更多邻居来平滑预测。metric 默认 minkowski 配合 p2 就是欧氏距离对标准化后的连续特征足够如果换成曼哈顿距离p1也能用但一般不会显著改善。4. 用网格搜索把模型调出真实力Pipeline 与交叉验证4.1 把缩放放进流水线防止数据泄露的正确写法单独跑完四个模型后接下来要做的不是直接挑个准确率最高的交差而是用网格搜索把每个模型的参数空间扫一遍。这里最容易踩的坑是先对全部数据做标准化或插补再塞进 GridSearchCV。交叉验证会在内部把训练集再切分但如果你提前在全量数据上 fit 了 scaler每一折的验证集都已经接触过缩放器的统计量评估结果就会偏乐观。解决方法是把标准化器和模型一起放进 Pipeline让每一折交叉验证都在当前训练子集上重新学习 scaler。from sklearn.pipeline import Pipeline from sklearn.model_selection import GridSearchCV, StratifiedKFold # 把标准化和 SVM 组合成一条流水线 pipeline_svm Pipeline([ (scaler, StandardScaler()), (svm, SVC(probabilityTrue, random_state42)) ]) # 分层 K 折交叉验证5 折 cv StratifiedKFold(n_splits5, shuffleTrue, random_state42) param_grid_svm { svm__C: [0.1, 1, 10, 100], svm__gamma: [0.001, 0.01, 0.1, scale] } grid_svm GridSearchCV( pipeline_svm, param_gridparam_grid_svm, scoringroc_auc, cvcv, n_jobs-1 ) grid_svm.fit(X_train, y_train) print(最优参数:, grid_svm.best_params_) print(最优交叉验证 AUC:, grid_svm.best_score_.round(4)) print(测试集 AUC:, roc_auc_score(y_test, grid_svm.predict_proba(X_test)[:, 1]).round(4))逻辑说明Pipeline 里的第一步 scaler 会在每一折交叉验证中重新执行 fit_transform而对外部传入的 X_train 只做整体 fit。GridSearchCV 遍历 param_grid 里所有参数组合对每组参数做 5 折交叉验证取平均 AUC 作为打分。对 SVM 来说候选组合是 4×416 组每组跑 5 折一共 80 次训练对这份数据量也就是几秒的事。n_jobs-1 让所有 CPU 核心并行网格搜索就不会等得人发慌。参数说明param_grid 的键名必须带 svm__ 前缀这是 Pipeline 里对子模型参数寻址的语法——两个下划线前面是流水线里那一步的名字后面才是真实参数名。scoring 选 roc_auc 而不是 accuracy因为肿瘤数据类别不完全均衡准确率在后续会暴露出虚高的问题。交叉验证用 StratifiedKFold 而不是普通 KFold保证每折里良恶性比例和整体一致。4.2 参数网格设计每种算法值得搜索的候选集网格搜索不是把参数范围拍脑袋定得越大越好而是结合数据规模给每类算法一个合理的搜索空间。网格太粗会漏掉好参数太细则容易过拟合到验证集上。在肿瘤识别这种 455 个训练样本的条件下我一般这样设置四个模型的候选集模型搜索参数候选值理由逻辑回归C[0.01, 0.1, 1, 10]正则强度控制过拟合与欠拟合平衡SVMC, gammaC: [0.1, 1, 10, 100], gamma: [0.001, 0.01, 0.1, scale]两个参数共同决定决策边界复杂度决策树max_depth, min_samples_leafdepth: [3, 5, 7], leaf: [3, 5, 10]树深和叶节点大小决定剪枝力度KNNn_neighbors, weightsK: [3, 5, 7, 9, 15], weights: [uniform, distance]K 值决定平滑度权重策略影响局部结构逻辑说明这个表格不是随便填的。逻辑回归的 C 在对数尺度上取 4 个点能覆盖从强正则到弱正则的主流区间SVM 的 C 和 gamma 联合搜索时要注意 C 大配 gamma 小、C 小配 gamma 大这两类组合各有意义前者是强惩罚配合平滑边界后者是弱惩罚配合复杂边界决策树搜 3/5/7 三个深度结合叶节点最小样本数 3/5/10已经覆盖了从欠拟合到过拟合的主要区间KNN 的 K 值取奇数是为了避免投票打平weights 两种策略都搜一下往往能找到 1-2 个百分点的提升。参数说明网格搜索的候选值不需要太密每个参数 3 到 4 个档位就够。候选组合乘积会指数膨胀比如 SVM 4×416 次、KNN 5×210 次还能接受如果再加一个 metric 参数进去变成 5×2×330 次在树模型上还行在 KNN 上也没压力但收益通常很小。记住一个原则网格搜索的作用是找到参数量级而不是找到精确到小数点后三位的“最优值”。4.3 用 ROC-AUC 对比四个模型而非只比准确率网格搜索跑完后四个模型各有一组最优参数。下一步是把它们放到同一份测试集上做最终对比。这里要特别提醒不要只看准确率一个指标。肿瘤数据良恶性比例约 6:4一个“永远预测良性”的笨模型都能有六成准确率。准确率对类别不平衡不敏感而 ROC-AUC 衡量的是模型在不同阈值下区分两类的能力这个指标在医学诊断场景里更有说服力——它回答的是“随机抽一个恶性样本和一个良性样本模型有多大把握把恶性样本排在前面”。from sklearn.metrics import roc_auc_score models { LogisticRegression: grid_lr.best_estimator_, SVM: grid_svm.best_estimator_, DecisionTree: grid_tree.best_estimator_, KNN: grid_knn.best_estimator_ } for name, model in models.items(): proba model.predict_proba(X_test)[:, 1] auc roc_auc_score(y_test, proba) acc accuracy_score(y_test, model.predict(X_test)) print(f{name}: ACC{acc:.4f}, AUC{auc:.4f})逻辑说明这段代码统一用 predict_proba 取正类概率计算 AUC而不是用 predict 的标签。AUC 不受分类阈值影响它看的是概率排序能力准确率则依赖默认的 0.5 阈值如果两类先验概率差别大0.5 并不是最优阈值。肿瘤识别项目里往往可以通过调阈值来提升敏感度或特异度所以把 AUC 作为选模型的主指标更稳。源码里如果在每个模型训练后都打印了 AUC你要确保它们用的都是同一份 X_test 和 y_test这是对比公平性的前提。参数说明在最终对比时四个模型都应该是“已经用网格搜索选出最优参数并在训练集上重新拟合”的状态也就是 best_estimator_ 属性而不是再用之前手调的参数。如果某个模型在网格搜索里的最优参数就是默认参数也不要意外——肿瘤数据上很多模型的默认参数就已经够用调参的收益在 1 到 3 个百分点之间多数时候是安全的。5. 常见问题与避坑肿瘤识别项目里反复出现的五个坑5.1 现象不缩放特征就训练 SVM 或 KNN准确率和 AUC 双双掉到离谱原因是 RBF 核和距离度量对特征量纲极其敏感。肿瘤数据里面积均值可能是 600 多半径均值才 14 左右欧氏距离几乎完全被面积、周长这类大数值特征控制其他特征的信息形同虚设。解决方法是严格按“先切分、后标准化、只 fit 训练集”的流程操作并把标准化器放进 Pipeline让交叉验证的每一折都重新学习缩放参数。5.2 现象在切分之前对全量数据做了标准化测试集 AUC 虚高 2 到 3 个百分点原因说起来很反直觉scaler 在全量数据上 fit 时已经“见过”测试集测试集的均值和标准差被并入了标准化参数后续验证集评估相当于开卷考试。解决方法是把标准化挪到 train_test_split 之后并且只对训练集调用 fit_transform、对测试集调用 transform。这也是 GridSearchCV 必须配合 Pipeline 使用的根本原因——你不记得每个细节Pipeline 会替你记住。5.3 现象模型的准确率达到 95% 以上但医生反馈“漏诊了”原因是只看准确率掩盖了恶性样本的识别短板。准确率是总体指标如果模型偏向预测良性恶性样本被误判为良性的代价在准确率里体现不出来。肿瘤场景里漏掉一个恶性病例的后果远大于把良性误判为恶性。解决方法是同时看 recall召回率和 confusion matrix把类别 0恶性的 recall 单独打印出来如果低于 90%就要考虑调整分类阈值、改用 class_weightbalanced 或换用更复杂的模型。5.4 现象决策树不限制深度训练集准确率 100%测试集掉到 85% 以下原因是不限深度的树会一直分裂到每个叶节点只剩一个样本等于把训练集每个点都背了下来。肿瘤数据只有 455 个训练样本背下来并不难但泛化几乎为零。解决方法是设置 max_depth 在 3 到 7 之间配合 min_samples_leaf 至少 3 到 5。如果只调一个参数优先调 max_depth它对过拟合的控制最直接。5.5 现象网格搜索跑完best_score_ 很高但用于新数据时表现明显差一截原因是网格搜索本身在验证集上做了多次比较选的“最优参数”可能是在这 5 折验证集上表现得最好的那个却不一定在新数据上最强。这不是代码错误而是超参数选择的固有偏差。缓解办法是网格搜索后不要急着用 best_estimator_ 做最终报告而是再把最优参数重新在训练集上训练一遍并单独用留出的测试集评估一次更严谨的做法是嵌套交叉验证但肿瘤数据量小普通做法足够。还有一条经验把网格搜索结果当作起点在最优参数邻域再做一个更细的局部搜索往往能找到真正稳定的组合。6. 让预测结果能说服医生特征贡献、混淆矩阵与模型验证6.1 特征重要性模型凭什么说这是恶性肿瘤肿瘤识别项目做到最后一定会被问一个问题模型说这是恶性依据是什么对逻辑回归和决策树答案藏在模型内部对 SVM 和 KNN需要借助特征重要性工具从外部解释。决策树直接暴露 feature_importances_逻辑回归可以看权重系数SVM 没有天然的特征重要性但 permutation importance置换重要性能给出一个经验性答案。from sklearn.inspection import permutation_importance # 对网格搜索得到的最优 SVM 做置换重要性分析 result permutation_importance( grid_svm.best_estimator_, X_test, y_test, n_repeats10, # 每个特征随机打乱 10 次 scoringroc_auc, random_state42 ) # 打印重要性最高的 5 个特征 import numpy as np feature_names data.feature_names sorted_idx result.importances_mean.argsort()[::-1][:5] for i in sorted_idx: print(f{feature_names[i]}: {result.importances_mean[i]:.4f})逻辑说明置换重要性的原理是把某个特征的值随机打乱再测模型 AUC 下降多少。下降越多说明模型越依赖这个特征。这段代码跑 10 次重复是为了消除随机打乱的波动。在这个数据集上通常 worst perimeter、worst concave points、worst area 这类“最差值”特征会排在最前面这个结论符合病理直觉——恶性肿瘤往往在局部区域表现出极端形态而不是平均值异常。参数说明n_repeats 建议至少 10太少结果抖动大scoring 用 roc_auc 而不是默认的 accuracy和之前选模型的标准保持一致。置换重要性是解释工具不是训练工具它不会改变模型本身。6.2 混淆矩阵与 ROC把一家模型的能力摆到明处模型对比的最后一步是把最优模型通常是 SVM的混淆矩阵和 ROC 曲线画出来。混淆矩阵能直观显示模型在哪一类上犯错ROC 曲线则展示模型在不同阈值下的敏感性/特异性权衡。import matplotlib.pyplot as plt from sklearn.metrics import ConfusionMatrixDisplay, roc_curve best_model grid_svm.best_estimator_ # 混淆矩阵 ConfusionMatrixDisplay.from_estimator( best_model, X_test, y_test, display_labels[恶性, 良性], cmapBlues ) plt.show() # ROC 曲线 y_proba best_model.predict_proba(X_test)[:, 1] fpr, tpr, _ roc_curve(y_test, y_proba) plt.plot(fpr, tpr, labelfSVM (AUC{roc_auc_score(y_test, y_proba):.3f})) plt.plot([0, 1], [0, 1], linestyle--, colorgray) plt.xlabel(假阳性率) plt.ylabel(真阳性率) plt.legend() plt.show()逻辑说明混淆矩阵里的行是真实类别、列是预测类别。关注左下角的恶性误判为良性的数量这个数字在肿瘤识别里最危险。ROC 曲线的假阳性率是误诊风险、真阳性率是检出能力对角线代表随机猜测。AUC 超过 0.95 说明模型有实际参考价值。如果 ROC 曲线在左下角就急剧上升说明模型在低阈值下就能高效检出恶性样本这对筛查场景很有意义。6.3 进阶路线投票集成与概率校准四种模型单独跑完后一个自然的延伸是用 VotingClassifier 做软投票集成把逻辑回归、SVM、决策树、KNN 的概率输出加权平均。对肿瘤数据这种中维小样本集成往往能在 AUC 上再提升 0.5 到 1 个百分点。另一个值得做的验证是概率校准——用 CalibratedClassifierCV 把 SVM 的概率输出校准到更接近真实频率这样预测出的 0.9 兆的概率才真正可信。我现在的固定习惯是拿到这类项目先看标签分布和特征量纲再决定选哪条模型路线网格搜索只作为参数量级参考不做最终结论每次报告都同时附上准确率、AUC、混淆矩阵和特征重要性少一个都不踏实。这几步做到位之后这份源码里的四种算法就不再是黑匣子式的调用而是一套你能随时换数据、换业务场景的通用排查框架。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。