WEBKT

Prophet 异常值处理:从识别、过滤到业务结合的实战指南

13 0 0 0

Prophet 异常值处理:从识别、过滤到业务结合的实战指南

什么是异常值?

为什么需要处理异常值?

Prophet 中异常值的识别

1. 可视化观察

2. 统计学方法

3. Prophet 的 plot_components 方法

Prophet 中异常值的处理策略

1. 删除(Deletion)

2. 替换(Imputation)

3. 调整(Adjustment)

4. 设置上限/下限(Capping/Flooring)

5. 不处理(No Action)

结合业务背景知识

案例分析

总结

Prophet 异常值处理:从识别、过滤到业务结合的实战指南

在使用 Facebook Prophet 进行时间序列预测时,异常值(Outliers)的处理是一个绕不开的话题。它们就像数据海洋中的“暗礁”,如果处理不当,可能会严重影响预测模型的准确性。别担心,今天咱们就来聊聊 Prophet 中异常值处理的那些事,让你轻松驾驭这些“捣蛋鬼”。

什么是异常值?

在统计学中,异常值是指明显偏离数据集中其他观测值的那些数据点。在时间序列数据中,异常值通常表现为突然的峰值或谷值,与数据的整体趋势或周期性模式不符。这些异常值可能是由各种原因引起的,例如:

  • 数据录入错误: 人工录入数据时难免会出现错误,比如多敲了一个零、输错了日期等。
  • 测量误差: 传感器故障、仪器不稳定等都可能导致测量数据出现偏差。
  • 真实事件: 某些特殊事件确实会导致数据出现异常波动,例如促销活动、自然灾害、政策变化等。
  • 系统故障: 软件或硬件故障也可能导致数据异常。

为什么需要处理异常值?

异常值对 Prophet 模型的影响主要体现在以下几个方面:

  1. 扭曲趋势: 异常值可能会被模型误认为是趋势的一部分,导致预测结果偏离实际情况。
  2. 影响季节性: 异常值可能会干扰模型对季节性模式的识别,使得预测结果出现周期性偏差。
  3. 降低预测精度: 异常值会增加模型的误差,降低预测的准确性和可靠性。

Prophet 中异常值的识别

在处理异常值之前,我们需要先识别出它们。Prophet 本身并没有提供专门的异常值检测功能,但我们可以借助一些统计学方法和可视化工具来辅助识别。

1. 可视化观察

最直观的方法就是绘制时间序列数据的折线图,观察是否存在明显的峰值或谷值。在 Python 中,我们可以使用 matplotlibplotly 等库来绘制图形。

import pandas as pd
import matplotlib.pyplot as plt
# 假设 df 是包含时间序列数据的 DataFrame,ds 列是时间,y 列是值
df = pd.read_csv('your_data.csv')
df['ds'] = pd.to_datetime(df['ds'])
plt.figure(figsize=(12, 6))
plt.plot(df['ds'], df['y'])
plt.xlabel('Date')
plt.ylabel('Value')
plt.title('Time Series Data')
plt.show()

通过观察图形,我们可以初步判断哪些时间点的数据可能存在异常。

2. 统计学方法

除了肉眼观察,我们还可以使用一些统计学方法来更客观地识别异常值。常用的方法包括:

  • 3σ 原则: 对于服从正态分布的数据,99.7% 的数据会落在均值 ± 3 倍标准差的范围内。超出这个范围的数据可以被认为是异常值。
  • 箱线图: 箱线图可以显示数据的四分位数、中位数和异常值范围。通常,超出上下须的数据被认为是异常值。
  • Z-score: Z-score 表示数据点偏离均值的程度,以标准差为单位。通常,Z-score 绝对值大于 3 的数据被认为是异常值。
  • IQR(四分位距): IQR 是上四分位数和下四分位数的差值。通常,超出 Q1 - 1.5 * IQR 或 Q3 + 1.5 * IQR 范围的数据被认为是异常值。
import numpy as np
# 计算 Z-score
df['zscore'] = np.abs((df['y'] - df['y'].mean()) / df['y'].std())
# 识别异常值
outliers = df[df['zscore'] > 3]
print(outliers)

3. Prophet 的 plot_components 方法

Prophet 提供了一个 plot_components 方法,可以分解时间序列数据的趋势、季节性和节假日成分。通过观察这些成分,我们也可以发现一些潜在的异常值。

from prophet import Prophet
# 假设 df 已经准备好
m = Prophet()
m.fit(df)
forecast = m.predict(df)
m.plot_components(forecast)

如果趋势成分或季节性成分中出现明显的异常波动,那么这些波动可能对应着原始数据中的异常值。

Prophet 中异常值的处理策略

识别出异常值后,我们需要根据具体情况选择合适的处理策略。常见的处理策略包括:

1. 删除(Deletion)

