如何在Keras中实现Sklearn Metric作为度量?

时间:2018-02-01 16:05:36

标签: python machine-learning scikit-learn keras

尝试谷歌搜索,但无法找到如何在keras中实现像科恩卡帕,roc,f1score这样的Sklearn指标作为不平衡数据的指标。

如何在Keras中将Sklearn Metric实现为度量标准?

2 个答案:

答案 0 :(得分:5)

Keras和Sklearn中的指标意味着不同的东西。

在Keras中,指标几乎与损失相同。它们在每个批次结束时的训练期间被调用,并且每个时期用于报告和记录目的。使用示例是有损失' mse'但你仍然希望看到' mae'。在这种情况下,您可以添加' mae'作为模型的指标。

在Sklearn中,度量函数根据定义应用于预测"度量模块实现了为特定目的评估预测误差的功能"。虽然存在重叠,但Sklearn的统计函数并不适合Keras中度量的定义。 Sklearn指标可以返回两个维度大于1的浮点数组,数组,二维数组。预测方法在Keras中没有这样的对象。

回答你的问题:
这取决于您想要触发的位置:

  1. 每批或每个纪元的结束
    您可以编写在批处理结束时触发的自定义回调。
  2. 预测后 这似乎更容易。让Keras预测整个数据集,捕获结果,然后将y_true和y_pred数组提供给相应的Sklearn指标。

答案 1 :(得分:-1)

生活所需的一切都在混乱的矩阵中。计算混淆矩阵并遵循我的公式:

enter image description here

实际上,这是通过以下方式完成的:

from sklearn.metrics import confusion_matrix

NBC = NBC.fit(X_train,y_train)
cm = confusion_matrix(y_test, NBC.predict(X_test))
tn, fp, fn, tp = cm.ravel()
print('tn: ',tn)
print('fp: ',fp)
print('fn: ',fn)
print('tp: ',tp)
print('------------------')
print(cm) 

现在:

p_0 = (tn+??)/(tn+fp+fn+??)
print('p_0:',p_0)

P_class0 = ((tn+fp)/(tn+fp+fn+??))*((tn+fn)/(tn+fp+fn+??))
print('P_yes: ',P_yes)

P_class1 = ((fn+??)/(tn+fp+fn+??))*((fp+??)/(tn+fp+fn+??))
print('P_no: ',P_no)


pe = P_yes + P_no
print('pe: ',pe)

κ = (p_0-pe)/(1-pe)
print('κ: ',κ)