
简介设备传感器温度信号异常检测数据集面向从事工业设备监测、时序异常检测算法研究的学生与工程师可用于温度信号建模、异常识别与算法验证等场景。压缩包共10个文件以9个json与1个csv为主json文件承载窗口化后的温度数据与对应标签csv则提供原始温度记录整体约35KB体量轻便便于快速加载与调试。内容涵盖原始温度序列、窗口切分数据及标签信息可支撑从数据预处理到异常检测模型训练的完整流程适合作为课程实验、论文复现或算法对比的基础数据。目前已有378人学习下载具备一定参考热度。读者可借助该数据集理解温度信号的时序特征与异常标注方式快速搭建检测实验验证阈值法、统计方法或深度模型的效果并在此基础上扩展多传感器场景。1. 设备传感器温度信号异常检测数据集从一份 .rar 到能跑通的检测流水线工业现场的温度传感器每秒钟都在吐数可真正让人头疼的不是采集而是判断哪一段数据“不对劲”。设备传感器温度信号异常检测数据集.rar 这类资源核心价值在于把真实工况下的温度时序和异常标签打包在一起省去从零标注的成本。它适合做设备预测性维护、工业异常检测算法验证、以及传感器课程设计里需要真实数据支撑的环节。但拿到压缩包只是起点——解压后怎么读、标签怎么对齐、异常比例失衡怎么处理、模型选什么每一步都有翻车的可能。这篇笔记按“先看清数据长什么样再搭一条能复现的检测流水线最后把踩过的坑摊开讲”的顺序展开目标是你照着能跑出自己的第一版结果。2. 解压后先别急着训练把温度时序和标签对齐2.1 温度信号异常检测的数据形态与标签逻辑工业温度信号通常以两种形态出现一种是单传感器长时间序列采样频率从 1Hz 到 1kHz 不等另一种是多传感器同步采集每个测点独立成列。异常检测数据集里的标签一般分三类——点异常单个采样点跳变、段异常连续一段偏离正常工况、以及上下文异常数值本身正常但相对于前后文不合理。设备传感器温度信号异常检测数据集.rar 解压后大概率是 CSV 或 MAT 格式列名可能包含 timestamp、sensor_id、temperature、label 这几类字段。标签列常见的是 0/1 二值也有用 -1 表示未标注、1 表示异常的情况。拿到数据第一件事不是画图而是确认三件事时间戳是否单调递增、是否存在重复采样、标签列是否与时间戳等长。很多公开数据集在打包时做过重采样或截断直接按行索引对齐会错位。我一般会先跑一段校验脚本把这三个问题一次性查清楚。import pandas as pd import numpy as np # 读取解压后的 CSV假设文件名为 temperature_data.csv df pd.read_csv(temperature_data.csv) # 1. 检查时间戳单调性 df[timestamp] pd.to_datetime(df[timestamp]) is_monotonic df[timestamp].is_monotonic_increasing print(f时间戳单调递增: {is_monotonic}) # 2. 检查重复时间戳 dup_count df[timestamp].duplicated().sum() print(f重复时间戳数量: {dup_count}) # 3. 检查标签列缺失和对齐 if label in df.columns: print(f标签缺失值: {df[label].isna().sum()}) print(f标签分布:\n{df[label].value_counts()}) # 确认标签与时间戳等长 assert len(df[label]) len(df[timestamp]), 标签长度与时间戳不一致 else: print(未找到 label 列需确认标签文件是否独立)这段脚本的逻辑是先做结构校验再做统计。is_monotonic_increasing返回 False 时说明数据在打包时可能做过乱序增强或合并操作需要按时间戳重新排序。重复时间戳数量大于 0 时要判断是采集抖动还是数据拼接导致前者可以保留首条后者需要检查拼接边界。标签分布直接决定后续用什么损失函数——如果异常占比低于 1%交叉熵会被正常样本淹没得换 Focal Loss 或做重采样。参数方面pd.to_datetime的格式参数如果数据里是 Unix 时间戳秒或毫秒要加units或unitms否则会解析成 1970 年。标签列如果不在主文件里常见做法是单独一个 label.csv用 timestamp 做左连接连接前务必确认两边时间戳的时区一致。2.2 用滑动窗口把时序切成模型能吃的样本温度信号是连续时序绝大多数异常检测模型无论是 LSTM-AE、USAD 还是基于 Transformer 的方案都要求输入固定长度的窗口。窗口长度怎么定看异常持续时长。如果段异常平均持续 30 秒采样率 1Hz窗口至少覆盖 60 个点才能让模型看到完整异常形态。步长一般取窗口的 1/4 到 1/2步长太小会导致训练集高度冗余太大则可能漏掉短异常。def create_windows(data, label, window_size60, step15): 将时序切成滑动窗口 data: 温度值数组shape (N,) label: 标签数组shape (N,) window_size: 窗口长度 step: 滑动步长 返回: X shape (M, window_size), y shape (M,) X, y [], [] for start in range(0, len(data) - window_size 1, step): end start window_size window_data data[start:end] window_label label[start:end] # 窗口内只要有一个异常点整个窗口标记为异常 # 也可改为异常比例超过阈值才标记 window_tag 1 if np.any(window_label 1) else 0 X.append(window_data) y.append(window_tag) return np.array(X), np.array(y) # 假设 df 已经按时间排序temperature 和 label 列存在 X, y create_windows(df[temperature].values, df[label].values, window_size60, step15) print(f窗口样本数: {X.shape[0]}, 异常窗口数: {y.sum()})窗口标签的聚合策略直接影响召回率和误报率。np.any是最保守的做法——窗口内只要有一个异常点就标异常召回高但误报也会上去。如果异常是短脉冲这种策略会把大量正常窗口拉进异常类。另一种做法是设阈值比如异常点占比超过 20% 才标异常适合段异常为主的数据。我一般会两种都跑一遍看验证集上的 F1 再定。窗口大小和步长没有绝对最优但有个经验边界窗口长度不要超过异常平均持续时长的 3 倍否则正常片段会主导窗口特征步长不要小于窗口的 1/8否则训练集里相邻窗口几乎一样模型容易过拟合到特定相位。3. 选模型之前先定评估口径温度异常检测的指标陷阱3.1 为什么准确率在异常检测里基本没用温度信号异常检测数据集里异常样本占比通常极低。假设 10 万条数据里只有 500 条异常一个把所有样本都判为正常的模型准确率是 99.5%但它一个异常都抓不到。所以评估必须看 Precision、Recall、F1以及更贴近工业场景的误报率False Positive Rate和漏报率False Negative Rate。工业现场对误报的容忍度往往比漏报更低——频繁误报会让运维人员直接关掉告警。点调整Point-Adjusted是另一个容易踩的坑。有些论文在计算 F1 时只要预测出的异常段和真实异常段有重叠就把整个段算作正确。这种做法会显著抬高指标但在实际部署中你关心的是每个时间点是否判对。我一般会同时报标准 F1 和 Point-Adjusted F1以标准 F1 为准做模型选择。from sklearn.metrics import precision_score, recall_score, f1_score def evaluate(y_true, y_pred): 计算异常检测的核心指标 y_true: 真实标签0/1 y_pred: 预测标签0/1 p precision_score(y_true, y_pred, zero_division0) r recall_score(y_true, y_pred, zero_division0) f1 f1_score(y_true, y_pred, zero_division0) # 误报率正常样本中被判为异常的比例 fpr ((y_pred 1) (y_true 0)).sum() / (y_true 0).sum() # 漏报率异常样本中被判为正常的比例 fnr ((y_pred 0) (y_true 1)).sum() / (y_true 1).sum() return {precision: p, recall: r, f1: f1, fpr: fpr, fnr: fnr} # 假设 model 已经训练好X_test, y_test 为测试集 # y_pred model.predict(X_test) # print(evaluate(y_test, y_pred))zero_division0是为了避免模型全判正常时 precision 报 warning 并返回 0。FPR 和 FNR 的分母分别是正常样本数和异常样本数计算时注意布尔索引的括号优先级。如果测试集里没有异常样本FNR 会变成 nan这时候要检查数据划分是不是出了问题。3.2 基线模型选什么从统计方法到自编码器温度信号异常检测的基线模型分三个层次。第一层是统计方法3-sigma、IQR、EWMA 控制图。这类方法不需要训练适合快速验证数据里有没有明显异常。第二层是经典机器学习Isolation Forest、One-Class SVM、LOF。它们对特征工程依赖较大窗口统计量均值、方差、斜率、峰度作为输入时效果通常不错。第三层是深度学习LSTM-AE、USAD、TranAD、Anomaly Transformer。这类模型能自动学时序模式但需要足够多的正常样本做训练且调参成本高。我的建议是先用 3-sigma 和 Isolation Forest 跑一版拿到一个 baseline F1。如果 F1 已经超过 0.8说明数据里的异常比较明显不一定需要上深度学习。如果 F1 低于 0.5再考虑 LSTM-AE 这类模型。设备传感器温度信号异常检测数据集.rar 如果来自真实工业场景异常往往很隐蔽深度学习方案的上限更高但前提是正常样本足够干净。from sklearn.ensemble import IsolationForest from sklearn.preprocessing import StandardScaler import numpy as np # 用窗口统计量作为特征 def extract_features(X): X shape (M, window_size) feats [] for w in X: feats.append([ np.mean(w), np.std(w), np.max(w), np.min(w), np.median(w), np.percentile(w, 75) - np.percentile(w, 25), np.polyfit(np.arange(len(w)), w, 1)[0] # 斜率 ]) return np.array(feats) X_feat extract_features(X) scaler StandardScaler() X_feat_scaled scaler.fit_transform(X_feat) # 训练 Isolation Forestcontamination 根据异常比例设置 contamination y.sum() / len(y) clf IsolationForest(contaminationcontamination, random_state42) clf.fit(X_feat_scaled) # 预测-1 为异常1 为正常转为 0/1 y_pred (clf.predict(X_feat_scaled) -1).astype(int) print(evaluate(y, y_pred))contamination参数直接决定异常判定的阈值。如果不知道真实异常比例可以先用contaminationauto但自动模式在小样本上不稳定。np.polyfit拟合斜率时如果窗口内温度恒定会触发 RankWarning可以用np.polyfit(..., rcondNone)抑制。特征提取这一步是 Isolation Forest 的关键窗口统计量选得好F1 能差出 0.2 以上。4. 避坑与排查温度异常检测数据集落地时的五个血泪教训4.1 现象模型在验证集上 F1 很高上线后误报爆炸原因通常是验证集和训练集来自同一段工况模型学到了特定设备的温度基线换一台设备或换一个季节基线漂移导致正常数据被大量判异常。解决方法是做跨设备或跨时间段的验证划分而不是随机切分。如果数据里有多台设备按设备 ID 分组划分如果只有一台设备按时间前 70% 训练、后 30% 验证模拟上线后的分布偏移。4.2 现象解压后 CSV 读取报编码错误或列错位工业数据导出时常用 GBK 或 Latin-1 编码直接pd.read_csv会抛 UnicodeDecodeError。解决方法是先试encodinggbk再试encodinglatin-1。列错位通常是分隔符问题——有些文件用分号或制表符需要显式指定sep;或sep\t。如果文件里有中文列名读入后先df.columns df.columns.str.strip()去掉首尾空格否则后续按列名索引会 KeyError。4.3 现象窗口切完后异常样本几乎为零原因是异常持续时长小于窗口长度且用了np.any之外的聚合策略。比如窗口 120 点异常只持续 5 点按比例阈值 20% 算异常窗口占比不到 5%。解决方法是缩短窗口长度或者改用点级标签做序列标注每个时间点独立预测而不是窗口级分类。如果必须用窗口可以把异常窗口做过采样但要注意过采样后的窗口在时间上不能重叠太多否则验证集泄漏。4.4 现象LSTM-AE 训练 loss 不下降或降到零后突然反弹loss 不下降通常是学习率太大或窗口内温度没做归一化。温度值如果是摄氏度范围可能在 20 到 200 之间直接输入网络会导致梯度爆炸。解决方法是按传感器做 Z-score 归一化均值和方差只用训练集的正常样本计算。loss 降到零后反弹一般是模型记住了训练样本验证集 loss 上升这时候要加 Dropout 或 Early Stopping。我一般会监控验证集上的重构误差分布正常样本和异常样本的重构误差如果重叠严重说明模型没学到有区分度的表示。4.5 现象标签里 -1 和 1 混用二分类代码直接报错有些数据集用 -1 表示异常1 表示正常和常见的 0/1 相反。直接丢进 sklearn 的指标函数会算反。解决方法是先df[label] df[label].map({-1: 1, 1: 0})统一成 0/1再做后续处理。另外要检查有没有未标注样本通常用 -1 或 NaN 表示这些样本不能直接当正常用要么剔除要么用半监督方法单独处理。5. 把检测结果落回设备阈值调优与在线推理的实操技巧模型训练完只是半成品真正决定这套方案能不能用的是推理阶段的阈值和更新策略。离线评估时 F1 最高的阈值上线后往往需要往召回方向调——工业场景里漏报一个真实异常的成本通常高于多报几次让运维去确认。我一般会把验证集上的 Precision-Recall 曲线画出来选一个 Recall 不低于 0.9 且 FPR 可接受的阈值点而不是直接取 F1 最大点。在线推理时温度信号是流式到达的不能等整个窗口填满再判断。常见做法是维护一个环形缓冲区每来一个新点就更新窗口用训练好的模型对当前窗口打分。如果分数超过阈值触发告警但加一个冷却时间比如 5 分钟内不重复告警避免同一段异常刷屏。下面是一个简化的在线推理骨架from collections import deque import numpy as np class OnlineDetector: def __init__(self, model, scaler, window_size60, threshold0.5, cooldown_steps300): self.model model self.scaler scaler self.window deque(maxlenwindow_size) self.threshold threshold self.cooldown cooldown_steps self.last_alarm_step -cooldown_steps self.step 0 def update(self, value): 输入一个新温度值返回是否告警 self.window.append(value) self.step 1 if len(self.window) self.window.maxlen: return False # 归一化 window_arr np.array(self.window).reshape(1, -1) window_scaled self.scaler.transform(window_arr) # 模型打分假设输出为异常概率 score self.model.predict_proba(window_scaled)[0, 1] if score self.threshold: if self.step - self.last_alarm_step self.cooldown: self.last_alarm_step self.step return True return False # 使用示例 # detector OnlineDetector(model, scaler, window_size60, threshold0.7) # for v in stream_values: # if detector.update(v): # print(f步骤 {detector.step}: 触发异常告警)cooldown_steps根据采样率换算。1Hz 采样下 300 步就是 5 分钟。predict_proba要求模型有概率输出Isolation Forest 没有需要用decision_function的负值做近似或者换用带概率输出的分类器。阈值threshold不要硬编码建议从配置文件读方便不同设备用不同灵敏度。另一个实操技巧是定期用新数据更新归一化参数。温度传感器会老化基线会缓慢漂移如果 scaler 一直用训练时的均值和方差半年后正常数据可能被系统性判异常。我一般会每月用最近一周的正常数据重新拟合 scaler模型权重不动只更新预处理参数。这个习惯帮我省掉了很多“模型突然不准了”的排查时间。最后说一个我自己的教训不要一上来就追求 SOTA 模型。设备传感器温度信号异常检测数据集.rar 这类资源真正花时间的不是搭模型而是把数据对齐、标签清洗、评估口径定清楚。我见过太多人直接套 Anomaly Transformer结果因为标签里混了未标注样本F1 只有 0.3回头查了两天才发现是数据问题。先把 3-sigma 和 Isolation Forest 跑通拿到一个可信的 baseline再往上加复杂度每一步都有对照翻车了也知道是哪一层出的问题。希望帮到你。本文还有配套的精品资源点击获取