打乱分类时间序列数据

Shuffling a classification timeseries data

我正在处理时间序列二元分类问题。我的每一行代表一个人(我有 N 个消费者),而列是我从他那里得到的单个变量的每日测量值(每个消费者的 K 个测量值)。然后,我需要检测是否有人进行了欺诈(FLAG 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() 之类的东西来拆分我的 train/test 集合。但是,可以随机排列我的数据框中的行吗?或者更准确地说,我真的需要这样做吗?它对训练我的模型有帮助吗?

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

如果您要在训练和测试之间拆分数据,或者如果您正在进行批量训练,例如,批量 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,如果您使用传统的监督学习算法,例如逻辑回归。