执行 SMOTE 后的训练/测试拆分

数据挖掘 机器学习 评估 阶级失衡 打击
2021-10-01 01:05:43

我正在处理一个高度不平衡的数据集,所以我使用 SMOTE 对其进行重新采样。

在 SMOTE 重采样之后,我将重采样的数据集拆分为训练/测试集,使用训练集构建模型并使用测试集对其进行评估。

但是,我担心测试集中的某些数据点实际上可能会从训练集中的数据点抖动(即信息从训练集中泄漏到测试集中),因此测试集并不是真正的干净集测试。

有没有人有类似的经历?信息真的会从训练集中泄漏到测试集中吗?还是 SMOTE 真的会处理这个问题,我们不需要担心?

4个回答

当您使用任何采样技术(特别是合成)时,您首先划分数据,然后仅对训练数据应用合成采样。完成训练后,使用测试集(仅包含原始样本)进行评估。

如果您使用您的策略,风险在于训练(测试)集中原始样本和测试(训练)集中的合成样本(基于此原始样本创建)。

根据您的最后一个问题:

然后我想知道这样,我将无法执行n折交叉验证,对吗?因为我的数据太小了(尤其是少数类)

这不是真的。如果您的数据非常小,您可以尝试上采样(但它有多小?)

Bashar Haddad 的方法是首选(拆分数据并应用 SMOTE 仅用于训练),尽管在数据集较小且不平衡的时候,RepeatedStratifiedKFold 会有所帮助

from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold

cv = RepeatedStratifiedKFold(n_splits=5, n_repeats=2, random_state=42)
scores = cross_val_score(model, X, y, scoring='mean_squared_error', cv=cv, n_jobs=-1)
print('Mean MSE: %.4f' % mean(scores))

在这个例子中,有 5 次拆分和两次迭代,总共 10 个模型的总得分。

我已经处理过同样的问题。不,您不能使用生成的样本,尤其是使用 SMOTE 等算法,因为它可能不利于准确度和精确度。

SMOTE 在生成合成示例时不考虑来自其他类的相邻示例。这可能会导致更多的类重叠和噪音。如果你有一个高维数据集,这尤其糟糕。

所以答案是你绝对不应该使用 SMOTE。如果这是你最后的手段,也许你可以在极少数情况下使用另一种方法。