news 2026/10/1 17:33:36

MATLAB实战:SVM-KNN组合分类器在信用风险评分卡中的应用与调优

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MATLAB实战:SVM-KNN组合分类器在信用风险评分卡中的应用与调优

简介:这份资源面向机器学习初学者与需要完成分类实验的开发者,围绕支持向量机(SVM)与K近邻(KNN)两种经典算法,重点给出二者组合模型SVM-KNN的MATLAB实现思路。SVM擅长小样本与非线性分类,KNN则依赖实例邻居投票,组合后可对SVM预测结果进行校正,缓解过拟合或欠拟合,提升泛化能力,适用于信用风险识别等复杂分类场景。压缩包共4个文件,约1.28MB,包含m脚本、csv数据集、caj研究文献及zip压缩包,分别对应代码实现、实验数据、理论参考与配套资料,便于对照理解数据预处理、参数选择与模型调优流程。目前已有320人学习下载,读者可借助其中的脚本与数据复现SVM-KNN训练、预测与评估过程,并参考文献深入掌握组合模型的原理与调参细节。

1. 拆开 svm-knn.rar:一份能跑通的 MATLAB 组合分类资源

商业银行信用风险评分卡做到最后,很多人会卡在同一个地方:单模型 AUC 上不去,SVM 在边界样本上反复横跳,KNN 又被高维特征拖到计算爆炸。svm-knn.rar 这份资源就是冲着这个场景来的——它把 SVM 和 KNN 串成一个两阶段分类器,SVM 先做粗判,KNN 在支持向量附近做局部校正,MATLAB 实现,附带PCA-SVM-KNN.m、shuju2.csv和一篇商业银行信用风险模型研究的 caj 论文。资源包里还有osu-svm-3.0.zip这个老牌 SVM 工具箱,以及一个「新建文件夹 (2)」存放中间产物。适合谁?手头有 MATLAB、做过信用评分或二分类、想搞明白组合模型到底怎么落地的人。不适合指望开箱即用调个参就出论文的人,因为这份代码的参数和数据结构需要你自己对齐。

2. SVM 与 KNN 的互补逻辑:为什么组合比单打独斗稳

2.1 两个算法的失效边界在哪

SVM 的核心是找一个最大间隔超平面,RBF 核把低维不可分映射到高维可分。它在小样本、高维、非线性场景下表现稳定,但有两个软肋:一是 C 惩罚参数和 gamma 核宽选不好,边界样本会被强行拉进错误一侧,表现为过拟合;二是它输出的是决策函数值,离超平面越近的样本,置信度越低,这些样本恰恰是最容易分错的。

KNN 是懒惰学习,不训练,预测时找 K 个最近邻投票。它的优势在于对局部密度敏感,样本分布复杂时能靠邻居把边界「掰」回来。但 KNN 在高维下距离度量失效(维度灾难),且计算量随样本数线性增长,信用数据动辄几千条、几十个特征,直接上 KNN 会很慢。

组合的逻辑就清楚了:SVM 负责全局划分,把大部分样本分对;KNN 只在 SVM 置信度低的区域介入,用局部邻居做二次判断。这样既保留了 SVM 的泛化能力,又用 KNN 补上了边界样本的短板。资源里的PCA-SVM-KNN.m文件名暗示了还有一步 PCA 降维,这是为了缓解 KNN 的维度灾难,常见做法是先降到累计方差贡献率 85% 以上的主成分,再喂给 KNN。

2.2 组合模型的三种串法

不是所有 SVM+KNN 都叫组合模型,串法不同,效果差很多。第一种是级联校正:SVM 先预测,把预测置信度低于阈值的样本挑出来,交给 KNN 重新判。第二种是并行投票:SVM 和 KNN 各出一票,加权或多数决定。第三种是特征拼接:把 SVM 的决策值作为新特征,和原始特征一起送进 KNN。资源里的实现更接近第一种,因为PCA-SVM-KNN.m的命名顺序和论文标题「基于 SVM_KNN 的商业银行信用风险模型研究」都指向「先 SVM 后 KNN」的流程。

级联校正的关键参数是置信度阈值。阈值太高,KNN 介入太少,等于没用;阈值太低,KNN 介入太多,计算量飙升且可能把 SVM 分对的样本改错。我一般会先用 SVM 跑一遍交叉验证,看决策值分布,把阈值设在决策值绝对值最小的 10%~20% 分位附近,再微调。

2.3 数据预处理的硬性要求

