TKU-DS/tku-ds-classroom-7090fa-lab3-anomaly-detection-data-engineering-lab3-template
GitHub: TKU-DS/tku-ds-classroom-7090fa-lab3-anomaly-detection-data-engineering-lab3-template
这是一个数据工程教学实验模板,教授如何使用 MAD 鲁棒统计算法在滑动窗口中实时检测并过滤流数据中的点异常。
Stars: 0 | Forks: 0
# 实验 3:数据质量与异常检测
## 📌 目标
在现实世界中,边缘传感器会老化、遭受电磁干扰,或者其读数会经历突然的“闪崩”。如果我们允许这些损坏的数据进入我们的 pipeline,下游的 AI 模型将产生自信但错误的预测(垃圾进,垃圾出)。
本实验演示了流数据上的**鲁棒统计 (Robust Statistics)**。你将实现一个滑动窗口,并使用 **Median Absolute Deviation (MAD)** 算法实时检测并拒绝点异常,防止它们破坏边缘数据库。
## 🛠️ 环境设置
1. 从此仓库启动你的 **GitHub Codespaces**。
2. 打开 `lab3_anomaly_detection.py` 文件。
## 🚀 说明
1. 查看 `unstable_sensor_stream()` 函数。注意它偶尔会发出巨大的离群值(0.0 或 100.0),模拟硬件峰值。
2. 我们使用 `collections.deque(maxlen=WINDOW_SIZE)` 创建一个 $\mathcal{O}(W)$ 滑动窗口。
3. 在 `process_with_mad_filter()` 中找到 `TODO 1` 到 `TODO 5`。
4. 实现 MAD 逻辑:
* 找到当前窗口的中位数 (median)。
* 找到每个点与该中位数的绝对差值。
* MAD 就是这些差值的中位数。
* 如果传入的 `value` 与当前中位数的距离超过 $3 \times \text{MAD}$,则**拒绝它**(不要保存它,也不要将其添加到窗口中)。
5. 在终端中运行脚本:
python lab3_anomaly_detection.py
6. 在编辑器中打开 `raw_noisy_data.csv` 和 `clean_filtered_data.csv`,通过肉眼验证峰值是否已被移除。
## 🧠 思考题
1. **平均值的缺陷**:为什么我们不直接使用均值 (Mean) 和标准差 (Standard Deviation)(Z-score)来检测异常?如果一个巨大的离群值进入滑动窗口,均值会发生什么变化?
2. **Pipeline 韧性**:在我们的代码中,当我们检测到异常时,我们会直接将其丢弃。在现实世界的工厂监控系统中,默默地丢弃异常总是安全的吗?你会如何改进这种架构?(例如,记录丢弃日志)。
## ✅ 提交指南
1. 确保你的过滤器成功阻止了异常且没有崩溃。
2. 提交你的更改:
git add lab3_anomaly_detection.py
git commit -m "Complete Lab 3 MAD anomaly filter"
3. 推送代码:
git push origin main
标签:GitHub Classroom, Python, 中位数绝对偏差, 传感器数据, 信号处理, 实验室练习, 异常检测, 数据工程, 数据清洗, 数据科学, 数据管道, 数据质量, 无后门, 时间序列分析, 流数据处理, 滑动窗口, 纠错, 统计过滤, 资源验证, 软件工程, 边缘计算, 逆向工具, 鲁棒统计