Keras - Precision 和 Recall 大于 1(多分类)
Posted
技术标签:
【中文标题】Keras - Precision 和 Recall 大于 1(多分类)【英文标题】:Keras - Precision and Recall is greater than 1 (Multi classification) 【发布时间】:2018-08-07 17:34:21 【问题描述】:我正在使用 keras 中的 CNN 解决多分类问题。我的准确率和召回率总是超过 1,这根本没有任何意义。下面附上我的代码,我做错了什么?
def recall(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
recall = true_positives / (possible_positives + K.epsilon())
return recall
def precision(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
precision = true_positives / (predicted_positives + K.epsilon())
return precision
model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy',recall,precision])
【问题讨论】:
在多类设置中,你如何计算真阳性和可能阳性。您是否明智地按标签执行此操作? 嗨 Vivek,感谢您回来。精确度和召回率分数被计算为批量平均。我刚刚注意到的另一件事是,我没有一次性对我的 10 个标签进行编码。我只是使用了 0-9 的数值。这也可能是问题吗? 【参考方案1】:我能够弄清楚这一点。一旦您对所有分类标签进行一次性编码,上述代码就可以完美运行。此外,请确保您没有将 sparse_categorical_crossentropy 作为损失函数,而只需使用 categorical_crossentropy。
如果您希望在 Keras 中将分类值转换为 one-hot 编码值,您可以使用以下代码:
from keras.utils import to_categorical
y_train = to_categorical(y_train)
您必须执行上述操作的原因在 Keras 文档中有所说明:
"当使用 categorical_crossentropy 损失时,你的目标应该是分类格式(例如,如果你有 10 个类,每个样本的目标应该是一个全零的 10 维向量,除了对应索引处的 1到样本的类)。为了将整数目标转换为分类目标,您可以使用 Keras 实用程序 to_categorical"
【讨论】:
以上是关于Keras - Precision 和 Recall 大于 1(多分类)的主要内容,如果未能解决你的问题,请参考以下文章
Precision-Recall曲线或ROC曲线是不是可能是一条水平线?
绘制阈值(precision_recall 曲线)matplotlib/sklearn.metrics