信用数据通常包含年龄、收入、负债率等量纲差异极大的特征。SVM 对尺度敏感,KNN 依赖距离度量,两者都要求归一化。资源里的shuju2.csv需要你先检查缺失值和异常值,常见做法是用中位数填充缺失,用 3σ 或 IQR 截断异常。归一化用 z-score 或 min-max 都行,但训练集和测试集必须用同一套参数,否则信息泄露。

PCA 降维要在归一化之后做,且只在训练集上拟合,再变换测试集。这一步翻车的人不少,直接把全量数据丢进 PCA,测试集信息混进训练,交叉验证分数虚高,上线就崩。

3. 在 MATLAB 里跑通 SVM-KNN:从 fitcsvm 到校正预测

3.1 环境与文件准备

资源包解压后,核心文件是PCA-SVM-KNN.m、shuju2.csv,osu-svm-3.0.zip是第三方 SVM 工具箱,如果你用 MATLAB 自带的fitcsvm,这个 zip 可以不解压。但如果你要复现论文里的老版本结果,可能需要它,因为早期 MATLAB 没有fitcsvm,用的是 OSU SVM 工具箱的接口。

先把shuju2.csv读进来,确认列名和标签列。信用数据一般最后一列是标签,0/1 或 -1/1。MATLAB 的readtable读进来是 table,fitcsvm接受矩阵或 table,但 table 需要指定响应变量名。

% 读取数据,假设最后一列是标签 data = readtable('shuju2.csv'); % 检查前几行和列名 head(data); % 分离特征和标签,假设最后一列叫 'label' X = data{:, 1:end-1}; Y = data{:, end}; % 检查缺失值 if any(ismissing(X), 'all') % 用中位数填充缺失 X = fillmissing(X, 'constant', median(X, 'omitnan')); end

这段代码做了三件事:读数据、分离特征标签、缺失值填充。fillmissing的constant模式配合median是按列填充,避免整列被一个全局中位数带偏。如果你的标签列名不是label,把data{:, end}改成对应列名。

3.2 归一化与 PCA 降维

% z-score 归一化,训练集参数应用到测试集 [X_train, X_test, Y_train, Y_test] = dividerand(X', Y', 0.7, 0.3); % 注意 dividerand 返回的是转置后的,需要转回来 X_train = X_train'; X_test = X_test'; Y_train = Y_train'; Y_test = Y_test'; % 计算训练集均值和标准差 mu = mean(X_train); sigma = std(X_train); % 避免除零 sigma(sigma == 0) = 1; X_train_norm = (X_train - mu) ./ sigma; X_test_norm = (X_test - mu) ./ sigma; % PCA 降维,保留 85% 方差 [coeff, score, latent, tsquared, explained] = pca(X_train_norm); cum_explained = cumsum(explained); k = find(cum_explained >= 85, 1); X_train_pca = score(:, 1:k); % 测试集用训练集的 coeff 变换 X_test_pca = (X_test_norm - mu) * coeff(:, 1:k);

dividerand按 7:3 随机划分,注意它返回的矩阵是转置的,这是 MATLAB 老函数的坑。归一化用训练集的mu和sigma,测试集直接套用,这是防止信息泄露的关键。PCA 的coeff只在训练集上算,测试集用同一个coeff投影,k是累计方差达到 85% 的主成分数。如果你的数据特征数不多(比如少于 10),PCA 可以跳过,直接归一化后训练。

3.3 训练 SVM 并提取置信度

% 训练 SVM,RBF 核,用交叉验证选参 template = templateSVM('KernelFunction', 'rbf', ... 'BoxConstraint', 1, 'KernelScale', 'auto'); svm_model = fitcsvm(X_train_pca, Y_train, ... 'KernelFunction', 'rbf', 'BoxConstraint', 1, ... 'KernelScale', 'auto', 'Standardize', false); % 预测并获取决策值 [svm_label, svm_score] = predict(svm_model, X_test_pca); % svm_score 两列,取正类列的绝对值作为置信度 confidence = abs(svm_score(:, 2)); % 设定阈值,低于阈值的样本交给 KNN threshold = prctile(confidence, 20); % 最低 20% 置信度 idx_low_conf = confidence < threshold;

fitcsvm的BoxConstraint对应 C 参数,KernelScale对应 gamma,'auto'让 MATLAB 用启发式方法选。predict返回的svm_score是决策值,二分类下两列,第二列是正类分数。prctile取 20% 分位作为阈值,意味着置信度最低的 20% 样本会被 KNN 重新判。这个比例可以调,信用数据一般 10%~30% 之间。

