0

我有一个高度不平衡的二进制(是/否)分类数据集。该数据集目前有大约 0.008% 的“是”。

我需要使用 SMOTE 平衡数据集。

我遇到了两种处理不平衡的方法。在变量上运行 MinMaxScaler 后的以下步骤

from imblearn.pipeline import Pipeline
oversample = SMOTE(sampling_strategy = 0.1, random_state=42)
undersample = RandomUnderSampler(sampling_strategy=0.5, random_state=42)
steps = [('o', oversample), ('u', undersample)]
pipeline = Pipeline(steps=steps)
x_scaled_s, y_s = pipeline.fit_resample(X_scaled, y)

这导致数据集的大小从 240 万行减少到 732000 行,并且不平衡从 0.008% 提高到 33.33%

虽然这种方法

sm = SMOTE(random_state=42)
X_sm , y_sm = sm.fit_sample(X_scaled, y)

这将行数从 240 万行增加到 480 万行,现在不平衡为 50%。

在这些步骤之后,我需要将数据拆分为训练测试数据集......

这里的正确方法是什么?

在选择这些方法之前,我需要考虑哪些因素?

我应该对非采样数据运行 X_test, y_test。这意味着,我拆分数据并仅对训练数据进行上采样/欠采样。

谢谢你。

京东

4

1 回答 1

1

在这些步骤之后,我需要将数据拆分为训练测试数据集......

不!任何重采样技术都应该只应用于训练集。这将确保测试集反映现实。在这样的测试集上获得的模型性能将很好地估计您的模型的泛化能力。如果对整个数据集执行重采样,您的模型的性能将过于乐观。

脚步:

  1. 将数据集拆分为训练集和测试集。
  2. 仅对训练集进行上采样/欠采样。
  3. 在重新采样的训练集上训练您的模型。
  4. 估计未触及的测试集的性能。
于 2020-05-29T07:42:41.930 回答