打乱分类时间序列数据

Posted

技术标签:

【中文标题】打乱分类时间序列数据【英文标题】:Shuffling a classification timeseries data 【发布时间】:2022-01-16 10:45:00 【问题描述】:

我正在研究时间序列二元分类问题。我的每一行代表一个人(我有 N 个消费者),而这些列是我从他那里得到的单个变量的每日测量值(每个消费者的 K 个测量值)。然后,我需要检测是否有人进行了欺诈(标志 1 或 0)。这里有一个小例子:

data = 'CONS_NO': [1,2,3,'N'], 'Day_1': [1, 2, 3, 4], 'Day_2': [200, 321, 0, 128], 'Day_K': [123, 0, 3, 1], 'FLAG':[1,1,0,0]
  
# Create DataFrame  
df = pd.DataFrame(data)
df

  CONS_NO  Day_1  Day_2  Day_K  FLAG
0       1      1    200    123     1
1       2      2    321      0     1
2       3      3      0      3     0
3       N      4    128      1     0

我的数据集现在是这样的,前 3000 行由实施欺诈的消费者组成,而其余行由诚实的消费者组成。

我已经看到我不应该洗牌我的列,我需要使用TimeSeriesSplit() 之类的东西来拆分我的训练/测试集。但是,可以打乱我的数据框中的行吗?或者更准确地说,我真的需要这样做吗?它对训练我的模型有帮助吗?

【问题讨论】:

【参考方案1】:

您通常希望打乱您的数据,以确保您的训练集和测试集代表整体(数据)分布。

如果您要在训练和测试之间拆分数据,或者如果您正在进行批量训练(例如,批处理 SGD),则打乱数据非常重要。如果它是一个简单的学习算法,例如MLE 可以在内存中的完整数据集上完成,并且数据集只是用于训练,则不需要洗牌。

洗牌你的数据:

df = df.sample(frac=1).reset_index(drop=True)

或者您可以使用sklearn 来洗牌和拆分数据:

from sklearn.model_selection import train_test_split
X = df.iloc[:, :-1]
y = df['FLAG']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, shuffle=True)

这个post 对洗牌的重要性进行了很好的讨论。

这是假设时间序列顺序并不重要并且i.i.d,如果您使用传统的监督学习算法,例如逻辑回归。

【讨论】:

由于train_test_split 只对数据集的行进行洗牌,我想我可以用它来解决我的问题。或者,在使用测试集对我的模型执行最终评估之前,可以使用 cross_val_score 获取该验证集。 太棒了!是的,通常仅当您将特征子集作为学习算法的一部分时才进行洗牌,例如ensembles 可以帮助减少差异

以上是关于打乱分类时间序列数据的主要内容,如果未能解决你的问题,请参考以下文章

文本分类 - DNN

拼图问题-打乱的图能否还原

算法KNNSVM算法详解!

如何随机打乱 bigquery 数据集中大表的所有行?

在 SQL Server 中打乱列?

我需要以相同的随机方式随机打乱两个熊猫数据帧的行