【笔记】F1 score

F1 score

关于精准率和召回率

精准率和召回率可以很好的评价对于数据极度偏斜的二分类问题的算法,有个问题,毕竟是两个指标,有的时候这两个指标也会产生差异,对于不同的算法,精准率可能高一些,召回率可能低一些,反之一样,真正使用的时候应该根据具体的使用场景来去解读这两个指标

想要得到这两个指标之间的平衡,希望能同时照顾到精准率和召回率,这样就可以使用新的指标,F1 score

F1 score的目的就是兼顾这两个指标,描述的是精准率和召回率的调和平均值,公式可以写成

这种的好处就是,如果说一个值特别低,另外一个值特别高,最终得到的F1 score的值也会很低,只有两个值都很高,得到的值才会非常高

可以将式子进行化简通分变形,最后可以得到

具体实现

(在notebook中)

首先实现一个F1 score,根据上式即可写出,设置如果分母为0,直接返回0即可

  import numpy as np

  def f1_score(precision,recall):
      try:
          return 2*precision*recall / (precision+recall)
      except:
          return 0.0

如果精准率为0.5,召回率为0.5,求出对应的F1 score

  precision = 0.5
  recall = 0.5
  f1_score(precision,recall)

结果如下

如果精准率为0.1,召回率为0.9,求出对应的F1 score

  precision = 0.1
  recall = 0.9
  f1_score(precision,recall)

结果如下

如果精准率为0.0,召回率为1.0,求出对应的F1 score

  precision = 0.0
  recall = 1.0
  f1_score(precision,recall)

结果如下

使用手写识别数据集,相应的设置为极度偏斜的数据情况,然后对数据集进行分割

  from sklearn import datasets

  digits = datasets.load_digits()
  X = digits.data
  y = digits.target.copy()

  y[digits.target==9] = 1
  y[digits.target!=9] = 0

  from sklearn.model_selection import train_test_split
  X_train,X_test,y_train,y_test =  train_test_split(X,y,random_state=666)

使用sklearn中的逻辑回归后,计算准确度

  from sklearn.linear_model import LogisticRegression

  log_reg = LogisticRegression()
  log_reg.fit(X_train,y_train)
  log_reg.score(X_test,y_test)

结果如下

对训练的结果进行预测,使用混淆矩阵得出

  y_predict = log_reg.predict(X_test)

  from sklearn.metrics import confusion_matrix

  confusion_matrix(y_test,y_predict)

结果如下

计算准确率

  from sklearn.metrics import precision_score

  precision_score(y_test,y_predict)

结果如下

计算召回率

  from sklearn.metrics import recall_score

  recall_score(y_test,y_predict)

结果如下

使用sklearn中的f1_score计算F1 score,传入真实值和预测值

  from sklearn.metrics import f1_score

  f1_score(y_test,y_predict)

结果如下

以上就是F1 score的实现以及概念

原文地址:https://www.cnblogs.com/jokingremarks/p/14325221.html