2026/1/10 2:39:48
网站建设
项目流程
秦皇岛网站制作与网站建设,最近国际局势最新消息,广告制作单位,好看影视大全免费下载安装异常检测及修正
针对数据集进行模型检测#xff0c;检测异常后对异常值采用算法进行修正。
修正完后生成修正前后的对比效果图最近在搞数据清洗的时候发现个有意思的事儿——异常值这东西就像炒菜时的盐#xff0c;少了没味#xff0c;多了毁所有。今天咱们直接上代码实战检测异常后对异常值采用算法进行修正。 修正完后生成修正前后的对比效果图最近在搞数据清洗的时候发现个有意思的事儿——异常值这东西就像炒菜时的盐少了没味多了毁所有。今天咱们直接上代码实战看看怎么用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, replaceFalse) 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], cred, 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, alpha0.5) plt.scatter(x[detected_outliers], y[detected_outliers], corange, edgecolork, s80, label检测到的异常) plt.title(f检测到{len(detected_outliers)}个异常点)![异常点检测效果示意图]重头戏来了——异常修正。咱们不用简单的均值替换改用滑动窗口中位数这样能保留数据波动特征from scipy.ndimage import median_filter def smooth_outliers(data, window_size5): cleaned data.copy() median_vals median_filter(data, sizewindow_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], cred) plt.subplot(2,1,2) plt.plot(x, y_cleaned, cgreen, label修正后) plt.scatter(x[detected_outliers], y_cleaned[detected_outliers], clime, edgecolork) plt.tight_layout()![修正前后对比图]看对比图发现几个有意思的点峰值处的异常被拉回正常波形连续异常点会被窗口内的正常值中和正常数据段几乎不受影响不过这个方法在数据突变区域可能矫枉过正这时候需要调整窗口大小或者换用更复杂的插值方法。实际项目中建议先用这段代码快速验证再针对业务场景微调算法参数。