Scikit-Learn:标签不是 x 出现在所有训练示例中
Posted
技术标签:
【中文标题】Scikit-Learn:标签不是 x 出现在所有训练示例中【英文标题】:Scikit-Learn: Label not x is present in all training examples 【发布时间】:2016-04-06 07:38:53 【问题描述】:我正在尝试使用 SVM 进行多标签分类。
我有近 8k 个特征,并且 y 向量的长度也接近 400。我已经有二值化的 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】:这里有两个问题:
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 比赛中获得前 10 名。这是一个多标签问题,有大约 200 个类别,其中没有一个发生频率为 10%,我们需要 0-1 预测。在那种情况下,我得到了决策值并取了最高的值,加上任何高于阈值的值。我选择了在坚持集上效果最好的阈值。该条目的代码在 Github 上:Kaggle Greek Media code。你可以看看它。
如果您做到了这一点,感谢您的阅读。希望对您有所帮助。
【讨论】:
嗨,感谢您提供了很多有用的东西的答案。我试过Y.sum(axis=0).all()
,它返回True。另外,我尝试了Y.mean(axis=0).max()
,它返回了0.315981070258
。我还应该实现clf.decision_function
吗?您能否更具体地了解它,如何实施等?对不起,我对这些东西很陌生,所以我不明白如何处理 decision_function
。
我的意思是,如果您得到所有零预测,并且您知道其中应该有一些 1,您可以尝试获取决策值,并在超过某个阈值时预测 1 .您的预测标签将是:(decision_value > threshold).astype(float)
。阈值将小于 0,因为 0 是分类器正在使用的阈值并且它没有得到任何肯定。或者,如果您知道每个实例至少有一个正标签,则可以选择具有最高 DV 的标签(它仍然是负标签)。
谢谢!你在 GitHub 上提供的直觉和代码真的很有帮助。
@Dthal 为什么使用决策函数而不是预测概率?我认为通过选择与概率最高的类相对应的标签,预测概率会给我们带来更好的准确性。
@sandyp- 在 sklearn 文档 (scikit-learn.org/stable/modules/…) 中,它说 Platt 缩放用于获取概率。如那里所述,这是一个杂物。文档还说:“如果需要置信度分数,但这些不一定是概率,那么建议设置probability=False 并使用decision_function 而不是predict_proba。”。通常decision_function 和predict_proba 是单调相关的,所以如果你需要预测最好的标签,你可以使用任何一个。以上是关于Scikit-Learn:标签不是 x 出现在所有训练示例中的主要内容,如果未能解决你的问题,请参考以下文章
GridSearch用于Scikit-learn中的多标签分类
scikit-learn决策树回归:检索叶子的所有样本(不是平均值)