keras中自定义验证集的性能评估(ROC,AUC)
来源:互联网 发布:域名访问tomcat项目 编辑:程序博客网 时间:2024/06/17 03:27
在keras中自带的性能评估有准确性以及loss,当需要以auc作为评价验证集的好坏时,就得自己写个评价函数了:
from sklearn.metrics import roc_auc_score
from keras import backend as K
# AUC for a binary classifierdef 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 classifierdef 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 classifierdef 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#如下例子,我用的是RNN做分类from keras.models import Sequentialfrom keras.layers import Dense, Dropoutimport kerasfrom keras.layers import GRUmodel = Sequential()model.add(keras.layers.core.Masking(mask_value=0., input_shape=(max_lenth, max_features))) #masking用于变长序列输入model.add(GRU(units=n_hidden_units,activation='selu',kernel_initializer='orthogonal', recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=regularizers.l2(0.01), recurrent_regularizer=regularizers.l2(0.01), bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.5, recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False)) model.add(Dropout(0.5))model.add(Dense(1, activation='sigmoid'))model.compile(loss='binary_crossentropy', optimizer='adam', metrics=[auc]) #写入自定义评价函数接下来就自己作预测了...
方法二:
from sklearn.metrics import roc_auc_scoreimport kerasclass RocAucMetricCallback(keras.callbacks.Callback): def __init__(self, predict_batch_size=1024, include_on_batch=False): super(RocAucMetricCallback, self).__init__() self.predict_batch_size=predict_batch_size self.include_on_batch=include_on_batch def on_batch_begin(self, batch, logs={}): pass def on_batch_end(self, batch, logs={}): if(self.include_on_batch): logs['roc_auc_val']=float('-inf') if(self.validation_data): logs['roc_auc_val']=roc_auc_score(self.validation_data[1], self.model.predict(self.validation_data[0], batch_size=self.predict_batch_size)) def on_train_begin(self, logs={}): if not ('roc_auc_val' in self.params['metrics']): self.params['metrics'].append('roc_auc_val') def on_train_end(self, logs={}): pass def on_epoch_begin(self, epoch, logs={}): pass def on_epoch_end(self, epoch, logs={}): logs['roc_auc_val']=float('-inf') if(self.validation_data): logs['roc_auc_val']=roc_auc_score(self.validation_data[1], self.model.predict(self.validation_data[0], batch_size=self.predict_batch_size))import numpy as npimport tensorflow as tffrom keras.models import Sequentialfrom keras.layers import Dense, Dropoutfrom keras.layers import GRUimport kerasfrom keras.callbacks import EarlyStoppingfrom sklearn.metrics import roc_auc_scorefrom keras import metricscb = [ my_callbacks.RocAucMetricCallback(), # include it before EarlyStopping! EarlyStopping(monitor='roc_auc_val',patience=300, verbose=2,mode='max')]model = Sequential()model.add(keras.layers.core.Masking(mask_value=0., input_shape=(max_lenth, max_features)))# model.add(Embedding(input_dim=max_features+1, output_dim=64,mask_zero=True))model.add(GRU(units=n_hidden_units,activation='selu',kernel_initializer='orthogonal', recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=regularizers.l2(0.01), recurrent_regularizer=regularizers.l2(0.01), bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.5, recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False)) #input_shape=(max_lenth, max_features),model.add(Dropout(0.5))model.add(Dense(1, activation='sigmoid'))model.compile(loss='binary_crossentropy', optimizer='adam', metrics=[auc]) #这里就可以写其他评估标准model.fit(x_train, y_train, batch_size=train_batch_size, epochs=training_iters, verbose=2, callbacks=cb,validation_split=0.2, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0)
亲测有效
阅读全文
1 0
- keras中自定义验证集的性能评估(ROC,AUC)
- scikit-learn中评估分类器性能的度量,像混淆矩阵、ROC、AUC等
- 分类之性能评估指标ROC&AUC
- 【scikit-learn】评估分类器性能的度量,像混淆矩阵、ROC、AUC等
- 机器学习性能评估指标(精确率、召回率、ROC、AUC)
- 分类器性能评估之ROC和AUC(2)
- 模型评估的方法: ROC,AUC,RMSE等指标
- 性能指标(模型评估)之ROC与AUC
- 分类模型的性能评估——以SAS Logistic回归为例(2): ROC和AUC
- 分类模型的性能评估——以SAS Logistic回归为例(2): ROC和AUC
- 分类模型的性能评估——以SAS Logistic回归为例(2): ROC和AUC
- 分类模型的性能评估——以SAS Logistic回归为例(2): ROC和AUC
- CTR评估标准及ROC与AUC
- 一种解决keras的earlystopping的自定义metric麻烦(比如auc)的方法
- ROC和AUC在python中metrics上的实现
- 模型评估与选择(中篇)-ROC曲线与AUC曲线
- ROC与AUC的计算
- ROC AUC的原理详解
- oracle 关于nls_language,NLS_CHARACTERSET,数据库的字符级别
- samba案例
- Angular 批量删除
- C# SqlBulkCopy批量向数据库添加数据
- FS Shell
- keras中自定义验证集的性能评估(ROC,AUC)
- 网络编程2
- 2.列表
- CSS上划线、下划线、删除线等方法
- 设计模式之单例模式
- 我的第一篇博客
- JAVA 生成随机密码工具
- 前端html第三方登录集合,微信,微博,QQ
- Android学习笔记之Android应用核心Intent