SVM SMOTE fit_resample() 函数永远运行但没有结果

数据挖掘 Python 预处理 麻木的 采样 打击
2021-10-11 03:29:34

问题

fit_resample(X,y)

完成 200 万行的执行花费的时间太长。

数据集规范

我有一个关于网络特征的标记数据集,其中X(特征)和Y(标签)分别具有形状(2M, 24)和形状(2M,11)

即数据集中有超过 200 万行。有 24 个特征和 11 个不同的类/标签。

X 和 Y 都是dtype 的numpy数组float

使用 SVM SMOTE 的动机

由于类不平衡,我意识到SVM SMOTE平衡它是一种很好的技术,从而提供更好的分类。

使用较小的子数据集进行测试

为了测试我的分类器的性能,我从小处着手。我从 200 万行的大数据集中制作了小子数据集。

它采用了以下代码:-

%%time
sm = SVMSMOTE(random_state=42)
X_res, Y_res = sm.fit_resample(X, Y)

第一个数据集仅包含 7.5k 行。运行该单元大约需要 800 毫秒。第二个数据集包含 115k 行。执行单元需要 20 分钟。

解决方案尝试

我的系统在连续运行超过 48 小时后崩溃,内存不足。

我尝试了一些想法,例如

1. 使用 %%px 将其拆分为在多个 CPU 内核上运行

更快的执行没有改进

2.使用NVIDIA GPU的

和上面一样。这更容易理解,因为在_smote.py构建库函数时没有考虑到 CUDA 的并行编程。

我对缺乏结果和温暖的 PC 感到非常沮丧。我该怎么办?

1个回答

这是预期的,与 SMOTE 采样无关。

非线性 SVM 的计算复杂度为 O(n2)O(n3)在哪里n是样本数。这意味着如果 7.5K 数据点需要 0.8 秒,那么 115K 应该需要 [3, 48] 分钟,

[(115/7.5)2×0.8,(115/7.5)3×0.8]s=[3,48]m,
从 16 小时到 175 天,11 天O(n2.5),对于 2M 个数据点。

您应该继续使用 100K 或更少的样本大小。此外,将准确度(或任何其他分数)作为 1K、10K、50K 和 100K 样本的函数来跟踪是富有成效的。SVM 精度有可能在 100K 之前就停止提高,因此,将样本限制在 100K 或更少不会有太多损失。