3.4 KNN 校正与结果评估

% 对低置信度样本用 KNN 校正 knn_model = fitcknn(X_train_pca, Y_train, 'NumNeighbors', 5, ... 'Distance', 'euclidean', 'Standardize', false); % 只对低置信度测试样本预测 knn_label = predict(knn_model, X_test_pca(idx_low_conf, :)); % 合并结果 final_label = svm_label; final_label(idx_low_conf) = knn_label; % 混淆矩阵和准确率 cm = confusionmat(Y_test, final_label); accuracy = sum(diag(cm)) / sum(cm(:)); fprintf('SVM-KNN 准确率: %.4f\n', accuracy); % 对比纯 SVM svm_acc = sum(svm_label == Y_test) / length(Y_test); fprintf('纯 SVM 准确率: %.4f\n', svm_acc);

fitcknn的NumNeighbors是 K 值,信用数据一般 3~7,太大平滑过度,太小受噪声影响。这里只对idx_low_conf为真的测试样本做 KNN 预测,其余保留 SVM 结果。最后用confusionmat算混淆矩阵,对比纯 SVM 的准确率。如果 KNN 校正后反而降了,说明阈值设太低或 K 值不合适,回到 3.3 调。

4. 避坑与排查:组合模型常见的五个翻车点

4.1 准确率虚高,交叉验证和测试集差距大

现象:交叉验证准确率 0.95,测试集只有 0.78。原因:归一化或 PCA 在全量数据上拟合,测试集信息泄露到训练过程。解决:归一化的mu、sigma和 PCA 的coeff必须只在训练集上计算,测试集用transform逻辑套用。资源里的PCA-SVM-KNN.m如果直接对全量X做pca,需要改成先划分再拟合。

4.2 KNN 校正后准确率不升反降

现象:纯 SVM 0.82,组合后 0.79。原因:置信度阈值设得太低,KNN 介入过多,把 SVM 分对的边界样本改错了。解决:把prctile的百分位从 20 降到 10 或 5,只让最不确定的样本走 KNN。同时检查 KNN 的 K 值,信用数据噪声大时 K=3 比 K=5 更稳。

4.3 fitcsvm 报错「响应必须包含两个类别」

现象:训练时报错,说标签类别不对。原因:shuju2.csv的标签列可能是 0/1 数值,但fitcsvm要求分类标签是 categorical 或字符。解决:Y = categorical(Y)转一下,或者用Y = Y > 0转逻辑值。如果标签是 -1/1,fitcsvm能直接处理,但predict返回的 score 列顺序要确认。

4.4 PCA 降维后维度还是太高

现象:k算出来接近原始特征数,KNN 依然慢。原因:信用数据特征间相关性低,PCA 压缩效果差。解决:先做特征筛选,用fscmrmr或相关性分析去掉冗余特征,再 PCA。或者直接跳过 PCA,用fitcknn的'NSMethod'设为'kdtree'加速,但 kdtree 在高维下也会退化。

4.5 osu-svm-3.0.zip 解压后编译失败

现象:mex编译报错,找不到编译器。原因:OSU SVM 工具箱是 C 写的,需要 MATLAB 配置 C 编译器。解决:运行mex -setup选一个已安装的 C 编译器,Windows 下常用 MinGW-w64。如果只是用fitcsvm,这个 zip 可以不解压,不影响主流程。

5. 进阶技巧:用决策值分布反推阈值和 K 值

跑通基础流程后,真正决定组合模型上限的是阈值和 K 值的配合。我一般不会盲调,而是先把 SVM 的决策值分布画出来,看边界样本的聚集情况。

% 画 SVM 决策值分布 figure; histogram(svm_score(:, 2), 50); xlabel('SVM 决策值'); ylabel('样本数'); title('SVM 决策值分布'); % 标出候选阈值 hold on; yline(prctile(svm_score(:, 2), 10), 'r--', '10% 分位'); yline(prctile(svm_score(:, 2), 20), 'g--', '20% 分位'); hold off;

如果分布是双峰,说明两类分得开,阈值可以设低一点,KNN 少介入;如果分布是单峰且集中在 0 附近,说明边界模糊,阈值要设高,让 KNN 多介入。K 值的选择可以用交叉验证,写个循环跑 K=3,5,7,9,看哪个在验证集上准确率最高。

