我正在研究非常大的熊猫数据框,这些数据框保存具有显着特征漂移的时间序列。漂移通常是突然的(例如,特征将比之前几个时期大 1.5-2.0 倍)。
我找到了几种检测“概念漂移”的解决方案。一种方便的选择是 河流 然而,该解决方案不是矢量化的。
显然,矢量化方法要快得多 - 最简单的,例如使用 pandas 内置函数来获取移动平均值并查看这些变化/跳跃
df.groupby().mean().rolling()
什么是否有矢量化方法来处理上述任务?
以下是使用向量化运算在 Pandas 列中检测特征漂移的一些方法:
1. 滚动统计和阈值:
- 思路: 计算滚动窗口的统计数据(例如平均值、标准差),并检测超出预定义阈值的重大变化。
- 代码:
import pandas as pd
# 定义窗口大小和阈值
window_size = 10
threshold = 1.5
# 计算滚动平均值和标准差
df['rolling_mean'] = df['column_name'].rolling(window=window_size).mean()
df['rolling_std'] = df['column_name'].rolling(window=window_size).std()
# 检测漂移
df['drift'] = ((df['column_name'] > df['rolling_mean'] + threshold * df['rolling_std']) |
(df['column_name'] < df['rolling_mean'] - threshold * df['rolling_std']))
- 优点: 简单、高效。
- 缺点: 需要手动调整窗口大小和阈值,可能无法检测到复杂的漂移模式。
2. 滚动 Z 分数:
- 思路: 计算滚动窗口的 Z 分数,并检测超出预定义阈值的异常值。
- 代码:
import pandas as pd
# 定义窗口大小和阈值
window_size = 10
threshold = 3
# 计算滚动 Z 分数
df['rolling_zscore'] = (df['column_name'] - df['column_name'].rolling(window=window_size).mean()) / df['column_name'].rolling(window=window_size).std()
# 检测漂移
df['drift'] = (df['rolling_zscore'].abs() > threshold)
- 优点: 对数据规模的变化更稳健。
- 缺点: 仍然需要手动调整窗口大小和阈值。
3. 指数加权移动平均线 (EWMA):
- 思路: 计算数据的 EWMA,并检测与当前值的重大偏差。
- 代码:
import pandas as pd
# 定义平滑因子和阈值
alpha = 0.1
threshold = 0.05
# 计算 EWMA
df['ewma'] = df['column_name'].ewm(alpha=alpha).mean()
# 检测漂移
df['drift'] = (abs(df['column_name'] - df['ewma']) > threshold)
- 优点: 对近期数据赋予更大权重,适用于检测逐渐漂移。
- 缺点: 需要调整平滑因子。
4. 使用
numpy.diff
进行快速变化检测:
- 思路: 计算连续行之间的差异,并检测超过阈值的大跳跃。
- 代码:
import pandas as pd
import numpy as np
# 定义阈值
threshold = 0.5
# 计算连续行之间的差异
df['diff'] = np.diff(df['column_name'], prepend=0)
# 检测漂移
df['drift'] = (df['diff'].abs() > threshold)
- 优点: 简单、高效,适用于检测突然的漂移。
- 缺点: 可能对噪声数据敏感。
这些只是可以使用 Pandas 进行特征漂移检测的几种矢量化方法。最佳方法取决于的特定需求和数据特征。可以尝试不同的方法并比较它们的表现,为的用例找到最佳方法。
标签:python,pandas,filtering,feature-engineering,drift From: 78142075