我应该在平衡数据集之前还是之后缩放数据?

数据挖掘 scikit-学习 阶级失衡
2022-03-03 10:23:19

我有 3 个数据集,每个数据集分为 3 个单独的类 [买入/持有/卖出]。我将每个数据集中每个类的频率随机上采样到每个 10,000 个数据点。

我的问题是,我应该在进行随机上采样之前还是之后扩展训练集?它是否以某种方式扭曲了最终的训练集?

我已经为我提供了一个平衡每个数据集的函数,请注意,此时数据已经被缩放。

def balance_dataset(df): 
    training_set = df[:round(len(df.values) * TRAINING_LENGTH)]

    label_frequencies = training_set['Label'].value_counts(sort = True, ascending = True)

    highest_occurence = resample(training_set[training_set['Label'] == label_frequencies.index[2]], n_samples = 10000, random_state = 0, replace = True)
    middle_occurence = resample(training_set[training_set['Label'] == label_frequencies.index[1]], n_samples = 10000, random_state = 0, replace = True)
    lowest_occurrence = resample(training_set[training_set['Label'] == label_frequencies.index[0]], n_samples = 10000, random_state = 0, replace = True)

    balanced_training_set = pd.concat([highest_occurence, middle_occurence, lowest_occurrence])


    return balanced_training_set[['MACD', 'MFI', 'ROC', 'RSI', 'Ultimate Oscillator', 'Williams %R', 'Awesome Oscillator', 'KAMA', 
            'Stochastic Oscillator', 'TSI', 'Volume Accumulator', 'ADI', 'CMF', 'EoM', 'FI', 'VPT','ADX', 'ADX Negative', 'ADX Positive', 
            'EMA', 'CRA']],  balanced_training_set['Label']

2个回答

我的两分钱:思考这个过程的一般方法是从学习和转变的角度来考虑。缩放(标准化)是一种转换,适用于训练和测试/验证/生产集中的每个样本。这些转换是使用使用训练集学习的参数完成的。上/下采样的目的是获得一个训练集,您可以在其中更好地学习转换的参数 - 上/下采样本身并不是一种转换。因此,您通常首先对训练集进行上/下采样,然后应用任何缩放。在实践中,正如评论和@Angadishop 的响应中所述,上/下采样可能不会改变您为缩放而学习的参数,因此在之前或之后执行此操作可能会给您相同的结果(但这取决于实际缩放功能)。

一般来说,缩放取决于数据集中的最小值和最大值,上采样、下采样甚至 smote 都无法更改这些值。因此,如果您在最终数据集中包含所有记录,那么您可以随时执行此操作,但如果您未包含所有原始记录,则您应该在上采样之前执行此操作。