ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于PSO-NN、SVM、KNN、DT的多特征数据分类预测工具箱实现

基于PSO-NN、SVM、KNN、DT的多特征数据分类预测工具箱实现 简介在机器学习领域分类预测是处理结构化数据的核心任务其目标是根据输入特征自动识别样本所属类别。其基本原理是通过算法学习特征与标签之间的映射关系构建决策边界。该技术的价值在于能够自动化、高精度地解决从垃圾邮件过滤到医疗诊断等诸多实际问题。常见的应用场景包括工业设备故障诊断、金融风控和图像识别等。针对不同数据分布单一模型往往存在局限因此集成多种经典算法进行对比评估成为提升模型鲁棒性的关键实践。本文聚焦于粒子群优化神经网络PSO-NN、支持向量机SVM、K近邻KNN和决策树DT的集成工具箱通过PSO优化解决神经网络初始权重敏感问题并利用网格搜索自动调优SVM参数为多特征分类任务提供一个公平、可复现的模型对比平台。1. 项目缘起当你的数据分类任务需要“多面手”时在数据分析和机器学习的世界里分类预测是一个永恒的核心课题。无论是判断一封邮件是否为垃圾邮件二分类还是识别一张图片中的动物是猫、狗还是兔子多分类我们都在寻找一个能准确、高效地划清数据边界的模型。然而现实世界的数据往往不是“非黑即白”那么简单。它们可能由多个特征维度构成彼此之间关系复杂线性不可分或者存在噪声。这时把宝全押在单一模型上就像只带一把螺丝刀去修理一台复杂的机器很可能事倍功半。我最近在做一个工业设备故障诊断的项目数据来自多个传感器包括振动、温度、电流等十几个特征。目标是根据这些特征判断设备是“正常”、“轻微磨损”还是“严重故障”一个典型的多分类问题。一开始我习惯性地用支持向量机SVM去试效果时好时坏调参调到怀疑人生。后来尝试了决策树DT虽然可解释性强但容易过拟合。这让我意识到没有一个模型是“银弹”。不同的模型其内在的“思考方式”不同擅长处理的数据分布也不同。SVM试图找到一个最优的超平面来分隔数据适合中小规模、特征清晰的场景K近邻KNN基于“物以类聚”的直观思想对局部数据结构敏感决策树通过一系列“是/否”问题构建规则直观但可能不稳定而神经网络NN尤其是经过优化算法调校的神经网络则具备强大的非线性拟合能力。于是一个想法自然浮现为什么不把这些“多面手”都请来让它们同台竞技根据具体的数据集特性选出最适合的那一个呢这就是我动手实现这个“基于PSO-NN、SVM、KNN、DT的多特征数据分类预测”工具箱的初衷。它不是一个炫技的复杂系统而是一个务实、可复现、可比较的解决方案框架。特别是其中的PSO-NN粒子群算法优化的神经网络它解决了神经网络训练中初始权重和偏置选择这个老大难问题通过群体智能优化让网络更快、更准地找到最优解避免了传统梯度下降法可能陷入局部最优的尴尬。这个工具箱适合谁如果你是正在做课程设计、毕业设计的学生它提供了一套完整的、可直接运行的代码和示例数据帮你快速搭建起分类预测的基线系统。如果你是数据分析师或算法工程师它为你提供了一个标准化的模型对比流程让你在项目初期能高效地评估不同模型的潜力为后续的深度优化指明方向。接下来我将从数据准备开始一步步拆解这个工具箱的每一个模块并分享我在实现和测试过程中踩过的坑和总结的经验。2. 工具箱全景与核心设计思路在深入代码细节之前我们先从整体上把握这个工具箱的架构和设计哲学。它的核心目标不是追求某个单一模型的极致性能而是构建一个公平、透明、可扩展的模型对比实验平台。整个流程遵循经典的数据挖掘Pipeline数据加载 - 预处理 - 数据集划分 - 模型训练与优化 - 评估与可视化。但在这个通用流程中我们为每个环节注入了针对多模型对比的特别考量。2.1 核心模块分解整个项目主要包含以下几个核心模块数据管理模块负责读取、清洗和标准化数据。支持常见的.mat,.csv,.xlsx格式。这是所有模型公平比较的基石糟糕的数据预处理会直接扭曲比较结果。模型仓库模块集成了四大经典分类器。PSO-NN粒子群优化神经网络这是我们工具箱的“特色菜”。传统的神经网络如BP网络训练严重依赖于初始参数且容易陷入局部最优。PSO-NN引入粒子群优化算法来优化神经网络的初始权重和阈值偏置让网络从一个更优的起点开始训练从而提升收敛速度和分类精度。SVM支持向量机选择了径向基函数RBF作为默认核函数因为它能通过调整gamma参数灵活地映射数据到高维空间处理非线性问题的能力很强。我们实现了自动化的网格搜索Grid Search来寻找最优的惩罚系数C和核参数gamma。KNNK近邻实现简单但效果常常出人意料。关键在于K值的选择和距离度量方式。我们提供了交叉验证来帮助确定最佳的K值。DT决策树以CART算法为基础。它的最大优势是模型可解释性强可以生成清晰的“如果-那么”规则。我们重点控制了树的深度和最小叶子节点样本数以防止过拟合。评估与可视化模块这是对比环节的“裁判席”。不仅计算准确率、精确率、召回率、F1分数等通用指标还会为每个模型生成混淆矩阵Confusion Matrix并绘制ROC曲线针对二分类或分类边界可视化图针对低维特征。这些图表是理解模型“如何犯错”的绝佳工具。2.2 为什么选择这四种模型这是一个有意的组合涵盖了不同的机器学习范式基于实例的学习 (Instance-based)KNN。它不构建显式模型只是记住所有训练数据预测时进行局部计算。对数据局部结构敏感但计算开销大。基于规则的学习 (Rule-based)决策树。它学习一组决策规则形成树形结构。模型直观但可能对数据微小变化敏感高方差。基于间隔最大化的学习 (Margin-based)SVM。致力于寻找一个能使不同类别间隔最大的分离超平面。泛化能力通常较好但对参数和核函数选择敏感。基于连接主义的学习 (Connectionist)神经网络。通过多层非线性变换来学习复杂的特征表示。拟合能力极强但可解释性差且训练过程不稳定PSO正是用来缓解此问题。将它们放在一起你就能从多个角度“审视”你的数据。如果所有模型在某类数据上都表现很差那很可能问题出在数据或特征本身如果某个模型显著优于其他那说明该模型的假设与你的数据分布最为匹配。2.3 项目文件结构预览一个清晰的文件结构是项目可维护、可复现的关键。我的项目目录大致如下Multi_Feature_Classification_Toolbox/ │ ├── data/ # 数据文件夹 │ ├── sample_data_binary.mat # 二分类示例数据 │ └── sample_data_multi.mat # 多分类示例数据 │ ├── src/ # 源代码文件夹 │ ├── main.m # 主运行脚本流程控制器 │ ├── load_and_preprocess_data.m # 数据加载与预处理函数 │ ├── train_test_split.m # 数据集划分函数 │ ├── model_pso_nn.m # PSO-NN模型训练与预测函数 │ ├── model_svm.m # SVM模型训练与预测函数 │ ├── model_knn.m # KNN模型训练与预测函数 │ ├── model_dt.m # 决策树模型训练与预测函数 │ ├── evaluate_model.m # 模型评估函数 │ └── plot_results.m # 结果可视化函数 │ ├── results/ # 结果输出文件夹运行后生成 │ ├── figures/ # 保存的图片混淆矩阵、ROC曲线等 │ └── metrics_report.txt # 文本格式的评估指标汇总 │ └── README.md # 项目说明文档这种模块化的设计使得你可以轻松地替换数据、调整某个模型的参数或者增加新的分类器如随机森林、XGBoost而无需改动其他部分的代码。3. 数据准备模型竞赛的起跑线俗话说“垃圾进垃圾出”Garbage in, garbage out。在机器学习中数据的质量直接决定了模型性能的上限。我们这个工具箱虽然提供了示例数据但更重要的是教会你如何准备自己的数据因为这才是实际项目中的常态。3.1 数据格式要求为了兼容性工具箱主要支持MATLAB的.mat文件格式。你的数据需要组织成两个关键变量features: 一个m x n的矩阵。其中m是样本数量n是特征数量。每一行代表一个样本每一列代表一个特征。labels: 一个m x 1的列向量。其中包含了每个样本对应的类别标签。对于二分类问题标签通常用0和1表示。对于多分类问题标签建议使用从1开始的连续整数例如1, 2, 3, ...。绝对要避免使用字符串或离散的非连续数字作为标签这会在后续处理中引发很多不必要的麻烦。3.2 数据预处理三部曲原始数据很少能直接喂给模型。预处理至少包含以下三步处理缺失值这是第一步。如果缺失值很少可以直接删除该样本行。如果某个特征缺失严重可以考虑删除该特征列。更常见的方法是使用均值、中位数或众数进行填充。在工具箱的load_and_preprocess_data.m函数中我实现了一个简单的均值填充策略。% 示例查找并填充缺失值 (NaN) [row, col] find(isnan(features)); if ~isempty(row) warning(发现缺失值正在使用特征列的均值进行填充...); for c unique(col) col_mean nanmean(features(:, c)); % 计算非NaN的均值 features(isnan(features(:, c)), c) col_mean; end end特征标准化/归一化这是至关重要的一步尤其对SVM和KNN这类基于距离的模型影响巨大。如果特征A的范围是[0, 1000]而特征B的范围是[0, 1]那么模型会不自觉地认为特征A更重要。我们使用Z-score标准化将每个特征转化为均值为0、标准差为1的分布。% Z-score标准化 [features_normalized, mu, sigma] zscore(features); % mu是均值sigma是标准差需要保存以供预测新数据时使用注意务必使用训练集的mu和sigma来标准化测试集这是一个常见的错误——用全数据集计算参数后再划分会导致数据泄露Data Leakage使评估结果过于乐观。处理类别不平衡如果你的数据中某个类别的样本数远多于其他类别例如正常样本999个故障样本1个大多数模型都会倾向于预测多数类从而得到一个虚高的准确率但对少数类的识别率极差。这时需要采取措施如对少数类进行过采样SMOTE算法、对多数类进行欠采样或在模型层面使用类别权重。在工具箱中我提供了一个简单的计算类别权重的选项可以在SVM和部分决策树实现中应用。3.3 数据集划分策略我们采用最经典的70%-30%的随机划分策略即70%的数据用于训练模型30%的数据用于测试模型性能。为了保证结果的可复现性固定随机数种子是必须的。rng(2024); % 固定随机种子确保每次运行划分结果一致 cv cvpartition(size(features, 1), HoldOut, 0.3); idx_train training(cv); idx_test test(cv); X_train features_normalized(idx_train, :); y_train labels(idx_train); X_test features_normalized(idx_test, :); y_test labels(idx_test);对于小数据集更推荐使用K折交叉验证K-Fold Cross Validation它能更稳定地评估模型性能。在main.m脚本中你可以通过一个开关轻松切换这两种模式。4. 核心模型原理与实现拆解现在我们进入工具箱的核心——四个分类模型的内部。理解它们的工作原理不仅能帮你更好地使用这个工具箱更能让你在模型表现不佳时知道该从何处着手调优。4.1 PSO-NN当群体智能遇上神经网络这是本项目的亮点。传统的误差反向传播BP神经网络采用梯度下降法更新权重但它有两个顽疾一是对初始权重敏感糟糕的初始化会导致收敛缓慢甚至陷入局部最优二是需要手动设置学习率等超参数。粒子群优化PSO是一种模拟鸟群觅食行为的优化算法。每个“粒子”代表一个潜在的解在这里就是神经网络的一组权重和偏置它们在解空间中飞行通过追踪个体历史最优位置和群体历史最优位置来更新自己的速度和位置。PSO-NN的工作流程编码将神经网络的所有连接权重和神经元偏置“拉直”拼接成一个长向量。这个向量就是一个粒子的“位置”。初始化随机生成一群粒子比如50个每个粒子都有一个随机的位置初始权重和速度。评估用每个粒子的位置向量去配置一个神经网络在训练集上做一次前向传播计算预测误差如均方误差MSE。这个误差的倒数或负值就是该粒子的“适应度”Fitness误差越小适应度越高。更新每个粒子记住自己到过的最佳位置pbest整个群体也知道全局最佳位置gbest。粒子根据以下公式更新自己的速度和位置速度更新: v_new w * v_old c1 * rand() * (pbest - pos) c2 * rand() * (gbest - pos) 位置更新: pos_new pos_old v_new其中w是惯性权重c1和c2是学习因子。这个过程模拟了粒子受个体经验和群体经验的影响。迭代重复步骤3和4直到达到最大迭代次数或适应度满足要求。解码与精炼将最终找到的全局最佳位置gbest向量解码回神经网络的权重和偏置。注意PSO找到的是一组优秀的初始参数我们通常还会用这组参数初始化一个传统的BP网络再进行少量epoch的微调Fine-tuning以达到更精确的结果。在model_pso_nn.m中你需要关注几个关键参数particle_num: 粒子数量。太少搜索能力不足太多计算开销大。通常20-50是个不错的起点。max_iter: PSO最大迭代次数。一般50-200次。hidden_layer_size: 神经网络隐藏层神经元个数。这是一个需要根据数据复杂度调整的超参数。nn_train_epochs: PSO找到初始参数后BP网络微调的迭代次数。4.2 SVM寻找最优分隔边界支持向量机的核心思想是最大化分类间隔。对于线性不可分的数据它通过核函数将数据映射到高维空间使其在高维空间中线性可分。我们选择RBF核因为它只需调整一个参数gamma且适用性广。关键参数解析惩罚系数C权衡“分类准确性”和“决策边界复杂度”。C值越大模型越不能容忍分类错误倾向于选择更复杂的边界可能过拟合C值越小允许更多的错误边界更平滑可能欠拟合。RBF核参数gamma定义了单个训练样本的影响范围。gamma越大影响范围越小决策边界越曲折容易过拟合gamma越小影响范围越大边界越平滑容易欠拟合。在model_svm.m中我实现了基于网格搜索Grid Search的自动寻优。它会尝试C [0.01, 0.1, 1, 10, 100]和gamma [0.001, 0.01, 0.1, 1, 10]的所有组合共25种并使用3折交叉验证在训练集上评估每一对参数的性能最终选择在交叉验证上平均准确率最高的那对(C, gamma)来训练最终模型。4.3 KNN用“邻居”投票决定K近邻算法没有显式的训练过程或者说它的“训练”就是记住所有数据。预测时计算待预测样本与所有训练样本的距离找出距离最近的K个“邻居”然后根据这K个邻居的类别通过投票多数表决来决定预测类别。实现要点距离度量最常用的是欧氏距离。对于标准化后的数据欧氏距离是合理的。MATLAB的fitcknn函数默认使用欧氏距离。K值选择这是KNN唯一的超参数。K太小如K1模型对噪声非常敏感容易过拟合K太大模型会过于平滑可能忽略数据的局部特征导致欠拟合。在model_knn.m中我使用了一个简单的循环在K [1, 3, 5, 7, 9]中通过交叉验证选择最优K。标准化再次强调KNN基于距离必须进行特征标准化否则量纲大的特征将主导距离计算。4.4 决策树构建一系列“如果-那么”规则决策树通过递归地选择最优特征进行数据划分直到满足停止条件如节点样本数过少、树深度达到限制等。我们使用CART算法它使用基尼不纯度Gini Impurity作为划分标准。关键参数与剪枝MaxDepth: 树的最大深度。限制深度是防止过拟合最直接有效的方法。MinLeafSize: 叶节点最少样本数。如果一个节点划分后子节点的样本数少于这个值则停止划分。剪枝PruningMATLAB的fitctree函数在训练后可以执行代价复杂度剪枝。这是一种事后剪枝通过比较剪枝前后验证集错误率来决定是否剪枝。在工具箱中我默认开启了剪枝选项这对于控制模型复杂度非常有效。决策树最大的优点是可解释性。你可以使用view(tree, Mode, graph)命令将训练好的树可视化清晰地看到从根节点到叶节点的每一条决策路径。5. 模型评估超越“准确率”的全面审视模型训练好了扔到测试集上跑出一个准确率Accuracy就完事了吗远远不够。尤其是在类别不平衡或者不同类别的误判代价不同的场景下准确率是一个具有欺骗性的指标。5.1 多维度评估指标我们的evaluate_model.m函数计算并输出一套完整的评估指标混淆矩阵Confusion Matrix这是所有评估的基础。一个NxN的矩阵N为类别数行代表真实类别列代表预测类别。对角线上的数字是预测正确的样本数其余则是各种类型的错误。对于二分类我们可以从混淆矩阵中衍生出更细致的指标精确率Precision在所有被预测为正类的样本中真正为正类的比例。Precision TP / (TP FP)。它关注的是预测的准确性。召回率Recall在所有真实为正类的样本中被正确预测出来的比例。Recall TP / (TP FN)。它关注的是查全率。F1分数F1-Score精确率和召回率的调和平均数。F1 2 * (Precision * Recall) / (Precision Recall)。它是一个综合性的指标在两者需要权衡时很有用。对于多分类我们可以计算每个类别的精确率、召回率和F1分数然后计算它们的宏平均Macro-average或加权平均Weighted-average。宏平均对所有类别一视同仁加权平均则根据每个类别的样本数赋予权重。我们的工具箱会同时输出这两种平均值。ROC曲线与AUC仅限二分类ROC曲线描绘了在不同分类阈值下真正例率TPR即召回率和假正例率FPR之间的关系。曲线下的面积就是AUC值它衡量的是模型“排序”的能力将正样本排在负样本前面的能力。AUC越接近1模型性能越好0.5相当于随机猜测。ROC曲线对类别不平衡相对不敏感是一个非常好的综合性指标。5.2 可视化让结果自己说话数字是冰冷的图表是鲜活的。plot_results.m函数会为每个模型生成至少两张图混淆矩阵热图用颜色深浅直观展示分类情况。一眼就能看出模型在哪些类别上容易混淆。ROC曲线图二分类将不同模型的ROC曲线画在同一张图上可以直观比较它们的性能。AUC值最大的模型其曲线通常会包裹住其他曲线。决策边界可视化适用于2-3个特征如果你的特征只有2个或3个或通过PCA降维后这个图极具启发性。它会将特征空间网格化用不同颜色标记每个网格点被模型预测的类别从而画出模型的“决策边界”。对比不同模型的决策边界你能深刻理解它们是如何“思考”的SVM的边界可能是一条光滑的曲线决策树的边界是由多个平行于坐标轴的直线组成的阶梯状KNN的边界则可能是崎岖不平的。5.3 如何解读对比结果当四个模型的评估报告摆在你面前时你应该怎么看看综合排名通常关注测试集上的加权平均F1分数和AUC二分类它们是相对稳健的综合指标。看稳定性对比模型在训练集和测试集上的表现。如果训练集准确率远高于测试集例如95% vs 70%说明模型很可能过拟合了。决策树和未调参的神经网络容易出现这种情况。看弱点仔细分析混淆矩阵。模型是不是总把A类预测成B类这说明这两类特征可能比较相似或者你的特征工程没能很好地区分它们。看效率记录下每个模型的训练时间和预测时间。KNN的训练时间为0只是存储数据但预测时间随数据量线性增长SVM和PSO-NN训练可能较慢但预测很快。这在选择线上部署模型时是一个重要考量。6. 实战演练从运行示例到应用自己的数据理论说了一千遍不如亲手运行一遍。这一章我将带你走一遍完整的流程并分享几个关键的调试技巧和避坑指南。6.1 快速上手运行示例程序环境准备确保你的MATLAB版本在R2018b以上。工具箱主要使用MATLAB自带的统计和机器学习工具箱Statistics and Machine Learning Toolbox以及深度学习工具箱Deep Learning Toolbox用于神经网络。运行前可以用ver命令检查。下载与放置将项目文件夹Multi_Feature_Classification_Toolbox放到你的MATLAB工作路径下或者将其添加到路径addpath(genpath(‘你的路径’))。运行主脚本打开src/main.m文件。在文件开头你会看到一些清晰的配置选项% 用户配置区域 data_type binary; % binary 或 multi 选择使用二分类还是多分类示例数据 use_cross_validation false; % true: 使用5折交叉验证; false: 使用简单划分 models_to_run {PSO-NN, SVM, KNN, DT}; % 选择要运行的模型 % 保持默认设置直接点击“运行”或按F5。程序会依次执行数据加载、预处理、划分然后训练并评估你选中的模型。查看结果所有评估指标会在命令行窗口打印出来。同时在项目根目录下会自动生成一个results文件夹里面保存了所有模型的混淆矩阵图、ROC曲线图等。打开metrics_report.txt你可以看到一个整齐的对比表格。6.2 应用你自己的数据这是本工具箱的核心价值所在。你需要将自己的数据准备成要求的格式。数据转换假设你有一个Excel文件my_data.xlsx第一列是标签后面各列是特征。% 在你的工作区或新建一个脚本中执行 data_table readtable(my_data.xlsx); labels table2array(data_table(:, 1)); % 假设第一列是标签 features table2array(data_table(:, 2:end)); % 剩余列是特征 % 保存为 .mat 文件供主程序调用 save(my_data.mat, features, labels);修改主程序在main.m中找到数据加载部分将路径指向你的my_data.mat。% 在 load_and_preprocess_data.m 函数调用处修改或直接修改该函数内部 [features, labels] load_and_preprocess_data(path/to/your/my_data.mat);调整参数可选对于PSO-NN如果你的数据量很大或特征很多可以适当增加particle_num或max_iter。对于SVM如果网格搜索范围不合适可以调整C_range和gamma_range。6.3 常见问题与调试技巧问题一PSO-NN训练速度非常慢。原因PSO的每次迭代都需要用每个粒子的位置配置一次网络并计算误差如果网络结构复杂隐藏层神经元多、粒子数量多、迭代次数多计算量会呈指数级增长。解决首先确保你的数据已经标准化这能加速收敛。尝试减少hidden_layer_size。一个经验法则是隐藏层神经元数量可以在输入特征数和输出类别数之间通常不要超过输入特征数的两倍。减少particle_num(如降到20-30) 和max_iter(如降到50-100)。PSO的优化效率很高通常不需要太多迭代就能找到不错的区域。在model_pso_nn.m中将nn_train_epochsBP微调次数设小一点比如50-100次。PSO已经提供了很好的初始值不需要长时间微调。问题二SVM的网格搜索耗时太长。原因网格搜索需要训练len(C_range) * len(gamma_range) * k_fold个模型。如果参数范围大、数据量大时间会很长。解决先使用一个粗粒度的网格如C [0.1, 1, 10],gamma [0.01, 0.1, 1]进行快速搜索定位性能较好的区域。然后在较好的区域附近进行更精细的搜索。考虑使用更高效的优化算法如贝叶斯优化但这需要更复杂的实现。问题三决策树在测试集上准确率远低于训练集。原因典型的过拟合。树长得太深记住了训练数据的所有细节包括噪声。解决在model_dt.m中降低MaxDepth参数比如从默认的Inf设为 5 或 10。增大MinLeafSize参数比如从1设为10或更多确保每个叶节点有足够多的样本支撑。确保Prune参数设置为‘on’让MATLAB自动进行代价复杂度剪枝。问题四KNN模型预测速度慢。原因KNN的预测需要计算待测样本与所有训练样本的距离。当训练集很大时例如超过1万个样本预测会成为瓶颈。解决考虑使用KD-Tree或Ball Tree数据结构来加速近邻搜索。MATLAB的fitcknn可以通过‘NSMethod’参数指定。如果数据维度很高特征很多可以考虑使用特征选择或降维如PCA来减少特征数量这能显著降低距离计算的开销。作为一种终极手段可以对训练集进行原型选择即只保留一部分最具代表性的样本但这可能会损失一些精度。7. 进阶思考与项目扩展当你成功运行了工具箱并在自己的数据上得到了初步结果后你可能不满足于此。这里提供几个进阶的方向你可以基于这个工具箱进行扩展使其更加强大和实用。7.1 特征工程比模型选择更重要的一环很多时候模型性能的瓶颈不在于模型本身而在于输入的特征。你可以尝试特征选择使用过滤法如相关系数、卡方检验、包裹法如递归特征消除RFE或嵌入法如L1正则化来选择对分类最重要的特征子集。这能降低噪声、加速训练、有时甚至能提升精度。特征构造根据你的领域知识创造新的特征。例如在振动信号分析中原始时域信号可能不如其频域特征如FFT后的能量有效。降维对于特征数非常多成百上千的情况可以使用主成分分析PCA或线性判别分析LDA进行降维。PCA是无监督的旨在保留最大方差LDA是有监督的旨在最大化类间区分度。7.2 模型集成团结力量大既然我们有了多个表现不错的基模型为什么不把它们组合起来呢模型集成往往能获得比单一模型更稳定、更强大的性能。投票法Voting让四个模型对同一个样本进行预测然后采用“少数服从多数”的原则硬投票或根据每个模型的置信度加权平均软投票来决定最终类别。堆叠法Stacking用四个模型的预测结果作为新的特征训练一个第二层的“元模型”如逻辑回归来做最终决策。这通常能获得最好的效果但实现更复杂。你可以在main.m的末尾添加一个集成模块将前面训练好的四个模型保存下来然后实现上述集成策略。7.3 超参数自动化调优我们目前对SVM和KNN做了简单的网格搜索对PSO-NN和DT手动设置了一些参数。你可以引入更先进的自动化超参数优化工具。贝叶斯优化相比于网格搜索的暴力尝试贝叶斯优化通过构建目标函数验证集性能的概率模型来智能地选择下一组要尝试的超参数能用更少的尝试次数找到更优解。MATLAB的Statistics and Machine Learning Toolbox R2018b以后版本提供了bayesopt函数。遗传算法类似于PSO也可以用来优化其他模型的超参数例如决策树的最大深度、最小叶子数甚至SVM的C和gamma。7.4 部署与生产化考虑如果这个分类模型最终要集成到一个更大的系统中或者提供API服务你需要考虑模型保存与加载使用save和load命令将训练好的模型对象如svmModel,knnModel等保存为.mat文件。在部署时直接加载无需重新训练。标准化器保存切记要将在训练阶段计算得到的特征标准化参数mu和sigma也保存下来并在预测新数据时使用它们进行相同的转换。编写预测函数封装一个简洁的预测函数输入是新数据的特征矩阵输出是预测的类别标签和概率如果模型支持。这个工具箱的代码结构是模块化的上述每一个扩展点都可以作为一个独立的函数或模块加入现有的框架中。它不仅仅是一个拿来即用的脚本更是一个可以随着你机器学习技能增长而不断进化的学习平台和项目基石。从对比评估开始深入到特征工程再到模型集成与优化这条路径清晰地映射了一个机器学习项目从原型到产品的典型生命周期。本文还有配套的精品资源点击获取
返回列表