- 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])
- # AUC for a binary classifier
- def auc(y_true, y_pred):
- ptas = tf.stack([binary_PTA(y_true,y_pred,k) for k in np.linspace(0, 1, 1000)],axis=0)
- pfas = tf.stack([binary_PFA(y_true,y_pred,k) for k in np.linspace(0, 1, 1000)],axis=0)
- pfas = tf.concat([tf.ones((1,)) ,pfas],axis=0)
- binSizes = -(pfas[1:]-pfas[:-1])
- s = ptas*binSizes
- return K.sum(s, axis=0)
- #-----------------------------------------------------------------------------------------------------------------------------------------------------
- # PFA, prob false alert for binary classifier
- def binary_PFA(y_true, y_pred, threshold=K.variable(value=0.5)):
- y_pred = K.cast(y_pred>= threshold, 'float32')
- # N = total number of negative labels
- N = K.sum(1 - y_true)
- # FP = total number of false alerts, alerts from the negative class labels
- FP = K.sum(y_pred - y_pred * y_true)
- return FP/N
- #-----------------------------------------------------------------------------------------------------------------------------------------------------
- # P_TA prob true alerts for binary classifier
- def binary_PTA(y_true, y_pred, threshold=K.variable(value=0.5)):
- y_pred = K.cast(y_pred>= threshold, 'float32')
- # P = total number of positive labels
- P = K.sum(y_true)
- # TP = total number of correct alerts, alerts from the positive class labels
- TP = K.sum(y_pred * y_true)
- return TP/P
- # 接着在模型的 compile 中设置 metrics
来源: http://www.bubuko.com/infodetail-3365625.html