如何处理极其不平衡的时间序列数据集

数据挖掘 scikit-学习 时间序列 交叉验证 阶级失衡
2022-03-09 05:41:46

我需要对一个相对较小的时间序列数据集进行分类。

训练集维度是 5087 行(分类)乘 3197 列(时间样本),它们是(或据我所知)模型的特征。我还不知道每个样本是否都很重要,稍后我会考虑下采样/过滤/傅立叶变换。

不幸的是,数据集非常不平衡:5087 行中只有 37 行(0.7%)是“正数”。你会如何处理这个问题?我将不得不使用 Scikit-learn 库。

由于这是我第一次使用 Scikit-learn 的方法,我想尝试一个非常简单的分类器,只有很少的超参数,然后从那里开始构建。

首先,选择分类器:逻辑回归,因为这是我能想到的最简单的一个,这只是一个测试。二、通过调整网格选择正则化参数三、选择分割交叉验证策略:我想使用分层引导但不幸的是库没有提供它所以我选择了分层随机分割四、选择度量:cohen's kappa 因为数据集太不平衡了,使精度偏差太大

脚本:

classifier = LogisticRegression(tol=1e-4, max_iter=500, random_state=1)
param_grid = {'C': list(range(3))}
splitter = StratifiedShuffleSplit(n_splits=5, random_state=1)
grid_searcher = GridSearchCV(classifier, param_grid, cv=splitter, scoring=make_scorer(cohen_kappa_score))
model = grid_searcher.fit(train_x, train_y)

首先是“cv = splitter”合法吗?其次,您如何看待这种做法?显然,有了这样一个微不足道的分类器,模型预测的都是负数,我也收到了一些警告:

FitFailedWarning:估计器拟合失败。这些参数在这个训练测试分区上的分数将设置为 nan ZeroDivisionError: float 除以零

1个回答

您的数据集非常不平衡,大多数模型都会忽略这 37 个样本。毕竟,0.7% 的测试失败似乎是一个非常好的结果!

有几种方法可以解决不平衡的数据集。我建议两个选项:(1)对正样本的错误分类给予非常高的惩罚——你的损失函数将被加权 L2,(2)重采样——当你随机抽取一行时,分配更高的概率来获得正样本比消极。

例如,参见https://www.kaggle.com/rafjaa/resampling-strategies-for-imbalanced-datasets以了解实施。以及如何处理神经网络中的类别不平衡?