打乱分类时间序列数据
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 可以帮助减少差异以上是关于打乱分类时间序列数据的主要内容,如果未能解决你的问题,请参考以下文章