我的问题涉及到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()),])