如何在 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 管道缩放 Keras 自动编码器模型的目标值?