ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

深入浅出TinyML 12:如何划分数据集并正确评价模型?

深入浅出TinyML 12:如何划分数据集并正确评价模型? 时间序列切窗后相邻样本高度相似。把所有窗口随机打散训练集与测试集可能来自同一设备、同一次采集甚至共享大部分数据测试准确率会明显高估现场效果。可靠评价从划分单位开始。测试集应模拟真正的部署变化例如新设备、新人员、新时间段或新工况指标则根据误报与漏报成本选择。先按独立来源划分再在各组内部切窗。测试集必须包含模型训练期间没有见过的独立来源。完成本篇后你应该能够按设备、人员或会话划分数据避免相邻窗口和同源样本泄漏。从混淆矩阵计算precision、recall和F1并根据错误成本解释指标。运行分组评估脚本观察总体准确率如何掩盖少数类漏报。训练集用于学习验证集用于选参数测试集只用于最终评价。三者共享同一设备或同一连续片段时测试结论会过于乐观。图1时间序列项目应优先使用会话、设备或人员级分组划分一、划分单位决定测试难度窗口不是天然独立样本。部署到新设备时应按设备ID隔离测试识别人动作时应按人员隔离预测未来工况时应按时间段隔离。测试集越接近真实部署变化结论越有价值。验证集用于模型选择和阈值调整测试集只在方案冻结后使用。反复根据测试集修改模型会让测试集逐渐参与训练决策。二、混淆矩阵比单一准确率提供更多信息混淆矩阵显示每个真实类别被预测成什么。类别不平衡时大量正常样本可能让准确率很高同时少数异常几乎全部漏报。精确率回答报警中有多少是真的召回率回答真实异常有多少被找出F1在两者之间给出调和平均。仍需结合业务成本决定优先级。Precision TP / (TP FP)Recall TP / (TP FN)F1 2 × Precision × Recall / (Precision Recall)三、阈值需要在验证集上确定分类器输出分数后阈值决定误报与漏报的交换关系。阈值不能直接沿用0.5也不能在测试集上挑选。应在验证集上按错误成本、允许误报率或最低召回率确定再锁定到测试。现场评价还应使用单位时间误报次数、连续事件漏检率和响应延迟。这些指标比逐窗口准确率更接近系统体验。表1不同业务关注点对应的评价指标业务问题优先指标补充检查漏报代价高Recall / 事件漏检率未知类与低置信度误报代价高Precision / 每小时误报连续帧确认类别不平衡每类F1 / 宏平均混淆矩阵实时报警事件检出率响应延迟与抖动四、保存可重复的评价记录评价报告需要保存数据集版本、划分文件、模型版本、预处理参数和阈值。只保存最终百分比无法解释后续模型变化。错误样本应按设备、工况、置信度和混淆类型归类。下一轮改进先处理占比高且业务代价大的错误而非盲目扩大网络。Python按设备ID建立互斥划分def split_by_device(records, train_ids, val_ids, test_ids):groups {train: [], val: [], test: []}for item in records:device item[device_id]if device in train_ids:groups[train].append(item)elif device in val_ids:groups[val].append(item)elif device in test_ids:groups[test].append(item)else:raise ValueError(funassigned device: {device})return groups# 先分设备再在各集合内部切窗。划分单位必须大于模型可能记住的相关范围同一连续记录切出的重叠窗口共享大部分采样点。随机按窗口划分会让几乎相同的片段出现在训练和测试两侧。模型即使只记住该会话的背景噪声也能得到高分。应先按设备或会话分配集合再各自在内部切窗。选择分组层级取决于部署目标。要泛化到新人员就按人员隔离要泛化到同类新设备就按设备隔离只需在固定设备上识别未来状态可以按时间会话隔离。评价问题必须与真实部署对象一致。测试集在模型选择过程中不能反复使用。比较网络结构、阈值或预处理应在验证集完成最终冻结方案后只评一次测试集。若测试结果促使重新修改模型原测试集已经参与决策需要新的独立数据确认。部署目标与推荐分组方式部署目标分组单位测试回答同设备未来运行独立时间会话能否跨时间与工况同型号新设备设备ID能否跨器件与安装新人员动作人员ID能否跨个体新站点站点或产线能否跨环境从混淆矩阵回到实际错误数量准确率等于预测正确数除以总数。若1000个样本中950个正常、50个故障模型全部预测正常也有95%准确率但故障召回率为0。需要为关键类别分别计算召回率和精确率。故障类召回率TP/(TPFN)回答真实故障中找回多少精确率TP/(TPFP)回答所有故障告警中有多少是真的。F1是二者调和平均适合需要平衡时使用。业务仍可能更关注每小时误报、连续事件漏检或响应延迟。置信度阈值应在验证集选择。提高阈值通常减少误报、增加拒识或漏报降低阈值方向相反。测试报告应保存阈值、类别顺序、样本数、分组方式和置信区间避免只留下一个百分比。Recall TP/(TPFN)Precision TP/(TPFP)F1 2×Precision×Recall/(PrecisionRecall)动手按设备评估并手算混淆矩阵脚本提供来自4台设备的真实标签与预测标签。它生成二分类混淆矩阵并逐设备报告故障召回率。你会看到总体结果可能被样本较多、表现较好的设备主导。实验环境与输入Python 3标准库。保存为 grouped_metrics.py 并运行。样本在脚本内给出不使用scikit-learn。按顺序完成实验运行代码记录总体TP、FP、FN、TN以及precision、recall、F1。比较4台设备的故障召回率找出表现最差的设备。增加20个device_A正常预测正确样本观察总体准确率提高但device_D问题没有改善。把device_D视为完全独立测试设备说明这种结果对部署风险意味着什么。可直接运行总体与逐设备二分类指标from collections import defaultdictrecords [(A, 0, 0), (A, 0, 0), (A, 1, 1), (A, 1, 1),(B, 0, 0), (B, 0, 1), (B, 1, 1), (B, 1, 0),(C, 0, 0), (C, 1, 1), (C, 1, 1), (C, 1, 0),(D, 0, 0), (D, 0, 0), (D, 1, 0), (D, 1, 0),]def metrics(rows):tp sum(y 1 and p 1 for _, y, p in rows)fp sum(y 0 and p 1 for _, y, p in rows)fn sum(y 1 and p 0 for _, y, p in rows)tn sum(y 0 and p 0 for _, y, p in rows)precision tp / (tp fp) if tp fp else 0.0recall tp / (tp fn) if tp fn else 0.0f1 2*precision*recall/(precisionrecall) if precisionrecall else 0.0accuracy (tp tn) / len(rows)return tp, fp, fn, tn, accuracy, precision, recall, f1print(overall TP FP FN TN ACC PREC REC F1)print(metrics(records))groups defaultdict(list)for row in records:groups[row[0]].append(row)for device, rows in sorted(groups.items()):result metrics(rows)print(fdevice{device} count{len(rows)} recall{result[6]:.3f} fconfusion{result[:4]})先读懂代码中的关键路径records同时保留设备ID、真实标签和预测标签允许总体与分组使用同一原始记录。TP、FP、FN、TN按故障类为正类计算更换正类时各项含义会变化。分母为0时返回0正式报告还应标记该组缺少正样本避免误读。逐设备结果揭示最差组增加容易正常样本只能美化总体准确率。你应该观察到什么device_D的故障召回率为0因为两个真实故障都被预测为正常。总体指标高于最差设备指标说明汇总会掩盖分组失败。增加容易的正常样本可提高准确率却不会减少关键设备上的FN。成功标准划分脚本能够证明同一分组ID不会跨训练、验证和测试集合。报告至少包含混淆矩阵、关键类别precision/recall和各分组样本数。阈值只在验证集选择独立测试集不参与反复调参。失败时从哪里查起模型评价常见误判现象原因修正准确率很高却现场漏报类别不平衡或分组泄漏看FN、召回率和独立设备每次运行结果差异很大分组样本太少或随机种子未记录固定划分清单并扩大独立组测试集越调越好测试集参与模型选择保留新的最终盲测数据指标只在明确的数据来源和划分规则下有意义。报告中应把数字与具体错误窗口连接继续做原因分析。把实验迁移到真实MCU项目MCU日志至少保存时间、模型版本、预测类、量化输出、阈值与质量标志真实标签可以事后由维护记录关联。这样才能计算事件级误报与漏报。窗口级指标还要转换为事件级指标。连续十个窗口误报可能对应一次误报事件业务通常关注每小时告警次数和事件首次发现延迟。用错误成本重新阅读混淆矩阵为你项目中的每个FN和FP写出真实后果与可接受上限。确定最符合部署目标的分组ID并设计集合互斥断言。把逐设备、逐人员或逐工况结果加入报告避免只看总体平均。这篇文章的结论可信评价依赖与部署变化一致的数据分组、独立测试集和错误成本匹配的指标。随机窗口划分会掩盖真正的泛化问题。参考资料TensorFlow Lite Micro 官方代码仓库
返回列表