% K 值交叉验证 K_list = [3, 5, 7, 9]; acc_list = zeros(length(K_list), 1); for i = 1:length(K_list) knn_tmp = fitcknn(X_train_pca, Y_train, 'NumNeighbors', K_list(i)); cv_tmp = crossval(knn_tmp, 'KFold', 5); acc_list(i) = 1 - kfoldLoss(cv_tmp); end [best_acc, best_idx] = max(acc_list); fprintf('最佳 K=%d, 验证准确率=%.4f\n', K_list(best_idx), best_acc);

这段代码对每个 K 值做 5 折交叉验证,取准确率最高的。注意这是对 KNN 单独做的,实际组合模型里 KNN 只作用于低置信度样本,所以最佳 K 可能和单独 KNN 不同。更严谨的做法是把阈值和 K 值做成网格搜索,但计算量大,信用数据几千条以内可以接受。

还有一个容易被忽略的点:SVM 的BoxConstraint和KernelScale对决策值分布影响很大。C 越大,边界越硬,决策值绝对值越大,低置信度样本越少;gamma 越大,核越窄,过拟合风险越高。我一般先用bayesopt或fitcsvm自带的OptimizeHyperparameters粗调一轮,再固定参数调阈值和 K。

从那以后我每次做组合模型,都强制先画决策值分布,再定阈值,最后网格搜 K。这套流程跑下来,信用数据上的组合模型通常比纯 SVM 高 2~5 个百分点,代价是训练时间多 30% 左右。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 17:30:38

Java+SSM+Django学费管理系统实战:从设计到部署

校务缴费那块儿&#xff0c;我建议你可以先试试这个思路——用Java、SSM、Django这一套技术组合去搭一个学费管理系统。这东西不是新鲜概念&#xff0c;但真正做扎实、能在实际场景里跑起来&#xff0c;还挺考验细节的。我是做Java后端开发的&#xff0c;这两年帮朋友和几个小型…

作者头像 李华
网站建设 2026/10/1 17:30:37

CPU到底是什么?从原理到天梯图,一文读懂核心参数与性能排查

刷到这篇文章的朋友&#xff0c;多半被CPU这几个词反复折腾过——天梯图看得眼花&#xff0c;参数表读不明白&#xff0c;电脑一卡就觉得是CPU不行。我在装机、排查问题、研究调度逻辑这些年里发现&#xff0c;九成困惑都源于同一个问题&#xff1a;对CPU这个“大脑”本身不够了…

作者头像 李华
网站建设 2026/10/1 17:30:20

文玩电商系统:规格爆炸与密码加盐的Java实战方案

简介&#xff1a;这是一套面向计算机专业本科生的毕业设计级Java Web实战项目&#xff0c;聚焦文玩电商场景&#xff0c;完整覆盖需求分析、系统开发到成果展示全流程。资源包含可直接运行的JSPServletMySQL源码、结构清晰的毕业论文、答辩用PPT、开题报告、任务书、数据库SQL文…

作者头像 李华
网站建设 2026/10/1 17:29:43

计算机网络基础怎么学?从抓包到期末复习的实用路线

1. 为什么建议从“诚实面对期末考试和面试题”开始规划学习路线 先聊一个几乎所有网络初学者都会踩的坑。很多人拿到谢希仁的《计算机网络》或者《计算机网络&#xff1a;自顶向下方法》&#xff0c;第一反应是从第一章的概述开始&#xff0c;把协议栈背到第三层&#xff0c;结…

作者头像 李华
网站建设 2026/10/1 17:29:19

校园失物招领系统开发实战:SpringBoot+Vue全栈实现JWT鉴权与状态流转

2. 核心模块实现与实操细节2.1 登录鉴权与权限控制的落地方式登录模块是整个系统的基础&#xff0c;这里我建议直接采用 JWT(JSON Web Token) 方案。比起传统的 Session 方案&#xff0c;JWT 是前后端分离场景下的标配&#xff0c;而且在毕业答辩时也能成为你的加分项——你可以…

作者头像 李华
网站建设 2026/10/1 17:28:34

工业指针仪表关键点检测:YOLOv8+三格式标签开箱即训

简介&#xff1a;本资源是面向工业视觉检测初学者与YOLO模型实践者的高质量指针式仪表识别数据集&#xff0c;专为解决制造业现场仪表读数自动化难题而构建。包含1000张真实工业场景高清图片&#xff0c;全部经LabelImg精细标注&#xff0c;提供VOC&#xff08;XML&#xff09;…

作者头像 李华