1. 项目概述与核心价值在电动汽车充电基础设施EVCI的网络安全领域实时、高效的异常检测是保障系统稳定运行的关键。传统的云端检测方案虽然强大但面临着网络延迟、数据隐私和持续云端连接依赖等挑战。随着边缘计算和物联网设备的普及将智能直接下沉到设备端实现本地化、低延迟的决策成为了一个极具吸引力的方向。这就是TinyML微型机器学习的用武之地——它旨在让复杂的机器学习模型能够在内存和算力都极其有限的微控制器上运行。然而将一个在服务器上训练好的、动辄几十MB甚至更大的模型直接塞进一个只有几百KB内存的嵌入式设备无异于试图将一头大象装进冰箱。模型压缩与优化技术就是解决这个矛盾的核心钥匙。它不是一个单一的技术而是一套组合拳目标是在性能损失最小化的前提下让模型“瘦身”和“提速”。我们这次要深入探讨的就是其中两种非常有效且互补的技术基于SHAP的特征选择和非结构化剪枝并将它们应用于电动汽车充电站的网络流量异常检测任务。简单来说我们的工作流程可以概括为首先我们拿到了一个专门针对电动汽车充电站网络攻击的公开数据集CICEVSE2024然后我们训练了三种不同类型的模型MLP、LSTM、XGBoost作为基线接着我们使用Optuna对它们进行超参数调优让它们达到各自的最佳状态之后我们祭出SHAP这把“手术刀”精准地识别出对模型决策贡献最大的关键特征剔除那些冗余或无关的特征最后我们对神经网络模型MLP和LSTM进行“剪枝”像园丁修剪枝叶一样将网络中不重要的权重连接剪掉。这一套组合拳下来我们的目标非常明确在几乎不损失检测精度准确率、召回率等的前提下让模型的体积大幅缩小推理速度显著提升从而为在资源受限的充电桩控制器或车载网关中部署实时异常检测模型扫清障碍。2. 核心思路与技术选型解析2.1 为什么选择剪枝与特征选择面对模型轻量化的需求业界有量化、知识蒸馏、剪枝等多种手段。我们选择特征选择FS和非结构化剪枝作为核心优化手段是基于对目标场景——边缘侧异常检测——的深刻理解。首先特征选择解决的是“输入维度”的问题。网络流量数据通常包含大量特征原始数据有86维但并非所有特征都对识别“异常”有贡献。一些特征可能是高度相关的甚至是纯噪声。直接使用所有特征训练模型不仅会增加计算负担还可能引入噪声导致模型过拟合或难以泛化。因此FS是模型优化的第一步也是从根本上减少计算量的方法。我们选择SHAPSHapley Additive exPlanations而不是简单的相关性分析或树模型自带的重要性排序是因为SHAP基于博弈论能提供更一致、更可靠的特征贡献度解释。它能告诉我们每个特征对于每一个具体预测样本的贡献值其全局平均绝对值Mean(|SHAP Value|)是衡量特征重要性的黄金标准。其次非结构化剪枝解决的是“模型内部冗余”的问题。神经网络尤其是全连接层普遍存在过度参数化现象。大量权重值趋近于零对最终输出的贡献微乎其微却依然参与每一次前向传播计算占用内存和算力。非结构化剪枝就是将这些接近零的权重直接置零。这里的关键在于“非结构化”它不像结构化剪枝那样移除整个神经元或通道而是精细到每一个权重连接。这带来了更高的压缩潜力但也带来了一个挑战单纯的置零并不会减少计算量因为零值依然存储在矩阵中并被处理。因此我们必须引入稀疏矩阵存储与计算如CSR格式让计算引擎“知道”哪些位置是零并跳过它们才能真正实现加速。将FS与剪枝结合形成了“由外而内”的优化闭环FS从模型外部削减输入维度减少了进入模型的“数据流量”剪枝则从模型内部削减参数规模优化了模型的“计算通路”。两者叠加能产生“112”的压缩与加速效果。2.2 模型架构选型MLP、LSTM与XGBoost的考量我们选择了三种具有代表性的模型进行对比实验这覆盖了从经典到前沿的不同范式多层感知机MLP作为基础的基线模型。MLP结构简单全是全连接层是非结构化剪枝最直接、最经典的应用对象。它的表现可以清晰地反映出剪枝和FS对传统神经网络的影响。长短期记忆网络LSTM专为序列数据设计。充电站网络流量是典型的时间序列数据前后数据包之间存在时间依赖关系。LSTM能捕捉这种时序模式对于检测某些需要上下文理解的攻击如慢速扫描的侦察攻击可能更有优势。对LSTM进行剪枝和稀疏化推理更具挑战性也更能体现我们方法在复杂模型上的通用性。XGBoost作为强大的梯度提升树模型代表。树模型本身具有结构稀疏、推理速度快的特点并且内置了特征重要性评估。我们对其的“剪枝”主要通过削减树的数量n_estimators和最大深度max_depth来实现这是一种模型结构上的简化。选择XGBoost可以对比神经网络与树模型在相同优化目标下的表现差异。这三种模型的组合使我们能够评估优化技术在不同算法家族上的普适性和有效性。2.3 数据集与预处理为模型提供“干净食材”我们使用的CICEVSE2024数据集是本研究成功的基石。它模拟了真实的电动汽车充电站环境包含了正常Benign、侦察Recon和拒绝服务DoS三种状态的网络流量数据。数据预处理是模型性能的“隐形守护者”我们做了以下几项关键工作流量特征提取使用NFStream库从原始的pcap包文件提取出流级别的统计特征如包数量、字节数、包到达时间间隔的均值/标准差等将非结构化的网络数据转化为结构化的特征表格。去除偏见特征我们果断移除了所有MAC和IP地址相关的特征。这一点至关重要因为模型应该学习基于流量统计行为的通用模式而不是去记忆特定设备的地址。否则模型在遇到新地址时可能会失效泛化能力极差。处理高相关性与缺失值计算特征间的相关系数矩阵移除相关性高于0.95的冗余特征之一。同时删除缺失值超过99%或为单一常数的特征。这步操作直接减少了后续计算的维度。标签编码与数据划分对分类特征如应用名称进行标签编码Label Encoding。虽然这可能引入虚假的序数关系但为了控制维度膨胀相比One-Hot编码我们选择了它并在后期通过SHAP分析验证了这些特征贡献度很低从而消除了顾虑。在划分训练/验证集时我们没有随机划分而是按时间顺序取每个攻击类别时间序列的后20%作为验证集。这模拟了真实的流式检测场景防止了“未来信息泄露”评估更加严谨。注意数据划分策略的陷阱。在处理时间序列数据时绝对不要使用随机划分。随机打乱会破坏数据的时间依赖性导致模型用“未来的模式”去预测“过去”从而在验证集上得到虚高的、不真实的能。我们的按时间顺序划分方法虽然简单但却是工业界时序预测和异常检测的标配能真实反映模型上线后的表现。经过预处理我们将特征从86维精简到49维得到了两份干净的数据集对应两个充电站EVSE-A和EVSE-B为后续的模型训练与优化打下了坚实基础。3. 超参数优化与模型训练3.1 使用Optuna进行自动化超参数搜索在确定了模型架构和数据之后下一步就是让模型发挥出最佳性能这就是超参数优化HPO的任务。手动调参如同大海捞针效率低下。我们采用了Optuna这一现代超参数优化框架。Optuna的“Define-by-Run” API设计非常灵活。你不需要预先定义完整的搜索空间而是在目标函数内部动态地提出超参数建议。我们为三个模型设定了不同的搜索空间MLP主要优化层数1到8层和每层的神经元数量从{16, 32, 64, 128}中选择。LSTM优化LSTM的层数1到3层和每层的单元数从{50, 75, 100}中选择。XGBoost搜索空间更广包括树的数量n_estimators、最大深度max_depth、学习率learning_rate、子采样率subsample等共9个关键参数。我们将优化目标设定为最大化验证集准确率Accuracy并设置了早停Early Stopping来防止过拟合。经过多轮试验TrialOptuna为我们找到了每个模型的最佳配置如表II所示。例如MLP的最佳结构是4层神经元数分别为[16, 128, 64, 3]LSTM是3层单元数为[100, 50, 3]XGBoost的最佳树数量是500最大深度为5。这个过程虽然耗费计算资源但至关重要。一个未经调优的模型其基线性能可能很差在此基础上的剪枝和压缩将失去意义。HPO确保了我们的“原始模型”本身就是一个强健的起点。3.2 模型训练中的细节与技巧在训练神经网络MLP和LSTM时我们统一使用了Adam优化器和分类交叉熵损失函数。批量大小Batch Size设为32训练50个轮次Epoch。对于LSTM我们引入了滑动窗口Window Size5将序列数据构建成样本以利用其时序建模能力。一个容易被忽略但极其重要的细节是类别不平衡问题。从表I可以看出EVSE-A数据集中DoS攻击样本占比高达84.5%而正常流量仅占2.95%。如果直接用这个数据集训练模型会倾向于将所有样本都预测为DoS从而在准确率上看起来很高但完全无法检测出少数类正常和侦察流量。这就是典型的“准确率陷阱”。我们的解决方案是选择EVSE-B数据集进行训练。EVSE-B的类别分布相对均衡正常26.47%侦察49.66%DoS 23.87%虽然仍不平衡但远好于EVSE-A。我们用EVSE-B训练用EVSE-A测试。这模拟了一个更现实的场景在一个相对均衡的数据上训练出一个泛化能力强的模型然后部署到另一个可能分布不同的真实环境中去检测。我们没有采用过采样或欠采样技术因为对于网络流量这种时间序列简单的重采样可能会破坏其内在的时间结构和依赖关系。4. 基于SHAP的特征选择实战4.1 SHAP原理与计算实践SHAP的核心思想源于博弈论的沙普利值Shapley Value它公平地分配“团队合作”模型预测的“功劳”给每个“队员”输入特征。对于神经网络模型MLP和LSTM我们使用了基于核的SHAP近似方法KernelSHAP。实操中计算SHAP值有两大挑战计算复杂度和序列数据。计算复杂度精确计算SHAP值需要遍历特征的所有可能子集复杂度是指数级的。因此我们采用了抽样近似。对于MLP我们从训练集中随机抽取100个样本作为背景分布用于估计特征缺失时的期望值然后对测试集中的1000个随机样本计算SHAP值。对于LSTM为了保持时间连续性我们抽取的是连续的100个和1000个样本。序列数据LSTM的输入是一个窗口序列。我们计算SHAP值时是对窗口内每个时间步的特征分别计算然后对所有时间步的SHAP值取平均得到一个代表该特征在整个窗口期内平均贡献度的值。计算完成后我们得到了每个特征对于每个预测样本的SHAP值。通过绘制SHAP摘要图Summary Plot如图2图3我们可以直观地看到特征重要性排序纵轴是按平均绝对SHAP值降序排列的特征列表。特征影响方向每个点代表一个样本颜色表示特征值的大小红高蓝低水平位置表示SHAP值右为正影响左为负影响。这不仅能告诉我们哪个特征重要还能告诉我们特征值大小如何影响预测结果例如某个流量统计值很大时更可能被判断为攻击。4.2 特征选择策略与结果分析我们根据SHAP摘要图选取了平均绝对SHAP值最高的前10个特征。分析发现对于MLP模型前10个特征贡献了约90%的总重要性。这些特征主要集中在数据包大小dst2src_min_ps,dst2src_max_ps和包到达时间间隔bidirectional_stddev_piat_ms,src2dst_stddev_piat_ms的统计量上。这表明MLP主要依赖流量在时间维度上的波动性和数据包大小的极端值来判别异常。对于LSTM模型前10个特征贡献了约80%的重要性。除了时间间隔特征端口号src_port,dst_port也进入了前十。LSTM可能学习到某些攻击倾向于使用特定端口范围这是其时序建模能力捕捉到的更复杂模式。基于此我们的特征选择操作非常简单粗暴直接丢弃排名10之后的所有特征。将特征维度从49维降至10维。对于XGBoost我们直接使用其内置的feature_importances_属性同样选择重要性排名前10的特征这些特征保留了超过98%的总重要性。实操心得SHAP解释的稳定性。SHAP值计算依赖于背景样本的选取。在实际操作中建议多次运行SHAP计算使用不同的随机种子抽取背景样本观察前N个重要特征列表是否稳定。如果列表波动很大说明模型对特征的依赖不够鲁棒或者需要更多的背景样本来获得稳定的估计。我们的实验中发现对于这个数据集前5个重要特征非常稳定10名之后的特征排名偶有交换但不影响我们选取前10名的决策。5. 模型剪枝与稀疏化推理实现5.1 渐进式非结构化剪枝算法我们采用了一种渐进式剪枝Gradual Pruning策略而非一次性剪枝。其核心思想是在多个训练周期内逐步将权重矩阵中幅度最小的那部分权重置零并允许模型在每次剪枝后进行微调Fine-tuning来恢复性能。具体算法遵循Zhu Gupta (2017)提出的方法设定目标我们设定了最终的目标稀疏度Sparsity为65%即最终有65%的权重为零。规划路径不是一开始就剪掉65%而是从一个初始稀疏度例如0%开始随着训练周期epoch增加按照一个三次衰减函数逐步提高稀疏度直到第N个epoch达到目标65%。执行与微调在每个epoch结束后根据当前计划的稀疏度计算一个阈值将绝对值于该阈值的权重置零。然后模型继续在下一个epoch训练学习适应这个更稀疏的网络。这种方法比一次性剪枝温和得多给了模型足够的“适应期”从而能更好地保持精度。5.2 从“理论剪枝”到“实际加速”稀疏矩阵存这里存在一个巨大的认知误区仅仅把权重置零并不会让模型推理变快在标准的稠密矩阵乘法中零值依然会参与乘加运算乘以0再加0。模型大小在磁盘上可能会因为存储了大量零而略微减小如果使用默认的浮点数存储但内存中和计算时它们依然存在。真正的加速来自于稀疏矩阵计算。我们采用了压缩稀疏行CSR格式来存储剪枝后的权重矩阵。CSR格式只存储非零元素的值、列索引以及行指针。当执行矩阵乘法时算法可以智能地跳过所有零元素只对非零元素进行计算。实现稀疏化推理是技术关键点对于MLP实现相对直接。我们将每一层的稠密权重矩阵转换为CSR格式。在前向传播时实现一个稀疏矩阵与稠密向量的乘法函数。对于ReLU激活函数我们可以在稀疏计算的结果上应用因为ReLU(0)0输出依然是稀疏的对于负输入。但Softmax层需要所有元素因此在该层需要将数据暂时还原为稠密格式。对于LSTM这是挑战所在。LSTM有四个门输入门、遗忘门、细胞状态、输出门每个门都涉及矩阵运算。我们需要为每个门的权重矩阵分别实现稀疏乘法并在每个时间步更新细胞状态和隐藏状态。这需要精细的工程实现确保稀疏计算贯穿整个时间序列传播过程。我们为MLP和LSTM分别编写了自定义的稀疏推理函数替代了原来框架如TensorFlow/Keras的稠密层计算。正是这一步将“存储上的稀疏”转化为了“计算上的加速”。5.3 XGBoost的“剪枝”对于XGBoost我们没有采用权重剪枝因为树模型的结构不同。我们的“剪枝”体现在两方面结构简化将Optuna找到的最佳参数中的n_estimators从500降低到100max_depth从5降低到2。这直接减少了模型中叶子的数量和复杂度是一种更直观的模型压缩。特征选择同样应用前10重要特征减少每个分裂节点需要判断的特征数。6. 实验结果分析与深度解读表III清晰地展示了我们优化策略的成果。我们来逐项拆解6.1 性能指标精度保持的奇迹这是最令人振奋的部分。经过特征选择和65%的剪枝对于神经网络或结构简化对于XGBoost后三个模型的四大核心性能指标准确率、精确率、召回率、F1分数的下降幅度全部小于0.5%。MLP的准确率从98.41%微降至98.35%。LSTM的准确率甚至从99.15%略微提升至99.21%这可能是剪枝起到了正则化作用减少了过拟合。XGBoost的准确率从98.50%降至98.15%。这完美印证了我们的核心假设神经网络和树模型中存在大量冗余通过科学的方法移除这些冗余可以在几乎不影响其“决策能力”的前提下极大地优化其“物理形态”。6.2 效率指标体积与速度的飞跃这才是TinyML部署最关心的部分模型大小Model SizeMLP从46.70 KB减小到34.60 KB压缩了25.9%。LSTM从355.07 KB减小到210.84 KB压缩了40.6%。LSTM压缩比更大因为它原本参数更多冗余也更多。XGBoost从670.57 KB减小到216.72 KB压缩了67.7%。树模型通过削减树的数量和深度压缩效果最为显著。推理时间Inference TimeMLP从63.70 ms/样本暴降至1.32 ms/样本加速了97.9%这是稀疏计算带来的巨大红利。LSTM从63.61 ms降至9.95 ms加速了84.4%。虽然加速比不如MLP但考虑到LSTM序列计算的复杂性这个提升已经非常可观。XGBoost从0.203 ms降至0.196 ms加速了3.1%。树模型本身推理就极快优化空间相对较小但仍有提升。关键洞察对于计算密集型的神经网络MLP LSTM稀疏化推理是性能提升的关键它直接减少了浮点运算次数FLOPs。而对于内存访问密集型的树模型XGBoost特征选择带来的缓存友好性可能是推理略微加速的主要原因需要判断的特征变少了。6.3 综合对比与场景适配模型优化阶段准确率模型大小 (KB)推理时间 (ms)适用场景分析MLP (原始)基准98.41%46.7063.70仅适用于有较强算力的边缘服务器或网关。MLP (优化后)FS 剪枝98.35% (-0.06%)34.60 (-25.9%)1.32 (-97.9%)极度适合超低功耗MCU。模型小、速度快精度损失可忽略是TinyML部署的首选。LSTM (原始)基准99.15%355.0763.61需要较强的算力支撑适合在充电站本地工控机或区域服务器部署。LSTM (优化后)FS 剪枝99.21% (0.06%)210.84 (-40.6%)9.95 (-84.4%)适合对时序模式检测要求高、且有一定算力资源如高性能MCU或边缘AI芯片的场景。XGBoost (原始)基准98.50%670.570.203模型体积大但推理快适合对存储空间不敏感、但对延迟敏感的后端分析系统。XGBoost (优化后)FS 结构简化98.15% (-0.35%)216.72 (-67.7%)0.196 (-3.1%)体积大幅减小推理依然极快。适合在存储受限但CPU主频较高的嵌入式Linux设备如Raspberry Pi上部署。从表中可以得出清晰结论如果追求极致的轻量化和低功耗优化后的MLP是不二之选。它用最小的体积和最快的速度提供了与原始模型几乎无异的精度。如果任务对捕捉时间序列异常模式要求极高且设备有一定能力如ARM Cortex-M7系列MCU或更高优化后的LSTM是更好的选择它提供了最高的精度。如果设备是带操作系统的嵌入式平台有几百MB内存且开发团队更熟悉传统机器学习优化后的XGBoost提供了一个非常好的选择它部署简单推理速度极快。7. 部署考量与常见问题排查7.1 从实验到产品部署流水线设计将优化后的模型部署到真实的充电桩或车载设备需要构建一个完整的边缘推理流水线数据采集与预处理设备端的网络嗅探模块如基于DPDK或libpcap实时捕获网络流量并按照与训练时完全相同的流程使用NFStream或轻量级替代库提取相同的49维特征。特征选择在设备端只保留经过SHAP分析选出的前10个特征丢弃其他39维。这一步可以写死在代码中是一个简单的数组切片操作开销极低。模型推理对于MLP/LSTM加载稀疏格式CSR的权重文件调用我们编写的轻量级稀疏推理引擎进行计算。这个引擎需要用C/C实现以追求最高效率并可以针对特定硬件如ARM NEON指令集进行优化。对于XGBoost加载精简后的模型文件.json或.ubj格式使用XGBoost的C语言接口或Treelite等优化库进行推理。决策与上报模型输出异常分数或类别。设备端可以设定一个阈值超过阈值则立即触发本地告警如指示灯、蜂鸣器同时将简要的告警信息通过安全通道上报至云端管理中心。7.2 常见问题与解决方案速查表在实际部署和复现过程中你可能会遇到以下问题问题现象可能原因排查步骤与解决方案剪枝后模型精度暴跌5%1. 剪枝速度过快稀疏度增长函数太激进。2. 目标稀疏度过高。3. 剪枝后微调Fine-tuning的轮次或学习率不足。1. 使用更平缓的稀疏度计划如线性增长。2. 降低最终目标稀疏度例如从65%降至50%。3. 增加剪枝后的微调轮次并尝试使用更小的学习率。稀疏模型推理速度没有提升甚至变慢1. 没有实现真正的稀疏计算仍在用稠密矩阵库计算稀疏矩阵。2. 稀疏度不够高如低于90%稀疏计算的开销索引查找可能超过计算零值节省的开销。3. 硬件不支持稀疏计算优化。1. 确保使用专门的稀疏矩阵乘法库如Eigen Sparse、Intel MKL Sparse BLAS或手写优化代码。2. 尝试提高剪枝率或评估当前稀疏度下的“计算密度”对于低稀疏度矩阵稠密计算可能更快。3. 在目标硬件上做性能剖析确认瓶颈。对于某些CPU密集计算反而更有优势。SHAP计算耗时过长或内存溢出1. 背景数据集background data太大。2. 需要解释的样本太多。3. 模型本身过于复杂。1. 使用K-Means等方法从训练集中选取最具代表性的少量样本如50-100个作为背景集。2. 仅对验证集的一个子集或分类错误的样本进行SHAP分析。3. 考虑使用模型特定的、更快的解释方法如DeepSHAP for NN TreeSHAP for XGBoost。边缘设备上模型加载失败1. 模型文件格式不被边缘推理框架支持。2. 模型文件过大超出设备内存。3. 依赖的运行时库缺失。1. 将模型转换为边缘框架支持的格式如TensorFlow Lite, ONNX Runtime, LibTorch。对于稀疏模型需确认框架是否支持稀疏算子。2. 进一步压缩模型尝试量化Quantization将FP32权重转为INT8体积可再减少75%。3. 使用静态链接或裁剪过的最小运行时库。部署后检测效果远差于实验1. 数据分布漂移Data Drift真实环境流量特征与训练数据差异大。2. 预处理代码不一致边缘设备上的特征提取逻辑与训练时有细微差别。3. 新的攻击模式出现。1. 在边缘设备上持续收集少量数据计算其与训练数据特征分布的差异如PSI。建立模型监控与再训练机制。2. 严格统一训练和部署的预处理代码最好封装成统一的库。3. 设计一个在线学习或增量更新机制允许模型在安全可控的情况下学习新样本。7.3 性能与资源的权衡艺术在TinyML的世界里没有“最好”的模型只有“最合适”的模型。你需要根据目标硬件的精确规格来做决策SRAM大小决定了模型运行时能加载多少权重。优化后的MLP~35KB可以轻松放入许多MCU的片上SRAM。Flash大小决定了能存储多少个模型或多大体积的模型。XGBoost优化后仍有200KB需要考虑外部Flash。CPU主频与架构决定了推理速度。稀疏计算在乱序执行、大缓存的CPU上优势明显但在简单的顺序执行MCU上其索引开销可能抵消收益。功耗预算每一次内存访问和浮点运算都消耗能量。更小的模型和更少的计算直接转化为更长的电池寿命。我个人在实际操作中的体会是在资源受限的边缘设备上MLP常常是“性价比”最高的选择。它结构简单易于压缩和优化对硬件的要求最低。LSTM能提供更优的性能但需要你为它的复杂性付出更多的工程优化努力。XGBoost则在有操作系统和充足内存的“富边缘”设备上展现出强大的易用性和稳定性。最后再分享一个小技巧在将模型部署到最终硬件之前一定要在“开发板”级别进行端到端的性能剖析。使用硬件性能计数器如果支持或高精度定时器精确测量从数据包捕获到输出预测结果的完整流水线延迟。你可能会发现模型的推理时间只占整个延迟的一小部分而数据预处理、特征提取或系统调度开销才是真正的瓶颈。优化这些部分往往能带来意想不到的整体性能提升。