如何在 Keras 中将 Sklearn Metric 实现为 Metric?

Posted

技术标签:

【中文标题】如何在 Keras 中将 Sklearn Metric 实现为 Metric?【英文标题】:How to implement Sklearn Metric in Keras as Metric? 【发布时间】:2018-07-12 00:42:49 【问题描述】:

尝试用谷歌搜索,但找不到如何在 keras 中实现 Sklearn 指标,如 cohen kappa、roc、f1score 作为不平衡数据的指标。

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

【问题讨论】:

您能否在 sklearn 函数上编写一个包装器,该函数接受文档所述的 y_true 和 y_pred? keras.io/metrics --> 检查页面底部的“自定义指标” 试过了,但是 sklearn 需要 numpy 数组,而 keras 有张量。 【参考方案1】:

Keras 和 Sklearn 中的指标含义不同。

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

在 Sklearn 中,度量函数根据定义“度量模块实现评估特定目的的预测误差的函数”应用于预测。虽然存在重叠,但 Sklearn 的统计功能不符合 Keras 中的指标定义。 Sklearn metrics可以返回float、array、二维数组,维度都大于1。通过predict方法,Keras中没有这样的对象。

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

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

【讨论】:

我要求每批结束。会试试你的方法。如果有链接请分享。谢谢【参考方案2】:

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

在实践中,这样做如下:

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('κ: ',κ)

【讨论】:

这不是问题的答案。

以上是关于如何在 Keras 中将 Sklearn Metric 实现为 Metric?的主要内容,如果未能解决你的问题,请参考以下文章

二元分类 predict() 方法:sklearn vs keras

如何在 sklearn 的 AdaBoost 中使用 Keras 模型?

“余弦”度量在 sklearn 聚类算法中如何工作?

如何使用 sklearn 管道缩放 Keras 自动编码器模型的目标值?

sklearn 管道 + keras 顺序模型 - 如何获取历史记录?

使用 sklearn 使用 Keras 数据生成器绘制混淆矩阵