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。你可以看看它。
如果您读到了这里,感谢您的阅读。希望对您有所帮助。
我正在尝试使用 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。你可以看看它。
如果您读到了这里,感谢您的阅读。希望对您有所帮助。