假设我有3个类别,每个样本都可以属于这些类别中的任何一个。标签看起来像这样。
[
[1 0 0]
[0 1 0]
[0 0 1]
[1 1 0]
[1 0 1]
[0 1 1]
[1 1 1]
]
我将输出设置为Dense(3,activation =“ sigmoid”),并使用optimizer =“ adam”,loss =“ binary_crossentropy”进行编译。 根据Keras的输出,我认为损失为0.05,准确性为0.98。
我认为如果我使用Sigmoid和binary_crossentropy,则预测值将仅为1或0。但是,model.predict(training-features)给我的值在1到0之间,如0.0026。我已经尝试使用sigmoid和softmax在categorical_crossentropy和binary_crossentropy之间进行所有4种组合。 Model.predict始终返回0到1之间的值,形状为n_samples个,n_classes个。在上面的示例中为7x3。
然后我像下面一样将值裁剪为0.5,并检查了precision_score(training_labels,preds)。分数降至0.1。
preds[preds>=0.5] = 1
preds[preds<0.5] = 0
如果有人能给我一些有关如何解决此问题的指导,我将不胜感激。
谢谢!
答案 0 :(得分:0)
根据您的描述,这是一个多标签分类问题,因此您应该使用sigmoid
作为最后一层的激活函数,并使用binary_crossentropy
作为损失函数。这是因为我们认为每个标签的分类都独立于所有其他标签。因此,在这种情况下,使用softmax
或categorical_crossentropy
是错误的。
Keras报告的准确性与使用sklearn.metrics.accuracy_score()
函数计算的准确性之间的差异不是由于四舍五入;实际上Keras会进行与计算精度相同的舍入(或修剪)操作。相反,差异是由于以下事实:在多标签分类模式下的accuracy_score
函数仅在该样品的所有真实标签和预测标签相互匹配时才认为该样品已正确分类。 documentation中已明确指出:
在多标签分类中,此函数计算子集准确性:为样本预测的标签集必须完全与y_true中的相应标签集匹配。
但是,在Keras中,binary_accuracy
函数报告正确分类的标签的平均分数(即可以接受部分匹配)。为了更好地理解这一点,请考虑以下示例:
True labels | Predictions | Keras binary acc | accuracy_score
-----------------------------------------------------------------
[1 0 0] | [1 0 1] | 2 correct = 0.66 | not match = 0.00
[0 1 1] | [0 1 1] | 3 correct = 1.00 | match = 1.00
[1 0 1] | [0 0 1] | 2 correct = 0.66 | not match = 0.00
=================================================================
average reported acc | 0.77 | 0.33