时间序列预测中的4大类8种异常值检测方法(从根源上提高预测精度)

时序异常检测汇总 时序异常检测 阅读详情
AI摘要

本文聚焦时间序列预测中的异常值检测。异常值会影响模型对数据模式的识别,因此检测异常值可提高模型预测精度。文中介绍了基于统计学、距离、密度和机器学习的多种异常值检测方法,并结合两个不同数据集进行说明,还对各方法效果进行了评价。

一、本文介绍

本文给大家带来的是时间序列预测中异常值检测,在我们的数据当中有一些异常值(Outliers)是指在数据集中与其他数据点显著不同的数据点。它们可能是一些极端值,与数据集中的大多数数据呈现明显的差异。异常值可能由于测量误差、异常事件、数据收集错误、噪声或其他未知原因而出现。所以因为这些异常值的存在我们的模型不能够很好的识别我们数据的模式,所以我们通常在训练之前都需要处理这些异常值点从而提高模型预测精度,所以就涉及到了本文的内容->异常值检测。本文的内容大家可以配套我的专栏中的实战案例进行使用可以检验你的异常值处理是否有效,

内容回顾:时间序列预测专栏->包括上百种时间序列预测模型、最新顶刊模型复现

目录

一、本文介绍

二、异常值检测方法

三、数据集介绍 

三、异常值检测

3.1 基于统计学的方法

3.1.1 标准差的方法 

3.1.2 基于箱线图的方法

3.2 基于距离的方法 

3.2.1 Z-Score方法

1.2.2 K-NN距离聚类方法 

3.3 基于密度的方法

3.3.1 LOF 的离群点检测

3.3.2 DBSCAN

4.4 基于机器学习的方法

4.4.1 孤立森林

4.4.2 自编码器 

五、全文总结 


二、异常值检测方法

我们选取一些比较常见的方法来介绍,不同的方法适合不同的数据,大家可以都进行尝试再配合自己的经验取判断是否是异常值,从而选取一种适合自己数据的方法,下面是一些方法的简要介绍,后面第三章开始进行讲解。

1. 基于统计学的方法:
   - 标准差方法:基于数据的标准差来判断观测值是否与平均值相差较大。
   - 箱线图:通过绘制箱线图来显示数据的分布范围和异常值。

2. 基于距离的方法:
   - Z-Score 方法:通过计算观测值与平均值之间的差异,标准化数据并将超过某个阈值的值视为异常值。
   - K-NN距离聚类方法:使用距离度量来检测与其他数据点距离较远的观测值。

3. 基于密度的方法:
   - 基于 LOF 的离群点检测:通过比较每个观测值周围点的密度来识别相对稀有的观测值。
   - DBSCAN:根据数据点周围的密度来判断观测值是否为离群点。

4. 基于机器学习的方法:
   - 孤立森林:使用随机树构建一种分割方式,将观测值从其他数据点中孤立出来,从而检测异常值。
   - 自编码器:通过对正常数据的重构来检测与原始数据重构误差较大的观测值。

这些方法可以根据不同数据集和应用场景的需求进行选择和组合使用。每种方法都有其特定的优势和限制,因此在进行异常值检测时,最好综合考虑多种方法来获得更准确的结果。

请注意:异常值检测并不意味着一定存在异常,它只是用于引起注意并进行进一步的调查。在进行异常值检测时,二一定要根据特定领域的知识和数据背景来确定何种观测值被认为是异常。

三、数据集介绍 

本文中我检测异常值用到了两个数据集,一个是官方的ETTh1另一个是某公司的业务水平,前者的官方数据集已经被处理过了数据很平稳,后者的数据集内容里面异常值比较多,所以用这两个数据集来进行一定的对比从而可以让大家更深入的了解异常值检测,下面是两个数据集的部分截图。

 

三、异常值检测

3.1 基于统计学的方法

3.1.1 标准差的方法 

效果评星:⭐

PS:这种方法呢就比较简单就是算均值和方差,超过上界或者下界的就是异常值点,就不多介绍了,均值和方差大家应该都明白。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

data = pd.read_csv('ETTh1-Test.csv')
# Calculate the mean and standard deviation
mean = data['OT'].mean()
std_dev = data['OT'].std()

# Define the number of standard deviations a data point has to be away from the mean to be considered an outlier
num_std_dev = 2

# Find outliers
outliers = data[np.abs(data['OT'] - mean) > num_std_dev * std_dev]

# Plotting
plt.figure(figsize=(10, 6))
plt.plot(data['OT'], label='Forecast Data', color='blue', alpha=0.7)
plt.scatter(outliers.index, outliers['OT'], color='red', label='Outliers')
plt.axhline(mean, color='green', linestyle='--', label='Mean')
plt.axhline(mean + num_std_dev * std_dev, color='orange', linestyle='--', label='Upper Bound')
plt.axhline(mean - num_std_dev * std_dev, color='orange', linestyle='--', label='Lower Bound')

# Enhancing the plot with a tech-style theme
plt.style.use('ggplot')
plt.title('Forecast Data with Outliers Highlighted', fontsize=15)
plt.xlabel('Index', fontsize=12)
plt.ylabel('Forecast Value', fontsize=12)
plt.legend()
plt.grid(True)

# Show the plot
plt.show()

3.1.2 基于箱线图的方法

效果评星:⭐⭐⭐

箱线图(Boxplot)确定异常值点的过程通常是基于四分位距来进行的。以下是具体步骤:

  1. 计算四分位数:

    • Q1(第一四分位数):数据集中所有数值由小到大排列后,位于25%位置的数值。
    • Q3(第三四分位数):同理,位于75%位置的数值。
  2. 计算四分位距(IQR):

    • IQR = Q3 - Q1
  3. 确定异常值范围:

    • 下界(Lower Bound)= Q1 - 1.5 * IQR
    • 上界(Upper Bound)= Q3 + 1.5 * IQR
  4. 判断异常值:

    • 凡是低于下界或高于上界的数值,都被视为异常值。
