【tensorflow2.0】评价指标metrics
损失函数除了作为模型训练时候的优化目标,也能够作为模型好坏的一种评价指标。但通常人们还会从其它角度评估模型的好坏。 这就是评估指标。通常损失函数都可以作为评估指标,如MAE,MSE,CategoricalCrossentropy等也是常用的评估指标。 但评估指标不一定可以作为损失函数,例如AUC,Accuracy,Precision。因为评估指标不要求连续可导,而损失函数通常要求连续可导。 编译模型时,可以通过列表形式指定多个评估指标。 如果有需要,也可以自定义评估指标。 自定义评估指标需要接收两个张量y_true,y_pred作为输入参数,并输出一个标量作为评估值。 也可以对tf.keras.metrics.Metric进行子类化,重写初始化方法,update_state方法,result方法实现评估指标的计算逻辑,从而得到评估指标的类的实现形式。 由于训练的过程通常是分批次训练的,而评估指标要跑完一个epoch才能够得到整体的指标结果。因此,类形式的评估指标更为常见。即需要编写初始化方法以创建与计算指标结果相关的一些中间变量,编写update_state方法在每个batch后更新相关中间变量的状态,编写result方法输出最终指标结果。 如果编写函数形式的评估指标,则只能取epoch中各个batch计算的评估指标结果的平均值作为整个epoch上的评估指标结果,这个结果通常会偏离拿整个epoch数据一次计算的结果。 一,常用的内置评估指标
二, 自定义评估指标我们以金融风控领域常用的KS指标为例,示范自定义评估指标。 KS指标适合二分类问题,其计算方式为 KS=max(TPR-FPR). 其中TPR=TP/(TP+FN),FPR = FP/(FP+TN) TPR曲线实际上就是正样本的累积分布曲线(CDF),FPR曲线实际上就是负样本的累积分布曲线(CDF)。 KS指标就是正样本和负样本累积分布曲线差值的最大值。 import numpy as np import pandas as pd tensorflow as tf from tensorflow.keras layers,models,losses,metrics # 函数形式的自定义评估指标 @tf.function def ks(y_true,y_pred): y_true = tf.reshape(y_true,(-1,)) y_pred = tf.reshape(y_pred,)) length = tf.shape(y_true)[0] t = tf.math.top_k(y_pred,k = length,sorted = False) y_pred_sorted = tf.gather(y_pred,t.indices) y_true_sorted = tf.gather(y_true,t.indices) cum_positive_ratio = tf.truediv( tf.cumsum(y_true_sorted),tf.reduce_sum(y_true_sorted)) cum_negative_ratio = tf.truediv( tf.cumsum(1 - y_true_sorted),tf.reduce_sum(1 - y_true_sorted)) ks_value = tf.reduce_max(tf.abs(cum_positive_ratio - cum_negative_ratio)) return ks_value y_true = tf.constant([[1],[1],[0],[1],[0]]) y_pred = tf.constant([[0.6],[0.1],[0.4],[0.5],[0.7],[0.7]]) tf.print(ks(y_true,y_pred)) 0.625 类形式的自定义评估指标 class KS(metrics.Metric): def __init__(self,name = "ks",**kwargs): super(KS,self).__init__(name=name,1)">kwargs) self.true_positives = self.add_weight( name = tpzeros") self.false_positives =fp) @tf.function update_state(self,y_true,y_pred): y_true = tf.cast(tf.reshape(y_true,)),tf.bool) y_pred = tf.cast(100*tf.reshape(y_pred,tf.int32) for i in tf.range(0,tf.shape(y_true)[0]): if y_true[i]: self.true_positives[y_pred[i]].assign( self.true_positives[y_pred[i]]+1.0) else: self.false_positives[y_pred[i]].assign( self.false_positives[y_pred[i]]+1.0) (self.true_positives,self.false_positives) @tf.function result(self): cum_positive_ratio = tf.truediv( tf.cumsum(self.true_positives),tf.reduce_sum(self.true_positives)) cum_negative_ratio = tf.truediv( tf.cumsum(self.false_positives),tf.reduce_sum(self.false_positives)) ks_value = tf.reduce_max(tf.abs(cum_positive_ratio - cum_negative_ratio)) ks_value y_true = tf.constant([[1],[0.7],1)">]]) myks = KS() myks.update_state(y_true,y_pred) tf.print(myks.result()) 0.625 ? 参考: 开源电子书地址:https://lyhue1991.github.io/eat_tensorflow2_in_30_days/ GitHub 项目地址:https://github.com/lyhue1991/eat_tensorflow2_in_30_days (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |