我在使用sklearn.utils resample时有些困惑。
使用不平衡的数据集,我试图对多数类进行随机下采样。一切运行正常,但是当我刚刚意识到使用(replace = True)的模型的性能确实得到了显着改善时。
这里的性能提高背后的原因是什么?样品是否被复制的样品代替?这里有没有过度拟合的地方?
我对此有些陌生,因此,非常感谢您在此进行任何澄清。
这是代码的一部分,它对整体进行了重大更改。
from sklearn.utils import resample
Negative = sms[sms.Label == 'Neg']
Positive = sms[sms.Label == 'Pos']
# Upsample minority class
df_Negative_res = resample(Negative , replace=True, # sample with replacement
n_samples=243 , # to match majority class
random_state=seed ) # reproducible results
df_Positive_res = resample(Positive , replace=True, # sample with replacement
n_samples=243 , # to match majority class
random_state=seed) # reproducible results
# Combine majority class with upsampled minority class
sms = pd.concat([df_Negative_res, df_Positive_res])
print(sms)
答案 0 :(得分:1)
通过执行过度/欠采样操作,实际上可以更改不平衡数据集的分布,并尝试提高模型的性能。因此,它实际上可以被视为一种增强方法。已经有关于使用替换重新采样的讨论,所以我建议您看一下: https://stats.stackexchange.com/questions/171440/bootstrap-methodology-why-resample-with-replacement-instead-of-random-subsamp 为了找出您的模型是否过度拟合,您需要一个大型测试集(没有任何过度采样等),并且该测试集必须与训练集不同。如果您的模型表现良好,则过拟合的机会会降低。但是,在进行过采样/欠采样时,仍会影响数据的偏差。 因此,关键是要确定您的模型是否可以很好地概括未见样本。在训练集上,它应该表现得非常好(一般情况下)。 进行交叉验证时,您还需要考虑一些非常重要的问题-您是在每个折叠中还是在整个数据集上应用采样?这是关于该主题https://www.researchgate.net/post/should_oversampling_be_done_before_or_within_cross-validation的讨论 希望我的回答对您有帮助!
答案 1 :(得分:1)
除了上一个答案,我建议使用流水线并从不平衡学习中重新采样:https://imbalanced-learn.org/stable/auto_examples/under-sampling/plot_comparison_under_sampling.html#prototype-selection-under-sampling-by-selecting-existing-samples
通过对训练数据集而不是测试数据集进行采样,可以简化评估。