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

我的问题涉及到SMOTE类引发的数值错误。

预期 n_neighbors <= n_samples,但 n_samples = 1, n_neighbors = 6

# imbalanced learn 是一个包含SMOTE实现的包from imblearn.over_sampling import SMOTE, ADASYN, RandomOverSamplerfrom imblearn.pipeline import Pipeline# 标签列(除了第一列之外的所有列)y = feature_set.iloc[:,0]# 特征矩阵:除了文本和标签列之外的所有列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个)被极度欠采样了。

根据这个帖子提出的解决方案

创建一个管道,使用SMOTE和RandomOversampler的方式满足smoted类别的条件 n_neighbors <= n_samples,并且在条件不满足时使用随机过采样。

然而,我仍然在努力设置并运行我的实验。

# 初始化过采样器smote = SMOTE()randomSampler = RandomOverSampler()# 创建管道pipeline = Pipeline([('smote', smote), ('randomSampler', randomSampler)])pipeline.fit_resample(x, y)

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

提前感谢您。


回答:

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

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

对我来说这样有效:

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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注