我正在为11个标签设计一个多类分类器。我正在使用SMOTE
来解决抽样问题。但是我遇到以下错误:-
from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=42)
X_res, Y_res = sm.fit_sample(X_f, Y_f)
~/.local/lib/python3.6/site-packages/sklearn/neighbors/base.py in kneighbors(self, X, n_neighbors, return_distance)
414 "Expected n_neighbors <= n_samples, "
415 " but n_samples = %d, n_neighbors = %d" %
--> 416 (train_size, n_neighbors)
417 )
418 n_samples, _ = X.shape
ValueError: Expected n_neighbors <= n_samples, but n_samples = 1, n_neighbors = 6
为什么说我只有1个n_samples?
当我为100k行(只有4个标签)的较小数据集尝试相同的代码时,它运行得很好。
X_f
array([[1.43347000e+05, 1.00000000e+00, 2.03869492e+03, ...,
1.00000000e+00, 1.00000000e+00, 1.35233019e+03],
[5.09050000e+04, 0.00000000e+00, 0.00000000e+00, ...,
5.09050000e+04, 0.00000000e+00, 5.09050000e+04],
[1.43899000e+05, 2.00000000e+00, 2.11447368e+03, ...,
1.00000000e+00, 2.00000000e+00, 1.39707767e+03],
...,
[8.50000000e+01, 0.00000000e+00, 0.00000000e+00, ...,
8.50000000e+01, 0.00000000e+00, 8.50000000e+01],
[2.33000000e+02, 4.00000000e+00, 4.90000000e+01, ...,
4.00000000e+00, 4.00000000e+00, 7.76666667e+01],
[0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00]])
Y_f
array([[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.],
...,
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 1.]])
print(X_f.shape, Y_f.shape)
(2087620, 31) (2087620, 11)
imblearn
软件包的其他技术调试SMOTE fit_resample()方法我知道SMOTE通过使用少数群体数据点的最近邻居之间的欧几里德距离合成少数群体样本来工作。因此,我在../python3.6/site-packages/sklearn/neighbors/base.py文件中打印了n_samples变量。它显示从5236-> 103-> 3稳定减少的样本,然后我得到了错误。我不明白发生了什么。
SVMSMOTE
:-计算时间太长(超过2天),并且PC崩溃了。RandomOverSampler
:-模型的准确度很差,为45%sampling_strategy
:-仅适用于minority
。尽管尝试,但我不太了解。我是新手。您能帮我解决这个问题吗?
答案 0 :(得分:0)
我今天有一个类似的问题。当我增加数据集的行数时,此问题已解决。 当我更改为n_rows = 5000时,我首先尝试使用n_rows = 1000的子样本,但不再收到错误。
由于数据集的输入大小非常大,因此在应用imblearn之前减小数据集的大小可能会很有用。实际上,您将在网络上找到一些实验,这些实验表明存在一个数据集长度阈值,而分类器并不能显着改善其性能。 Here这些实验之一。
答案 1 :(得分:0)
之所以发生此错误,是因为数据集中的某些实例太少了。例如,在一个2M强数据集中,只有一个实例带有特定标签“���''。
因此,在这种情况下,没有用于SMOTE算法的样本可用于合成副本。仔细检查您的数据集,并确保它是干净且可用的。
使用df.where("Label != '���'")