Keras计算F1_score

实现代码:

from keras.callbacks import Callback
from sklearn.metrics import confusion_matrix, f1_score, precision_score, recall_score

class Metrics(Callback):
    def on_train_begin(self, logs={}):
        self.val_f1s = []
        self.val_recalls = []
        self.val_precisions = []

    def on_epoch_end(self, epoch, logs={}):
        val_predict = (np.asarray(self.model.predict(self.validation_data[0]))).round()##.model
        val_targ = self.validation_data[1]###.model
        _val_f1 = f1_score(val_targ, val_predict,average='micro')
        _val_recall = recall_score(val_targ, val_predict,average=None)###
        _val_precision = precision_score(val_targ, val_predict,average=None)###
        self.val_f1s.append(_val_f1)
        self.val_recalls.append(_val_recall)
        self.val_precisions.append(_val_precision)
        #print("— val_f1: %f — val_precision: %f — val_recall: %f" %(_val_f1, _val_precision, _val_recall))
        print("— val_f1: %f "%_val_f1)
        return

f1=Metrics()
hist=cnn_net.fit(x_train,y_train,batch_size=batch_size,epochs=35,verbose=1,validation_data=(x_train,y_train),callbacks=[f1])#50validation_split=0.3

问题一:用print输出_val_f1, _val_precision, _val_recall时,会报错:TypeError: only length-1 arrays can be converted to Python scalars

目前还不知道原因,但是只输出 _val_f1却不会报错。

问题二:直接调用别人代码

_val_f1 = f1_score(val_targ, val_predict)

_val_recall = recall_score(val_targ, val_predict)

_val_precision = precision_score(val_targ, val_predict) 

会报错:ValueError: Target is multilabel-indicator but average='binary'. Please choose another average setting.

添加参数 average后,未报错。参考sklearn metrics for multiclass classification

问题三:计算F1要添加validation_data,我的代码中为了方便直接用的训练集。直接调用

self.model.validation_data[0]  

self.model.validation_data[1]

会报错:AttributeError: 'Sequential' object has no attribute 'validation_data'

应该将其改为self.validation_data[0]   self.validation_data[1],参考Sequential has no attribution “validation_data”

代码参考:keras实现f1_score(多分类、二分类)keras里面如何计算f1-score

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
修改代码,使得输出结果是可重复的:# 定义模型参数 input_dim = X_train.shape[1] epochs = 100 batch_size = 32 learning_rate = 0.01 dropout_rate = 0.7 # 定义模型结构 def create_model(): model = Sequential() model.add(Dense(64, input_dim=input_dim, activation='relu')) model.add(Dropout(dropout_rate)) model.add(Dense(32, activation='relu')) model.add(Dropout(dropout_rate)) model.add(Dense(1, activation='sigmoid')) optimizer = Adam(learning_rate=learning_rate) model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy']) return model # 5折交叉验证 kf = KFold(n_splits=5, shuffle=True, random_state=42) cv_scores = [] for train_index, test_index in kf.split(X_train): # 划分训练集和验证集 X_train_fold, X_val_fold = X_train.iloc[train_index], X_train.iloc[test_index] y_train_fold, y_val_fold = y_train_forced_turnover_nolimited.iloc[train_index], y_train_forced_turnover_nolimited.iloc[test_index] # 创建模型 model = create_model() # 定义早停策略 #early_stopping = EarlyStopping(monitor='val_loss', patience=10, verbose=1) # 训练模型 model.fit(X_train_fold, y_train_fold, validation_data=(X_val_fold, y_val_fold), epochs=epochs, batch_size=batch_size,verbose=1) # 预测验证集 y_pred = model.predict(X_val_fold) # 计算AUC指标 auc = roc_auc_score(y_val_fold, y_pred) cv_scores.append(auc) # 输出交叉验证结果 print('CV AUC:', np.mean(cv_scores)) # 在全量数据上重新训练模型 model = create_model() model.fit(X_train, y_train_forced_turnover_nolimited, epochs=epochs, batch_size=batch_size, verbose=1) #测试集结果 test_pred = model.predict(X_test) test_auc = roc_auc_score(y_test_forced_turnover_nolimited, test_pred) test_f1_score = f1_score(y_test_forced_turnover_nolimited, np.round(test_pred)) test_accuracy = accuracy_score(y_test_forced_turnover_nolimited, np.round(test_pred)) print('Test AUC:', test_auc) print('Test F1 Score:', test_f1_score) print('Test Accuracy:', test_accuracy) #训练集结果 train_pred = model.predict(X_train) train_auc = roc_auc_score(y_train_forced_turnover_nolimited, train_pred) train_f1_score = f1_score(y_train_forced_turnover_nolimited, np.round(train_pred)) train_accuracy = accuracy_score(y_train_forced_turnover_nolimited, np.round(train_pred)) print('Train AUC:', train_auc) print('Train F1 Score:', train_f1_score) print('Train Accuracy:', train_accuracy)
06-02

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值