Python 过采样在管道中组合了多个采样器

Posted

技术标签:

【中文标题】Python 过采样在管道中组合了多个采样器【英文标题】:Python oversampling combine several samplers in a pipeline 【发布时间】:2019-09-25 08:33:35 【问题描述】:

我的问题与 SMOTE 类引发的值错误有关。

预期的 n_neighbors

# imbalanced learn is a package containing impelementation of SMOTE
from imblearn.over_sampling import SMOTE, ADASYN, RandomOverSampler
from imblearn.pipeline import Pipeline
# label column (everythin except the first column)
y = feature_set.iloc[:,0]
# feature matrix: everything except text and label columns
x = feature_set.loc[:, feature_set.columns != 'text_column']
x = x.loc[:, x.columns != 'label_column']
x_resampled, y_resampled = SMOTE().fit_resample(x, y)

经过一番调查,我发现我的一些班级(总共 158 个班级)的样本极少。

根据这个post提出的解决方案

创建一个使用 SMOTE 和 RandomOversampler 的管道 满足条件 n_neighbors

但是,我仍在努力设置和运行我的实验。

# initilize oversamplers
smote = SMOTE()
randomSampler = RandomOverSampler()
# create a pipeline
pipeline = Pipeline([('smote', smote), ('randomSampler', randomSampler)])
pipeline.fit_resample(x, y)

当我运行它时,我仍然有同样的错误。我的猜测是,生成的管道应用了两个采样器,而我只需要一次应用其中一个,基于预定义的条件(如果项目数小于 X,则为 RandomSampler,否则为 SMOTE)。 有没有办法在项目数量极少的情况下设置调用 RandomSampler 的条件?

提前谢谢你。

【问题讨论】:

请编辑澄清;目前尚不清楚您的问题是什么确切,是否确实与您在开始时提到的错误有关(它到底在哪里弹出?),或者您所说的“挣扎”到底是什么意思跨度> 我试图澄清这个问题。这似乎更清楚了吗?实际上问题是关于在管道中设置自定义条件。 【参考方案1】:

我也遇到了和你一样的问题 (Expected n_neighbors <= n_samples, but n_samples = 1, n_neighbors = 6) 并像你一样阅读并遵循了那个人的建议。

我认为您遇到了同样的错误,因为您将随机过采样器放在 SMOTE 操作之后。也就是说,您需要在应用 SMOTE 算法之前对少数类进行过采样。

这对我有用:

pipe = Pipeline([
('tfidf', TfidfVectorizer()), 
('ros', RandomOverSampler()),
('oversampler', SMOTE()),
('clf', LinearSVC()),
])

【讨论】:

以上是关于Python 过采样在管道中组合了多个采样器的主要内容,如果未能解决你的问题,请参考以下文章

如何在管道中重新采样文本(不平衡组)?

boosting和bootstrap区别

Vulkan:一个管道和多个描述符集?

如何在jmeter tcp采样器中发送多个十六进制数据有效负载?

如何针对多个请求顺序运行jmeter采样器

如何将多个立方体纹理传递到一个统一的采样器数组中?