我正在为 11 个标签设计一个多类分类器。我SMOTE
用来解决抽样问题。但是我面临以下错误:-
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
仅适用于。 - 此处和此处提供的建议也未成功。老实说,我无法理解他们。
- 当我将数据集减少到 100k、1k 和 5k 行时,收到了同样的错误。
尽管尝试了,但我对它的了解并不多。我是采样的新手。你能帮我解决这个问题吗?