# 完整的代码示例

# 导入所需模块
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 读取数据
file_path = 'new50data (14).csv'
data = pd.read_csv(file_path)

# 计算异常值
Q1 = data['forecast'].quantile(0.25)
Q3 = data['forecast'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 标识异常值
data['forecast_Outlier'] = ((data['forecast'] < lower_bound) | (data['forecast'] > upper_bound))

# 创建折线图,并在其中标注异常值
plt.figure(figsize=(12, 6))

# 绘制OT值的折线图
sns.lineplot(data=data, x=data.index, y='forecast', label='forecast', color='blue')

# 标注异常值
outliers = data[data['forecast_Outlier']]
plt.scatter(outliers.index, outliers['forecast'], color='red', label='outlier')

plt.style.use('ggplot')

# 设置标题和标签
plt.title('forecast outlier detection', fontsize=15)
plt.xlabel('Time', fontsize=12)
plt.ylabel('forecast', fontsize=12)
plt.legend()

# 显示图表
plt.show()

# 返回异常值的界限和异常值的数量
lower_bound, upper_bound, outliers['OT'].count()

3.2 基于距离的方法 

3.2.1 Z-Score方法

效果评星:⭐⭐⭐⭐

Z-Score方法,也称为标准分数法,是一种用于识别异常值的统计技术。这种方法通过测量一个数据点与平均值的距离,并将其与标准差相比较来工作。Z-Score是一个表示数据点距离平均数多少个标准差的数值。具体步骤如下:

1. 计算平均值:
   - 平均值是所有数据点的总和除以数据点的数量。

2. 计算标准差:
   - 标准差是测量数据分布范围的一个统计量,它表示数据点相对于平均值的离散程度。

3. 计算每个数据点的Z-Score:
   - 对于每个数据点,Z-Score计算公式为:Z = \frac{(X - \text{Mean})}{\text{SD}}
   - 这里X是单个数据点的值。

4. 确定异常值:
   - 异常值通常定义为Z-Score的绝对值大于特定阈值的数据点,常用的阈值是 2 或 3。
   - 例如,如果Z-Score的绝对值大于3,那么这个数据点通常被视为异常值。

Z-Score方法在处理具有高斯(正态)分布特征的数据时特别有效。它可以识别那些与大多数数据显著不同的点。然而,对于不是正态分布的数据集,这种方法可能不太适用,因为它依赖于平均值和标准差,这两个参数在非正态分布的数据中可能不会提供有意义的洞察。

# 导入所需模块
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

# 读取数据
file_path = 'new50data (14).csv'  # 替换为您的文件路径
data = pd.read_csv(file_path)

# 计算forecast列的Z分数
data['Forecast_Z_Score'] = stats.zscore(data['forecast'])

# 定义离群点(这里以Z分数的绝对值大于2为标准)
data['Forecast_Outlier_Z'] = data['Forecast_Z_Score'].abs() > 2

# 创建折线图,并在其中标注离群点
plt.figure(figsize=(12, 6))
plt.style.use('ggplot')
# 绘制forecast值的折线图
sns.lineplot(data=data, x=data.index, y='forecast', label='Forecast Value', color='blue')

# 标注离群点
outliers = data[data['Forecast_Outlier_Z']]
plt.scatter(outliers.index, outliers['forecast'], color='red', label='Outliers (Z > 2)')

# 设置标题和标签
plt.title('Forecast Value Over Time with Z-Score > 2 Outliers', fontsize=15)
plt.xlabel('Time', fontsize=12)
plt.ylabel('Forecast Value', fontsize=12)
plt.legend()

# 显示图表
plt.show()

# 返回Z分数大于2的离群点的数量
outliers_count = outliers['forecast'].count()

1.2.2 K-NN距离聚类方法 

效果评星:这种方法我没测出来,可能是我数据集的原因,不好评价。

使用K-NN算法检测异常值是一种有效的方法,尤其适用于那些需要考虑数据点之间相互关系的场景。K-NN在检测异常值时的基本思想是:如果一个数据点的最近邻(即最接近的K个点)与它相距较远,则该点可能是异常值。下面是K-NN检测异常值的基本步骤:

  1. 选择K的值:

    • 确定K的值,即在考虑每个点的邻近点数量。K的值通常较小,如3或5。
  2. 计算距离:

    • 对于数据集中的每个点,计算它与所有其他点的距离。
  3. 找到最近的K个邻居:

    • 对于每个点,找出距离最近的K个邻居。
  4. 确定异常值判定规则:

    • 判定规则可以基于最近邻距离的平均值或最大值。例如,如果一个点与其最近的K个邻居的平均距离远大于大多数点的相应平均距离,则可以将其视为异常值。
  5. 标记异常值:

    • 根据上述规则,将那些看似不符合整体数据分布的点标记为异常值。

K-NN方法在检测异常值时的优势在于它不需要假设数据遵循特定的分布,这使得它适用于各种不同类型的数据集。然而,这种方法的效率在高维数据集中可能会降低,因为在高维空间中,计算距离变得复杂且不直观(这被称为“维度的诅咒”大家头一次听说么?)。此外,选择合适的K值也是实现有效检测的关键。

PS:此处需要注意的是我们的数据中都是相邻的点,所以用K-NN没有检测出异常值来。

# 设置较小的K值
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.neighbors import NearestNeighbors
import seaborn as sns
file_path = 'new50data (14).csv'  # 替换为你的文件路径
new_data = pd.read_csv(file_path)

n_neighbors_smaller = 2  # 减小K值

# 使用K-NN模型
knn_smaller = NearestNeighbors(n_neighbors=n_neighbors_smaller)
knn_smaller.fit(new_data[['forecast']])

# 计算每个点到其邻居的距离
distances_smaller, _ = knn_smaller.kneighbors(new_data[['forecast']])

# 计算平均距离
mean_distance_smaller = np.mean(distances_smaller, axis=1)

# 标记离群点
outlier_indices_smaller = np.where(mean_distance_smaller > n_neighbors_smaller)[0]
new_data['Outlier_KNN_Smaller'] = False
new_data.loc[outlier_indices_smaller, 'Outlier_KNN_Smaller'] = True

# 重新创建折线图,并在其中标注离群点
plt.figure(figsize=(12, 6))

# 绘制forecast值的折线图
sns.lineplot(data=new_data, x=new_data.index, y='forecast', label='Forecast Value', color='blue')

# 标注离群点
outliers_knn_smaller = new_data[new_data['Outlier_KNN_Smaller']]
plt.scatter(outliers_knn_smaller.index, outliers_knn_smaller['forecast'], color='red', label='Outliers (KNN, Smaller K)')

# 设置标题和标签
plt.title('Forecast Value with KNN Outliers (Smaller K)', fontsize=15, fontweight='bold')
plt.xlabel('Time', fontsize=12)
plt.ylabel('Forecast Value', fontsize=12)
plt.legend()

# 显示图表
plt.show()

# 返回离群点的数量
outliers_knn_smaller_count = outliers_knn_smaller['forecast'].count()

3.3 基于密度的方法

3.3.1 LOF 的离群点检测

效果评星:⭐⭐

LOF(Local Outlier Factor)算法是一种用于检测异常值(离群点)的算法,特别适用于具有高度聚集性质的数据集。它基于一个核心概念:离群点是那些在其邻域内稀疏分布的点。与简单的基于距离的方法不同,LOF考虑了局部密度的概念,从而更有效地识别不同密度区域中的异常值。以下是LOF算法的基本步骤:

  1. 计算局部密度:

    • 对于每个点,找出其K个最近邻居(这里的K与K-NN中的K类似,但在LOF中通常称为MinPts)。
    • 计算每个点到其邻居的距离,这些距离的平均值用来估计该点的局部密度。
  2. 计算局部离群因子(LOF):

    • 对于每个点,比较它的局部密度与其邻居的局部密度。
    • LOF分数是该点密度与其邻居密度的比值的平均值。如果一个点的密度远低于其邻居的密度,它的LOF分数将高于1。
  3. 标记异常值:

    • 根据LOF分数来判定异常值。通常,分数显著高于1的点被认为是异常值。

LOF算法的优势在于它不仅仅考虑了点之间的距离,而且还考虑了点的局部密度,这使得它在不同密度区域的数据集中表现良好。例如,在一个区域密度高而另一个区域密度低的数据集中,简单基于距离的方法可能会错误地将密度低区域的正常点标记为异常值,而LOF通过考虑局部密度,能够更准确地识别真正的异常值。

from sklearn.neighbors import LocalOutlierFactor
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 重新加载数据
new_file_path = 'new50data (14).csv'
new_data = pd.read_csv(new_file_path)

# 设置LoF参数
lof = LocalOutlierFactor(n_neighbors=10)  # 可以调整n_neighbors的值,来调整对数据的敏感度

# 使用LoF模型
lof_labels = lof.fit_predict(new_data[['forecast']])
lof_scores = -lof.negative_outlier_factor_  # LoF分数(负数,越小越异常)

# 标记离群点
new_data['Outlier_LoF'] = (lof_labels == -1)

# 创建折线图,并在其中标注离群点
plt.figure(figsize=(12, 6))

# 使用科技感的样式
sns.set(style="whitegrid")

# 绘制forecast值的折线图
sns.lineplot(data=new_data, x=new_data.index, y='forecast', label='Forecast Value', color='blue')

# 标注离群点
outliers_lof = new_data[new_data['Outlier_LoF']]
plt.scatter(outliers_lof.index, outliers_lof['forecast'], color='red', label='Outliers (LoF)')

# 设置标题和标签
plt.title('Forecast Value with LoF Outliers', fontsize=15, fontweight='bold')
plt.xlabel('Time', fontsize=12)
plt.ylabel('Forecast Value', fontsize=12)
plt.legend()

# 显示图表
plt.show()

# 返回离群点的数量
outliers_lof_count = outliers_lof['forecast'].count()
outliers_lof_count

3.3.2 DBSCAN

效果评星:⭐⭐⭐⭐⭐

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,用于将数据集中紧密相连的点组成簇,同时识别并排除异常值(噪声)。与基于距离或假设特定分布的聚类算法不同,DBSCAN专注于基于密度的聚类,这使得它可以识别任何形状的聚类,同时对异常值具有较好的鲁棒性。DBSCAN的基本原理和步骤如下:

  1. 核心概念:

    • 核心点:在给定半径(Eps)内有足够多(MinPts)邻居的点。
    • 边界点:在核心点的Eps邻域内但自身不满足核心点条件的点。
    • 噪声点:既不是核心点也不是边界点的点。
  2. 基本步骤:

    • 参数设定:确定两个关键参数——Eps(邻域半径)和MinPts(邻域内要求的最少点数)。
    • 识别核心点:对于每个点,如果其Eps邻域内有至少MinPts个点,则该点被标记为核心点。
    • 形成聚类:对于每个核心点,如果它尚未被分配到任何聚类中,开始创建一个新的聚类。然后,将所有与该核心点直接密集可达的点(包括其他核心点和边界点)添加到该聚类中。
    • 处理边界点:边界点可能被多个核心点共享,但它们会被分配到其中一个核心点所在的聚类。
    • 标识噪声:所有既不是核心点也不是边界点的点被视为噪声。
  3. 结果:

    • 最终,DBSCAN生成的聚类可能具有任意形状,算法还会识别并排除数据集中的噪声点。

DBSCAN的优点包括它不需要事先知道聚类的数量,能处理任意形状的聚类,并且对噪声具有较强的鲁棒性。然而,选择合适的Eps和MinPts参数对于获得好的聚类结果非常关键。特别是在数据集的密度不均匀时,选择一个全局最优的Eps和MinPts可能比较困难。此外,DBSCAN的性能在处理大规模高维数据时可能会下降,因为在高维空间中,所有点之间的距离都倾向于变得相似(这也是所谓的“维度的诅咒”)。

import pandas as pd
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
import seaborn as sns

new_file_path = 'ETTh1-Test.csv'
new_data = pd.read_csv(new_file_path)
# 设置DBSCAN参数
dbscan = DBSCAN(eps=0.05, min_samples=5)  # 参数可能需要根据数据进行调整

# 使用DBSCAN模型
dbscan_labels = dbscan.fit_predict(new_data[['OT']])

# 标记离群点(在DBSCAN中,-1标签表示离群点)
new_data['Outlier_DBSCAN'] = (dbscan_labels == -1)

# 创建折线图,并在其中标注离群点
plt.figure(figsize=(12, 6))

# 绘制forecast值的折线图
sns.lineplot(data=new_data, x=new_data.index, y='OT', label='OT Value', color='blue')

# 标注离群点
outliers_dbscan = new_data[new_data['Outlier_DBSCAN']]
plt.scatter(outliers_dbscan.index, outliers_dbscan['OT'], color='red', label='Outliers (DBSCAN)')

# 设置标题和标签
plt.title('OT Value with DBSCAN Outliers', fontsize=15, fontweight='bold')
plt.xlabel('Time', fontsize=12)
plt.ylabel('Forecast Value', fontsize=12)
plt.legend()

# 显示图表
plt.show()

# 返回离群点的数量
outliers_dbscan_count = outliers_dbscan['forecast'].count()

4.4 基于机器学习的方法

4.4.1 孤立森林

效果评星:⭐⭐⭐

孤立森林(Isolation Forest)是一种有效的异常值检测算法,特别适用于高维数据集。它基于这样一个简单的原理:异常值通常是稀有的并且与大多数其他数据点有显著的不同,因此更容易被“孤立”。下面是孤立森林算法的基本步骤和原理:

  1. 随机抽样:

    • 从数据集中随机抽取一定数量的样本。这些样本被用来构建孤立树(Isolation Trees)。
  2. 构建孤立树:

    • 对于每棵树,算法随机选择一个特征并随机选择一个分割值。基于这个特征和分割值,数据集被分割成两部分。这个过程递归进行,直到每个数据点都被“孤立”(即每个点都成为了树中的一个叶子节点)或达到了预设的树深度限制。
  3. 路径长度:

    • 在每棵孤立树中,每个点的路径长度被记录下来。路径长度是指从树的根节点到达该点所经过的边的数量。异常值由于更容易被孤立,通常会有更短的路径长度。
  4. 计算异常得分:

    • 通过对一个点在多棵孤立树中的路径长度进行平均,可以计算出该点的异常得分。得分越高,该点越可能是异常值。
  5. 判断异常值:

    • 根据设定的阈值或者通过比较所有点的异常得分,可以判定哪些点是异常值。

孤立森林的主要优点在于它对于大数据集和高维数据的高效处理能力,以及不需要基于任何分布假设。它特别适合于处理连续型数据。此外,由于其随机和递归的特性,孤立森林对于数据集中的小的异常群体也很敏感。

from sklearn.ensemble import IsolationForest
import pandas as pd
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
import seaborn as sns

new_file_path = 'new50data (14).csv'
new_data = pd.read_csv(new_file_path)
# 设置孤立森林参数
iso_forest = IsolationForest(n_estimators=100, contamination='auto', random_state=42)  # 可调整参数

# 使用孤立森林模型
iso_labels = iso_forest.fit_predict(new_data[['forecast']])

# 标记离群点(在孤立森林中,-1标签表示离群点)
new_data['Outlier_IsolationForest'] = (iso_labels == -1)

# 创建折线图,并在其中标注离群点
plt.figure(figsize=(12, 6))

# 绘制forecast值的折线图
sns.lineplot(data=new_data, x=new_data.index, y='forecast', label='Forecast Value', color='blue')

# 标注离群点
outliers_iso_forest = new_data[new_data['Outlier_IsolationForest']]
plt.scatter(outliers_iso_forest.index, outliers_iso_forest['forecast'], color='red', label='Outliers (Isolation Forest)')

# 设置标题和标签
plt.title('Forecast Value with Isolation Forest Outliers', fontsize=15, fontweight='bold')
plt.xlabel('Time', fontsize=12)
plt.ylabel('Forecast Value', fontsize=12)
plt.legend()

# 显示图表
plt.show()

# 返回离群点的数量
outliers_iso_forest_count = outliers_iso_forest['forecast'].count()
outliers_iso_forest_count

4.4.2 自编码器 

效果评星:⭐⭐⭐⭐⭐

自编码器(Autoencoder)是一种基于神经网络的算法,通常用于数据的降维和特征学习。由于其能力在于学习数据的正常分布,自编码器也被用于异常值检测。在这种应用中,自编码器通过学习重构正常数据的特征,然后利用重构误差来识别异常值。以下是使用自编码器进行异常值检测的基本步骤:

  1. 自编码器结构:

    • 自编码器通常包括两部分:编码器(Encoder)和解码器(Decoder)。
    • 编码器将输入数据压缩成一个低维表示(称为编码)。
    • 解码器从这个低维表示重构原始输入数据。
  2. 训练自编码器:

    • 使用正常数据(没有异常值的数据)训练自编码器。
    • 训练的目标是最小化输入数据和重构数据之间的差异,通常使用均方误差作为损失函数。
  3. 计算重构误差:

    • 在训练完成后,用自编码器对新的数据进行编码和解码。
    • 计算每个数据点的重构误差,即输入数据和重构数据之间的差异。
  4. 异常值判定:

    • 基于重构误差来判定数据是否异常。
    • 如果一个数据点的重构误差显著高于大多数其他数据点的误差,那么它可能是一个异常值。

自编码器在异常值检测中的优点包括其对数据特征的非线性和复杂关系的捕捉能力。这使得它适合于处理复杂的数据集。此外,由于是基于重构误差进行异常检测,自编码器不需要异常值的标签。

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
os.environ['KMP_DUPLICATE_LIB_OK']='TRUE'
# 加载数据
data_path = 'new50data (14).csv'  # 替换为您的文件路径
new_data = pd.read_csv(data_path)

# 准备数据
data_tensor = torch.tensor(new_data['forecast'].values.astype(np.float32)).view(-1, 1)
dataset = TensorDataset(data_tensor, data_tensor)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

# 定义自编码器模型
class Autoencoder(nn.Module):
    def __init__(self):
        super(Autoencoder, self).__init__()
        self.encoder = nn.Sequential(
            nn.Linear(1, 2),
            nn.ReLU())
        self.decoder = nn.Sequential(
            nn.Linear(2, 1),
            nn.Sigmoid())

    def forward(self, x):
        x = self.encoder(x)
        x = self.decoder(x)
        return x

# 初始化模型、损失函数和优化器
model = Autoencoder()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 训练模型
num_epochs = 50
for epoch in range(num_epochs):
    for data in dataloader:
        inputs, _ = data
        outputs = model(inputs)
        loss = criterion(outputs, inputs)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

# 评估模型
model.eval()
with torch.no_grad():
    predictions = model(data_tensor)
    mse = nn.functional.mse_loss(predictions, data_tensor, reduction='none')
    mse = mse.view(-1).numpy()

new_data['Reconstruction_Error'] = mse

# 定义重建误差的阈值为离群点
threshold = np.percentile(new_data['Reconstruction_Error'], 95)
new_data['Outlier_Autoencoder'] = new_data['Reconstruction_Error'] > threshold

# 使用seaborn样式
sns.set(style="whitegrid")

# 创建折线图,并在其中标注离群点
plt.figure(figsize=(12, 6))

# 绘制forecast值的折线图
plt.plot(new_data['forecast'], label='Forecast Value', color='blue')

# 标注离群点
outliers = new_data[new_data['Outlier_Autoencoder']]
plt.scatter(outliers.index, outliers['forecast'], color='red', label='Outliers (Autoencoder)')

# 设置标题和标签
plt.title('Forecast Value with Autoencoder Outliers', fontsize=15, fontweight='bold')
plt.xlabel('Time', fontsize=12)
plt.ylabel('Forecast Value', fontsize=12)
plt.legend()

# 显示图表
plt.show()

五、全文总结 

到此本文的异常值检测方法就全部讲完了,当然还有其它的异常值检测方法,但是上面几种是最常见的,其它的要么就太复杂,要么就比较老了,就不讲了,大家有兴趣可以自己调查调查,本文的内容是为了配合我的专栏进行数据预处理的操作,下一个文章我会发布当我们检测到异常值之后,对异常值处理的方法,下面推荐我的专栏内容给大家~

 概念理解 

15种时间序列预测方法总结(包含多种方法代码实现)

数据分析

时间序列预测中的数据分析->周期性、相关性、滞后性、趋势性、离群值等特性的分析方法

机器学习——难度等级(⭐⭐)

时间序列预测实战(四)(Xgboost)(Python)(机器学习)图解机制原理实现时间序列预测和分类(附一键运行代码资源下载和代码讲解)

深度学习——难度等级(⭐⭐⭐⭐)

时间序列预测实战(五)基于Bi-LSTM横向搭配LSTM进行回归问题解决

时间序列预测实战(七)(TPA-LSTM)结合TPA注意力机制的LSTM实现多元预测

时间序列预测实战(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)

时间序列预测实战(十一)用SCINet实现滚动预测功能(附代码+数据集+原理介绍)

时间序列预测实战(十二)DLinear模型实现滚动长期预测并可视化预测结果

时间序列预测实战(十五)PyTorch实现GRU模型长期预测并可视化结果

Transformer——难度等级(⭐⭐⭐⭐)

时间序列预测模型实战案例(八)(Informer)个人数据集、详细参数、代码实战讲解

时间序列预测模型实战案例(一)深度学习华为MTS-Mixers模型

时间序列预测实战(十三)定制化数据集FNet模型实现滚动长期预测并可视化结果

时间序列预测实战(十四)Transformer模型实现长期预测并可视化结果(附代码+数据集+原理介绍)

个人创新模型——难度等级(⭐⭐⭐⭐⭐)

时间序列预测实战(十)(CNN-GRU-LSTM)通过堆叠CNN、GRU、LSTM实现多元预测和单元预测

传统的时间序列预测模型(⭐⭐)

时间序列预测实战(二)(Holt-Winter)(Python)结合K-折交叉验证进行时间序列预测实现企业级预测精度(包括运行代码以及代码讲解)

时间序列预测实战(六)深入理解ARIMA包括差分和相关性分析

融合模型——难度等级(⭐⭐⭐)

时间序列预测实战(九)PyTorch实现融合移动平均和LSTM-ARIMA进行长期预测

时间序列预测实战(十六)PyTorch实现GRU-FCN模型长期预测并可视化结果

​

时间序列异常值检测方法 本博客将介绍几种常用的时间序列异常值处理方法,包括基于统计学的传统方法,如Z-score、IQR(四分位距)法,以及基于机器学习的更先进技术,如孤立森林(Isolation Forest)。我们将详细探讨这些方法的优缺点,应用场景及其在实际项目中的适用性。此外,本博客还会结合代码示例,演示如何使用Python处理时间序列中的异常值, 阅读详情

相关推荐

时序异常检测方法总结

时序异常检测

Mark_Australia的博客 6799

时间序列分析|异常值检测

时间序列异常值检测

帅帅de三叔 6541

时间序列预测中异常值检测的4大类8种核心方法与实践指南

在数据科学与机器学习领域,异常值检测是数据预处理和特征工程中的基础且关键的环节。其核心原理在于识别数据集中显著偏离主体模式的观测点,这些点可能源于数据采集错误、特殊事件或系统故障。有效的异常检测技术价值巨大,它能够提升后续建模的鲁棒性、提高预测精度,并有助于发现潜在的业务问题或机会。在时间序列分析、金融风控、工业物联网监控及网络安全等应用场景中,异常检测都是不可或缺的步骤。本文聚焦于时间序列预测任务,系统梳理了从经典的统计规则方法到前沿的机器学习模型在内的多种检测策略,其中,STL分解和孤立森林等方法因其对

weixin_30938149的博客 406

时间序列的异常检测与预测方法总结

以上就是全部内容了,如有问题,欢迎评论区一起交流。

心流的博客 8599

Power BI预测分析实战:时间序列与异常检测落地指南

预测分析是现代BI系统的核心能力,本质是将统计建模能力封装为业务可理解、可操作的可视化语言。其原理基于时间序列分解(ETS/STL)、季节性异常检测(S-H-ESD)和多变量回归洞察,技术价值在于消除建模与可视化的割裂,实现预测即模型、结果即解释。典型应用场景包括销售趋势预判、库存断货预警、客户投诉风险识别及运营指标动态校准。本文聚焦Power BI原生预测功能的工程化落地,深入解析FORECAST.ETS函数族、DAX置信区间构建、数据质量刚性前提与业务信任构建机制,覆盖从数据准备到预警集成的完整闭环。

weixin_34357436的博客 378

pandas异常值检测实战:IQR、标准差与业务规则三法精要

异常值检测是数据预处理的核心环节,本质是识别偏离正常分布模式的数值点。其原理涵盖统计稳健性(如IQR抗干扰)、分布假设(如3σ依赖正态性)及业务逻辑嵌入;技术价值在于提升模型稳定性、保障分析可信度、支撑根因诊断;典型应用场景包括用户行为分析、金融风控建模、IoT设备监控和电商销售归因。实践中需规避均值污染、多重检验假阳性、时间序列周期混淆等陷阱,并强调pandas与seaborn/matplotlib协同实现可解释可视化。本文聚焦真实业务中高频使用的IQR法、标准差法与业务规则法,提供可复用的判断逻辑与工程

weixin_32830601的博客 215

时间序列中的6大类10种异常值处理方法(从根源上提高预测精度)

本文介绍的内容是在时间序列中异常值处理的方法,当我进行时间序列分析建模收集数据的过程中,往往都存在着一些特数据情况导致数据中存在着一些异常值,这些异常值往往会导致模型识别到不正常的模式从而无法准确的预测, (我试验过一个数据集清楚之后MAE的精度甚至能提升0.1左右),所以对于异常值的检测和处理对于时间序列来说是十分重要的,本篇文章需要配合我的另一篇文章配合阅读,另一篇文章介绍了如何进行异常值检测,所以本文篇文章下面来介绍当我们检测出异常值之后如何进行异常值处理。

Snu77的博客 1万+

Prophet时间序列预测的深度评估与业务校准方法

时间序列预测模型的核心价值不仅在于精度,更在于可解释性与业务适配性。Prophet作为基于加法结构的趋势-季节-节假日分解模型,其预测能力依赖于对分段线性趋势、傅里叶季节项和脉冲式节假日效应的合理建模。理解其确定性数学结构(g(t)+s(t)+h(t)+ε(t))是开展有效评估的前提;而真正的模型健壮性,需通过预留测试集(Hold-Out Dataset)在真实时序约束下检验泛化能力,而非随机切分。评估必须超越RMSE,覆盖组件健康度、不确定性覆盖率及库存/调度等业务场景回测。本文聚焦Prophet在销售预

weixin_30755393的博客 356

时间序列预测中异常值检测的4大类8种方法与实践指南

在时间序列分析与预测领域,数据质量是决定模型精度的基石。异常值作为数据中的噪声或特殊事件记录,会严重扭曲模型对趋势、季节性和周期等核心模式的捕捉,导致预测结果偏离真实情况。其检测原理主要围绕识别偏离数据主体分布或模式的观测点,技术价值在于从源头提升数据的信噪比,为后续建模提供稳定、干净的输入,从而直接提升预测模型的稳健性与准确性。应用场景广泛,涵盖电力负荷预测、金融风控、设备故障预警、销售预测等多个需要对时序数据进行建模的领域。本文聚焦于时间序列预测中的异常值处理,系统梳理了基于统计分布、距离与密度、预测模

weixin_34194087的博客 374

自己动手写CPU(1)五级流水线及CPU第一条指令ori

自己动手写CPU(1)五级流水线及CPU第一条指令ori 动机 不知为何研一的自由时间突然多起来,可能人一闲下来就容易焦虑吧,hhhhhh。正好之前看到一本《自己动手写CPU》,就按照此书从头实做一遍MIPS指令集的CPU,也当做对大学课程的总结。之前看龙芯杯比赛的代码震惊到我了,想想那堆大佬本科在搞这东西而我本科在瓜瓜地刷分,感叹人之间的差距真的好大。痛定思痛,还是先动手做起来这才能假意安慰自己,我好像也不错。闲言少叙,让我们开始吧! 由于作者提供了各章实现的具体代码,所以该系列博客主要记录我过程中有哪些

谦豫 7082

Apollo MPC横纵向耦合控制学习笔记

Apollo MPC横纵向控制原理学习笔记

weixin_39199083的博客 1万+

时间序列预测中异常值检测:4大类8种方法实战解析与选型指南

在数据分析和机器学习领域,异常值检测是数据预处理的关键环节,其核心原理在于识别数据中显著偏离主体模式的观测点。从技术价值看,有效的异常检测能提升模型鲁棒性、保障分析结论可靠性,广泛应用于金融风控、工业物联网、运维监控等场景。本文聚焦时间序列这一特定数据结构,深入剖析基于统计分布、距离密度、预测模型及分解变换的四大类方法,并结合Z-Score、LOF、LSTM等热词,详解其适用场景与实战技巧,为构建高精度预测模型扫清数据障碍。

weixin_34408717的博客 404

如何理解界面陷阱电荷呢(interface trapped charge)和费米钉扎效应?

如何理解界面陷阱电荷呢?(interface trapped charge) 我们在学半导体物理的时候经常对各种界面态和陷阱分不清楚,然而这却是半导体中最为关键的知识点之一。我这路主要介绍一下如何比较直观地理解界面陷阱电荷,应该也有叫界面态,快态之类的。 在介绍界面陷阱电荷之前,我们可以回顾一下施主(donor)和受主(acceptor)的概念。在si中如果掺杂了n型杂质P,那么P由于最外层电子有5个,有一个电子比较容易跑走,成为自由移动的导电电子,在能带中可以表现为电子从禁带中的能级跃迁到导带,这种情况我

Wang_P_P的博客 3万+

D5-异常值处理方法(6大类10种)

异常值处理6大类10种方法全解析 本文系统梳理了异常值处理的6大类10种方法,涵盖从基础删除法到高级预测模型的应用场景,帮助数据从业者根据数据类型和业务需求选择最佳方案。 核心方法分类: 删除法:直接剔除错误明显的异常数据(如录入错误) 插值替换:包括线性插值、样条插值、前后填充三种子方法 平滑法:移动平均和指数加权平均两种时序数据处理技术 回归预测:利用变量相关性构建预测模型修正异常值 限制法:通过设定阈值截断极端值 分箱离散化:将连续数据转换为离散区间 选择建议: 时间序列数据优先考虑插值或平滑法 变量

ai12345678900008的博客 1349

HA集群 执行 hdfs haadmin -transitionToActive 失败

最近把一个单NameNode集群变更为HA集群,过程中都很顺利,nn1和nn2两个NameNode都显示standby状态,但是把nn1或者nn2切换到active状态时就会报错抛异常。 查看master上namenode启动日志,如下: Incompatible clusterID for journal Storage Directory /home/hadoop-zero/bigdat...

qq_34727158的博客 1764

Jetson AGX Orin和Drive AGX Orin相机的关联分析和编程指南

通过适当的相机接口和连接,以及使用适当的软件开发环境,开发人员可以在这些平台上实现相机功能。Jetson AGX Orin和Drive AGX Orin是NVIDIA推出的两款强大的计算平台,用于自动驾驶和人工智能应用。Jetson AGX Orin和Drive AGX Orin平台提供了强大的计算能力,使开发人员能够实现复杂的相机功能和算法。以上只是一些示例,Jetson AGX Orin和Drive AGX Orin平台提供了丰富的开发资源和工具,可用于实现各种复杂的相机应用。显示图像在一个窗口中。

CyberLynxO的博客 1122

时间序列预测专栏目录 | 深度学习、机器学习、融合模型、创新模型实战案例(附代码+数据集+原理介绍)

给大家推荐一下我的时间序列预测专栏,本专栏平均质量分98分,而且本专栏目前免费阅读,其中涉及机器学习、深度学习、融合模型、个人创新模型、数据分析等一系列有关时间序列的专栏,其中的实战的案例不仅有简单的模型类似于机器学习的ARIMA、Xgboost也有复杂的类似于深度学习的TPA-LSTM,还有个人创新的模型堆叠CNN-GRU-LSTM,同时本专栏的实战案例后期会持续的进行更新,复现各种最新的时间序列预测模型。时间序列预测的初学者、时间序列预测的工作者、数据分析的初学者。

Snu77的博客 1万+

YOLO26改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLO26-L !!! 最新的发文热点

Vision Clue Merge模块在Mamba - YOLO模型中同样重要,主要负责在模型的下采样过程中处理特征图,为后续的特征融合和目标检测任务提供更有效的信息。

Limiiiing的博客 473

时间序列预测中异常值处理的6大策略与实战指南

在时间序列分析与预测领域,数据质量是模型性能的基石。异常值作为数据中的特殊观测点,会严重扭曲模型的训练过程,导致预测结果偏离真实规律。其处理原理在于识别并修正或标记那些显著偏离序列常规模式的点,从而让模型能够更准确地捕捉核心趋势与季节性。从技术价值看,有效的异常值处理能直接提升预测精度、增强模型鲁棒性,并提高业务决策的可靠性。应用场景广泛覆盖零售销量预测、电力负荷预测、金融风险监控及物联网传感器数据分析等。本文聚焦于时间序列中的异常值,系统阐述了从识别到处理的完整方法论,特别深入探讨了STL分解和鲁棒模型这

weixin_29042035的博客 340

【图像去噪】基于梯度为0法实现图像去噪附matlab代码

近几年,徐立提出的 L0 梯度最小化模型在图像平滑领域得到了广泛的应用和发展[11]. 和以往的局部滤波模型不同的是该模型可以全局的估计图像的像素值,因此,L0 梯度最小化模型在处理图像的同时能够很好的保护图像的边缘.​。

qq_59747472的博客 186

Vue3 - 详解实现网站接入钉钉扫码登录功能,钉钉授权生成登录二维码用户用手机扫描二维码登陆,支持弹框式、浏览器单独新开页显示,钉钉扫描二维码登录详细流程及示例代码,最新vue集成钉钉扫码授权登录!

vue3,nuxt3,钉钉,扫码登录,vue3钉钉扫码登陆,钉钉授权第三方WEB网站扫码登录功能,钉钉扫码登录第三方网站,单点登录,二维码不显示,报错,扫了没反应,出错,vue3钉钉扫码登录,内嵌,获取个人信息,pc网页钉钉登录,钉钉扫码登录怎么新开一页,跳页显示二维码,内嵌登录二维码,iframe新页面弹出,弹出一个小窗口显示登录二维码,登录报错,扫码没反应,解决手机点登录报错没反应,官方文档,手机扫描钉钉二维码登录网站,页面弹出一个小窗口而不是打开一个页面,vue3中使用iframe实现另开小窗口扫码登

🏆 前端领域优质创作者 3696

Kronos如何突破金融预测效率瓶颈:基于时间序列token化的量化投资实践

2024年11月的某个交易日,某头部量化基金的风险控制团队遭遇了严峻挑战。当市场出现剧烈波动时,他们需要对500只持仓股票进行快速风险评估,传统系统却陷入了瘫痪——单只股票的1小时K线预测需要2.3秒,500只股票串行处理耗时近20分钟,远超过市场窗口允许的响应时间。这种"算力天花板"现象在量化投资领域普遍存在,其根源在于三个结构性矛盾:时间序列数据的连续性与模型并行处理需求的冲突、金融数据的高噪

gitblog_00779的博客 249

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

时间序列预测实战:从数据诊断到Matlab建模全流程

时间序列预测是数学建模与工业预测的核心技术,其本质在于理解数据的统计特性与业务含义。它并非简单套用ARIMA或LSTM等模型,而是始于平稳性检验、缺失值语义处理、异常值业务判别等基础诊断环节。Matlab作为高精度诊断工具箱,提供adftest、kpsstest、seasonaldecomp、isoutlier等关键函数,支撑从弱平稳判断到趋势-季节分解的完整推理链。技术价值体现在将原始杂乱数据转化为可建模的结构化序列,广泛应用于GDP预测、销量预估、电力负荷调度等场景。本文聚焦Matlab工程化实践,强调

weixin_33755557的博客 321

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

销售预测实战体系:从失效根源到可落地的5个硬核环节

销售预测本质上是将市场动态、业务动作与财务目标对齐的数据决策过程,其核心不在算法复杂度,而在目标定义、单元解构、特征归因与闭环验证。随着黑天鹅事件频发和渠道碎片化加剧,传统时间序列外推方法因颗粒度失真、因果倒置和外部变量缺失而普遍失效;机器学习介入需满足数据变异充分、特征可解释、结果可归因、周期匹配四大前提。本文聚焦端到端销售预测的底层逻辑,系统拆解预测目标定义、销售单元解构、特征生命周期管理、模型沙盒验证与预测价值闭环五大不可跳过环节,并结合快消、SaaS、工业品等多行业实证,揭示如何用朴素业务思维替代技

weixin_30878501的博客 573

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

时间序列预测的27个决策关键概念地图

时间序列预测不是纯数学建模,而是面向业务交付的系统性工程决策过程。其核心在于理解数据特性、诊断模型亚健康状态、嵌入业务逻辑并验证真实决策价值。从平稳性、缺失值语义、可预测性量化等基础概念,到残差自相关陷阱、预测区间退化、时间切分因果律等高发故障点,这些概念构成了连接算法输出与业务信任的关键桥梁。尤其在制造业、零售、能源等强周期、多源异构场景中,忽略‘循环平稳性检验’或‘事件日历编码规范’等概念,极易导致上线后指标持续恶化。本文提炼出27个经上百项目验证的‘决策临界点’概念,覆盖问题定义、诊断排查、业务增强与

weixin_34327223的博客 389

数据清洗头等大事:异常值检测与业务化处理实战指南

异常值是影响模型稳定性的关键数据质量问题,本质是数值分布与业务语义之间的断裂。其检测原理不仅依赖统计离群(如Z-Score、IQR),更需结合业务上下文判断类型——录入错误、测量偏差或真实黑天鹅事件。技术价值在于提升信噪比、保障模型鲁棒性与可解释性;典型应用场景覆盖金融风控、电商复购预测、医疗设备预警及物流时效分析。本文聚焦真实项目中‘如何识别、分类、处理并监控异常值’,特别强调业务分层IQR、自适应截断、孤立森林调参与异常特征工程等高阶策略。

sunjhgq的专栏 441
上一篇: YOLOv8改进 | ODConv卷积助力极限涨点(附修改后的C2f、Bottleneck模块代码)
下一篇: YOLOv8改进 | 注意力机制 | 添加DAttention (DAT)注意力机制实现极限涨点
Snu77
Snu77 优质创作者: 人工智能技术领域 优质创作者: 人工智能技术领域
博客等级 码龄5年 11万+粉丝 934原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Snu77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值