Scikit-Learn:所有训练示例中都存在标签 not x

Scikit-Learn: Label not x is present in all training examples

我正在尝试使用 SVM 进行多标签分类。 我有近 8k 个特征,也有长度接近 400 的 y 向量。我已经有二值化的 Y 向量,所以我没有使用 MultiLabelBinarizer() 但是当我将它与我的 Y 数据的原始形式一起使用时,它仍然给出相同的结果东西。

我是运行这个代码:

X = np.genfromtxt('data_X', delimiter=";")
Y = np.genfromtxt('data_y', delimiter=";")
training_X = X[:2600,:]
training_y = Y[:2600,:]

test_sample = X[2600:2601,:]
test_result = Y[2600:2601,:]

classif = OneVsRestClassifier(SVC(kernel='rbf'))
classif.fit(training_X, training_y)
print(classif.predict(test_sample))
print(test_result)

在涉及到预测部分的所有拟合过程之后,它说 Label not x is present in all training examples(x 是我的 y 向量长度范围内的几个不同数字,即 400)。之后,它给出预测的 y 向量,它始终是长度为 400(y 向量长度)的零向量。 我是 scikit-learn 和机器学习的新手。我无法弄清楚这里的问题。有什么问题,我应该怎么做才能解决它? 谢谢

这里有两个问题:

1) 缺少标签警告
2) 您得到的预测全为 0

该警告意味着训练数据中缺少您的某些 classes。这是一个常见问题。如果您有 400 个 classes,那么其中一些肯定很少出现,并且在数据的任何拆分中,拆分的一侧可能会丢失一些 classes。也可能有 class 根本不会出现在您的数据中。您可以尝试 Y.sum(axis=0).all(),如果它为 False,那么即使在 Y 中也不会出现一些 classes。这一切听起来很可怕,但实际上,您将无法正确预测 classes 无论如何都会出现 0 次、1 次或任何非常小的次数,因此为这些预测 0 可能是你能做的最好的事情。

至于全 0 预测,我要指出的是,对于 400 个 classes,可能所有 classes 出现的次数都不到一半。您可以检查 Y.mean(axis=0).max() 以获得最高的标签频率。 400 classes,可能只有百分之几。如果是这样,必须对每个 class 进行 0-1 预测的二进制 classifier 可能会为所有实例上的所有 class 选择 0。这并不是真正的错误,只是因为所有 class 频率都很低。

如果您知道每个实例都有一个正标签(至少一个),您可以获取决策值 (clf.decision_function) 并为每个实例选择最高的 class。不过,您必须编写一些代码才能做到这一点。

我曾经在与此类似的 Kaggle 比赛中获得前 10 名。这是一个多标签问题,有 ~200 class 个,none 个问题的发生频率甚至为 10%,我们需要 0-1 的预测。在那种情况下,我得到了决策值并取了最高值,加上任何高于阈值的值。我选择了在保留集上效果最好的阈值。该条目的代码位于 Github: Kaggle Greek Media code。你可以看看它。

如果您读到了这里,感谢您的阅读。希望对您有所帮助。