Python Scikit学习:所有培训示例中都有标签not x

Python Scikit学习:所有培训示例中都有标签not x,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我正在尝试用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[

我正在尝试用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)
在所有的拟合过程之后,当涉及到预测部分时,它说
标签不是x出现在所有的训练示例中
(x是y向量长度范围内的几个不同的数字,即400)。然后,它给出了预测的y向量,该向量总是长度为400(y向量长度)的零向量。 我是scikit学习和机器学习的新手。我想不出这里的问题。问题出在哪里?我该怎么解决?
谢谢。

这里有两个问题:

1) 缺少标签警告
2) 你的预测结果都是0

该警告表示培训数据中缺少某些课程。这是一个常见的问题。如果您有400个类,那么其中一些类必须很少出现,并且在数据的任何分割上,分割的一侧可能缺少一些类。也可能有一些类根本不在数据中出现。您可以尝试
Y.sum(axis=0).all()
,如果这是错误的,那么有些类甚至在Y中也不会出现。这听起来很可怕,但实际上,您无法正确预测出现0、1或任何非常小次数的类,因此预测这些类的0可能是您所能做的最好的事情

至于all-0预测,我将指出,有400个类,可能所有类的出现时间都远远少于一半。您可以检查
Y.mean(axis=0).max()
以获得最高的标签频率。有400个班级,可能只有几个百分点。如果是这样,必须对每个类进行0-1预测的二进制分类器可能会为所有实例上的所有类选择0。这并不是一个真正的错误,只是因为所有的类频率都很低

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

我曾经在一次类似于这样的卡格尔比赛中获得了前10名的成绩。这是一个多标签问题,大约有200个类,其中没有一个发生的频率甚至为10%,我们需要0-1的预测。在这种情况下,我得到了决策值,并选择了最高值,加上任何高于阈值的值。我选择了一个在抵制中效果最好的阈值。该条目的代码位于Github:。你可以看看


如果你能做到这一点,谢谢你的阅读。希望这能有所帮助。

嗨,谢谢你的回答,里面有很多有用的东西。我尝试了
Y.sum(axis=0).all()
,结果返回True。另外,我尝试了
Y.mean(axis=0).max()
,它返回了
0.315981070258
。我是否仍应实现
clf.decision\u函数
?您能否更具体地说明它,如何实施等等?很抱歉,我对这些东西很陌生,所以我不知道如何使用
决策函数
。我的意思是,如果你得到的都是零预测,并且你知道其中应该有一些1,你可以尝试获得决策值,然后在高于某个阈值时预测1。您预测的标签将是:
(决策值>阈值)。astype(浮点)
。阈值将小于0,因为0是分类器正在使用的阈值,并且它没有得到任何肯定。或者,如果您知道每个实例至少有一个阳性标签,您可以选择具有最高DV的标签(它仍然是阴性的)。谢谢!你在GitHub上提供的直觉和代码确实有帮助。@Dthal为什么要使用决策函数而不是预测概率?我认为,通过选择与概率最高的类对应的标签,预测概率会给我们带来更好的准确性。@sandyp-在sklearn docs()中,它说使用普拉特缩放来获得概率。正如上面提到的那样,这是一个混乱的局面。文件还说:“如果需要信心分数,但这些分数不一定是概率,那么建议将概率设置为False,并使用决策函数而不是预测概率。”。通常,decision_函数和predict_proba是单调相关的,因此,如果您需要最佳标签的预测,您可以使用其中一个。