news 2026/6/10 18:12:27

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
异常检测及修正 针对数据集进行模型检测,检测异常后对异常值采用算法进行修正。 修正完后生成修正...

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

最近在搞数据清洗的时候发现个有意思的事儿——异常值这东西就像炒菜时的盐,少了没味,多了毁所有。今天咱们直接上代码实战,看看怎么用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. 正常数据段几乎不受影响

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:09:29

AOT文档精读与实战应用,解锁高性能应用构建的秘密武器

第一章&#xff1a;AOT技术概述AOT&#xff08;Ahead-of-Time Compilation&#xff09;即“提前编译”技术&#xff0c;是一种在程序运行前将源代码或中间代码直接编译为本地机器码的编译策略。与JIT&#xff08;Just-in-Time&#xff09;在运行时动态编译不同&#xff0c;AOT在…

作者头像 李华
网站建设 2026/6/10 16:29:47

从入门到精通:构建可控并发的纤维协程架构(附压测数据对比)

第一章&#xff1a;从入门到精通&#xff1a;构建可控并发的纤维协程架构在现代高并发系统中&#xff0c;传统线程模型因资源消耗大、调度开销高而逐渐显现出局限性。纤维&#xff08;Fiber&#xff09;协程作为一种轻量级执行单元&#xff0c;能够在单线程或少量线程上实现成千…

作者头像 李华
网站建设 2026/6/10 11:08:20

Symfony 8 Content-Type处理全攻略:让接口兼容性提升90%

第一章&#xff1a;Symfony 8 响应格式化的核心机制Symfony 8 在响应格式化方面引入了更加灵活和统一的处理机制&#xff0c;通过 Serializer 组件与 Formatter 服务的深度集成&#xff0c;实现了对 JSON、XML、HTML 等多种输出格式的无缝支持。开发者无需手动构造响应内容&…

作者头像 李华
网站建设 2026/6/9 9:40:20

深度拆解:279模式如何重塑传统消费,构建增长新引擎?

“流量昂贵&#xff0c;复购艰难”-企业无法回避的困局&#xff0c;多数企业选择以“低价”破局&#xff0c;却陷入竞相压价的死循环。在此背景下&#xff0c;“279全新消费返利模式”正逐步展现其强大的市场影响力。一、279一个核心公式的诞生“2”&#xff1a;代表两两复制“…

作者头像 李华
网站建设 2026/6/10 11:05:53

词向量深度笔记:从 OneHot 到 Word2Vec(逻辑链 + 代码)

词向量深度笔记&#xff1a;从 OneHot 到 Word2Vec&#xff08;逻辑链 代码&#xff09; 前言 这是一篇关于 NLP 基石—— 词向量&#xff08;Word Embeddings&#xff09; 的系统笔记&#xff0c;内容来源于课程讲义、教材阅读和个人实践整理。 本文的核心目标是讲清楚逻辑链…

作者头像 李华