当前位置: 首页 > news >正文

异常检测及修正 针对数据集进行模型检测,检测异常后对异常值采用算法进行修正。 修正完后生成修正...

异常检测及修正 针对数据集进行模型检测,检测异常后对异常值采用算法进行修正。 修正完后生成修正前后的对比效果图

最近在搞数据清洗的时候发现个有意思的事儿——异常值这东西就像炒菜时的盐,少了没味,多了毁所有。今天咱们直接上代码实战,看看怎么用Python揪出那些捣乱的异常点,再给它整容成正常数据。

先来点刺激的,咱们自己造一组带坑的数据:

import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 4*np.pi, 200) y = np.sin(x) # 随机插入20个异常值 np.random.seed(42) outliers = np.random.choice(200, 20, replace=False) y[outliers] += np.random.uniform(-3, 3, 20) # 异常幅度±3 plt.figure(figsize=(12,4)) plt.plot(x, y, label='原始数据') plt.scatter(x[outliers], y[outliers], c='red', label='真实异常') plt.legend()

![原始数据带异常点示意图]

抓异常这事,咱们用IQR(四分位距)方法更靠谱。比起简单粗暴的3σ原则,IQR对极端值更敏感:

def detect_outliers_iqr(data): q1 = np.percentile(data, 25) q3 = np.percentile(data, 75) iqr = q3 - q1 lower_bound = q1 - 1.5*iqr upper_bound = q3 + 1.5*iqr return (data < lower_bound) | (data > upper_bound) outlier_mask = detect_outliers_iqr(y) detected_outliers = np.where(outlier_mask)[0]

这里有个坑要注意——IQR对周期性数据可能误伤,但咱们的正弦波幅度稳定,刚好适用。检测出的异常点用散点标出来更直观:

plt.figure(figsize=(12,4)) plt.plot(x, y, alpha=0.5) plt.scatter(x[detected_outliers], y[detected_outliers], c='orange', edgecolor='k', s=80, label='检测到的异常') plt.title(f"检测到{len(detected_outliers)}个异常点")

![异常点检测效果示意图]

重头戏来了——异常修正。咱们不用简单的均值替换,改用滑动窗口中位数,这样能保留数据波动特征:

from scipy.ndimage import median_filter def smooth_outliers(data, window_size=5): cleaned = data.copy() median_vals = median_filter(data, size=window_size) cleaned[outlier_mask] = median_vals[outlier_mask] return cleaned y_cleaned = smooth_outliers(y)

这个median_filter是个好东西,它用滑动窗口计算中位数。窗口大小选5,刚好能覆盖正弦波的半个周期。对比下修正效果:

plt.figure(figsize=(12,6)) plt.subplot(2,1,1) plt.plot(x, y, label='修正前') plt.scatter(x[detected_outliers], y[detected_outliers], c='red') plt.subplot(2,1,2) plt.plot(x, y_cleaned, c='green', label='修正后') plt.scatter(x[detected_outliers], y_cleaned[detected_outliers], c='lime', edgecolor='k') plt.tight_layout()

![修正前后对比图]

看对比图发现几个有意思的点:

  1. 峰值处的异常被拉回正常波形
  2. 连续异常点会被窗口内的正常值中和
  3. 正常数据段几乎不受影响

不过这个方法在数据突变区域可能矫枉过正,这时候需要调整窗口大小或者换用更复杂的插值方法。实际项目中建议先用这段代码快速验证,再针对业务场景微调算法参数。

http://www.cnnetsun.cn/news/69201.html

相关文章:

  • 行为树优化全攻略(性能翻倍的4个秘密武器)
  • 直流电机双闭环调速系统仿真模型:转速外环与电流内环PI参数整定指南,无静差跟踪实现功能介绍
  • 滑膜控制下的差动制动防侧翻稳定系统设计与仿真验证:横摆力矩分配策略及其实车测试分析
  • 模型压缩技术详解:剪枝、量化与知识蒸馏,让你的大模型轻量化部署
  • Iridescent:Day23
  • Laravel 13多模态权限实现技巧(99%的开发者忽略的关键细节)
  • 测试数据自动生成方法:策略、实施与最佳实践
  • 【医疗数据安全防线】:如何用PHP构建自动备份体系
  • 【R-Python模型融合实战】:揭秘跨平台建模结果验证的5大核心步骤
  • 从田间到R控制台,方差分析如何改变传统农业决策?
  • 基于comsol的多层冻土地基冻涨模型研究:低温热流固三场耦合效应的固体力学模拟
  • 2025年最新阿勒泰地区道路矢量数据
  • 设计模式[10]——外观模式一分钟彻底说清楚
  • Temu 分销重塑跨境生态:轻资产时代的新增长法则
  • Hello World的深度演进:一个Ascend C标量算子的性能剖析之旅
  • [Python桌面开发] 本地多服务启动神器:Python + Tkinter 构建“进程批量启动与监控工具”(跨平台 GUI + 源码开放)
  • 量子算法的实现路径解析(工业级应用稀缺技术曝光)
  • 揭秘Python最被低估的8个标准库,第6个能省下你一半代码量
  • GraphQL + PHP错误处理全解析,构建高可用API的必备技能
  • 当AI接管代码:哈佛调查显示53%年轻开发者每天用AI,却59%担心被取代,这届程序员太难了!
  • 16、编程中的颜色与图形绘制及HTML基础入门
  • PHP 8.6的JIT缓存机制揭秘:5大策略提升应用执行效率300%
  • 基于微信小程序的动漫社区交流小程序的设计与实现(源码+lw+部署文档+讲解等)
  • 响应格式化踩坑实录:Symfony 8开发者必须避开的5个陷阱
  • PHP 8.6性能监控面板实战(专家级配置全公开)
  • 性能监控在DevOps中的角色
  • RN Hooks 设计规范与反模式清单
  • 《Advanced Science》最新研究:多自由度折纸模块构建可编程机械超材料网络
  • 用梯形图+SCL玩转FactoryIO码垛控制
  • 7、Nagios 安装与功能拓展全解析