如果异常值是由数据录入错误或测量误差引起的,并且数量较少,那么最简单的处理方法就是直接删除这些异常值。

# 假设 outliers 是包含异常值信息的 DataFrame
df_cleaned = df[~df.index.isin(outliers.index)]

注意: 删除异常值可能会丢失一些信息,因此在删除之前需要仔细评估其影响。

2. 替换(Imputation)

如果异常值是由真实事件引起的,或者我们不想丢失数据信息,那么可以使用替换的方法来处理异常值。常见的替换方法包括:

  • 均值/中位数替换: 用数据的均值或中位数来替换异常值。
  • 众数替换: 用数据的众数来替换异常值。
  • 线性插值: 使用异常值前后数据的线性插值来替换异常值。
  • K 近邻插值: 使用与异常值最近的 K 个数据的平均值来替换异常值。
  • Prophet 预测值替换: 使用 Prophet 模型对异常值进行预测,然后用预测值来替换异常值。这种方法需要先用不包含异常值的数据训练一个 Prophet 模型。
# 使用线性插值替换异常值
df['y_imputed'] = df['y'].copy()
df.loc[df['zscore'] > 3, 'y_imputed'] = np.nan
df['y_imputed'] = df['y_imputed'].interpolate()

3. 调整(Adjustment)

如果异常值是由已知事件引起的,例如促销活动或节假日,那么我们可以通过调整模型来考虑这些事件的影响。Prophet 提供了 add_regressoradd_seasonality 方法来添加额外的回归量或季节性成分。

例如,假设我们在 6 月 18 日进行了一次促销活动,导致销量激增。我们可以添加一个名为 promotion 的回归量来表示促销活动的影响。

df['promotion'] = 0
df.loc[df['ds'] == '2024-06-18', 'promotion'] = 1
m = Prophet()
m.add_regressor('promotion')
m.fit(df)

4. 设置上限/下限(Capping/Flooring)

对于某些业务场景,数据的取值范围是有限制的。例如,库存量不可能为负数,销售额不可能超过某个上限。我们可以通过设置上限和下限来处理超出范围的异常值。

df['y_capped'] = df['y'].copy()
df.loc[df['y_capped'] > upper_limit, 'y_capped'] = upper_limit
df.loc[df['y_capped'] < lower_limit, 'y_capped'] = lower_limit

5. 不处理(No Action)

在某些情况下,我们也可以选择不处理异常值。例如,如果异常值是由真实事件引起的,并且我们希望模型能够捕捉到这些事件的影响,那么我们可以保留这些异常值。但是,我们需要确保模型对异常值具有一定的鲁棒性,不会被它们过度影响。

结合业务背景知识

异常值的处理不仅仅是技术问题,更需要结合业务背景知识。我们需要了解数据产生的过程、业务的特点以及异常值可能的原因,才能选择最合适的处理策略。

例如,对于电商平台的销售数据,我们需要考虑以下几个问题:

  • 促销活动: 促销活动通常会导致销量激增,这些数据点不应该被视为异常值。
  • 季节性: 电商销售数据通常具有明显的季节性,例如双十一、618 等购物节。我们需要将这些季节性因素考虑在内。
  • 新品上市: 新品上市初期可能会出现销量快速增长的情况,这些数据点也不应该被视为异常值。
  • 缺货: 如果商品缺货,会导致销量下降,这些数据点可能需要特殊处理。

只有充分了解业务背景,才能做出正确的判断,避免“误伤”正常数据。

案例分析

假设我们有一份电商平台的每日销售数据,我们需要预测未来一个月的销售额。数据中包含了一些异常值,我们需要对它们进行处理。

  1. 数据探索: 首先,我们绘制时间序列数据的折线图,观察数据的整体趋势和周期性。发现数据存在明显的季节性,并且在某些时间点出现了明显的峰值。
  2. 异常值识别: 我们使用 Z-score 方法来识别异常值。发现 Z-score 绝对值大于 3 的数据点主要集中在促销活动期间。
  3. 异常值处理: 由于这些异常值是由促销活动引起的,我们选择添加一个名为 promotion 的回归量来表示促销活动的影响。同时,我们还添加了年度季节性和周度季节性,以更好地捕捉数据的周期性模式。
  4. 模型训练和预测: 我们使用处理后的数据训练 Prophet 模型,并预测未来一个月的销售额。
  5. 结果评估: 我们将预测结果与实际数据进行比较,评估模型的准确性。发现处理异常值后,模型的预测精度得到了明显提升。

总结

异常值处理是时间序列预测中的一个重要环节。我们需要根据具体情况选择合适的处理策略,并结合业务背景知识做出正确的判断。Prophet 提供了灵活的工具和方法,可以帮助我们更好地处理异常值,提高预测模型的准确性。希望今天的分享对你有所帮助,让你在时间序列预测的道路上更加游刃有余!

技术宅老王 Prophet异常值处理时间序列预测

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/8808