对于二分类任务,keras现有的评价指标只有binary_accuracy,即二分类准确率,但是评估模型的性能有时需要一些其他的评价指标,例如精确率,召回率,F1-score等等,因此需要使用keras提供的自定义评价函数功能构建出针对二分类任务的各类评价指标。
keras提供的自定义评价函数功能需要以如下两个张量作为输入,并返回一个张量作为输出。
y_true:数据集真实值组成的一阶张量。
y_pred:数据集输出值组成的一阶张量。
tf.round()可对张量四舍五入,因此tf.round(y_pred)即是预测值张量。
1-tf.round(y_pred)即是预测值张量取反。
1-y_true即是真实值张量取反。
tf.reduce_sum()可对张量求和。
由此可以根据定义构建出四个基础指标TP、TN、FP、FN,然后进一步构建出进阶指标precision、recall、F1score,最后在编译阶段引用上述自定义评价指标即可。
keras中自定义二分类任务常用评价指标及其引用的代码如下
import tensorflow as tf #精确率评价指标 def metric_precision(y_true,y_pred): TP=tf.reduce_sum(y_true*tf.round(y_pred)) TN=tf.reduce_sum((1-y_true)*(1-tf.round(y_pred))) FP=tf.reduce_sum((1-y_true)*tf.round(y_pred)) FN=tf.reduce_sum(y_true*(1-tf.round(y_pred))) precision=TP/(TP+FP) return precision #召回率评价指标 def metric_recall(y_true,y_pred): TP=tf.reduce_sum(y_true*tf.round(y_pred)) TN=tf.reduce_sum((1-y_true)*(1-tf.round(y_pred))) FP=tf.reduce_sum((1-y_true)*tf.round(y_pred)) FN=tf.reduce_sum(y_true*(1-tf.round(y_pred))) recall=TP/(TP+FN) return recall #F1-score评价指标 def metric_F1score(y_true,y_pred): TP=tf.reduce_sum(y_true*tf.round(y_pred)) TN=tf.reduce_sum((1-y_true)*(1-tf.round(y_pred))) FP=tf.reduce_sum((1-y_true)*tf.round(y_pred)) FN=tf.reduce_sum(y_true*(1-tf.round(y_pred))) precision=TP/(TP+FP) recall=TP/(TP+FN) F1score=2*precision*recall/(precision+recall) return F1score #编译阶段引用自定义评价指标示例 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy', metric_precision, metric_recall, metric_F1score])
补充知识:keras sklearn下两分类/多分类的技术杂谈(交叉验证和评价指标)
一.前言
这篇博客是为了记录论文补充实验中所遇到的问题,以及解决方法,主要以程序的形式呈现。
二.对象
深度学习框架:keras
研究对象:两分类/多分类
三.技术杂谈
1.K-FOLD交叉验证
1.概念
对一个模型进行K次训练,每次训练将整个数据集分为随机的K份,K-1作为训练集,剩余的1份作为验证集,每次训练结束将验证集上的性能指标保存下来,最后对K个结果进行平均得到最终的模型性能指标。
2.优缺点
优点:模型评估更加鲁棒
缺点:训练时间加大
3.代码
① sklearn与keras独立使用
fro<b>本文来源gao@!dai!ma.com搞$$代^@码5网@</b>m sklearn.model_selection import StratifiedKFold import numpy seed = 7 # 随机种子 numpy.random.seed(seed) # 生成固定的随机数 num_k = 5 # 多少折 # 整个数据集(自己定义) X = Y = kfold = StratifiedKFold(n_splits=num_k, shuffle=True, random_state=seed) # 分层K折,保证类别比例一致 cvscores = [] for train, test in kfold.split(X, Y): # 可以用sequential或者function的方式建模(自己定义) model = model.compile() # 自定义 # 模型训练 model.fit(X[train], Y[train], epochs=150, batch_size=10, verbose=0) # 模型测试 scores = model.evaluate(X[test], Y[test], verbose=0) print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) # 打印出验证集准确率 cvscores.append(scores[1] * 100) print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores), numpy.std(cvscores))) # 输出k-fold的模型平均和标准差结果