我正在尝试使用 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
该警告意味着训练数据中缺少您的某些课程。这是一个常见问题。如果您有 400 个类,那么其中一些类必须很少出现,并且在数据的任何分割中,分割一侧可能会丢失某些类。也可能有一些类根本不会出现在您的数据中。你可以尝试Y.sum(axis=0).all()
如果这是 False,那么有些类即使在 Y 中也不会出现。这听起来很可怕,但实际上,无论如何,你都无法正确预测出现 0、1 或任何非常少量次数的类,因此预测这些结果为 0 可能是您能做的最好的事情。
至于全 0 预测,我会指出,对于 400 个类,所有类发生的时间可能远少于一半。你可以检查一下Y.mean(axis=0).max()
以获得最高的标签频率。如果有 400 个班级,这个比例可能只有百分之几。如果是这样,必须对每个类进行 0-1 预测的二元分类器可能会为所有实例上的所有类选择 0。这并不是真正的错误,这只是因为所有类别的频率都很低。
如果您知道每个实例都有一个正标签(至少一个),您可以获得决策值(clf.decision_function
)并为每个实例选择最高的类别。不过,您必须编写一些代码才能做到这一点。
我曾经在类似的 Kaggle 比赛中获得前十名。这是一个包含约 200 个类别的多标签问题,其中没有一个发生的频率甚至是 10%,我们需要 0-1 预测。在这种情况下,我得到了决策值并取最高的值,加上任何高于阈值的值。我选择了在坚持集上效果最好的阈值。该条目的代码位于 Github 上:Kaggle 希腊媒体代码 https://github.com/davidthaler/Greek_media。你可能会看一下。
如果您已经读到这里,感谢您的阅读。希望有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)