zoukankan      html  css  js  c++  java
  • 【笔记】混淆矩阵,精准率和召回率

    混淆矩阵,精准率和召回率

    评论回归算法的好坏点击这里

    评价分类算法是不能单单靠一个分类准确度就可以衡量的,单用一个分类准确度是有问题的

    比如说,一个癌症预测系统,输入体检信息,就可以判断是否得了癌症,这个系统的预测准确率有99.9%,但是不能说这个系统就是好的,因为如果患有癌症的概率是0.1%,那么即使预测所有人都是健康的,也可以达到99.9%的准确率,这样就发现,这个系统一点用没有

    这种情况可以称为数据极度偏斜,对于极度偏斜的数据,使用分类准确度来评定的话,可以发现其准确度是非常高的,但是有可能其实算法是不太行的,因此对于这种数据,只使用分类准确度是远远不够的

    可以使用比较基础的混淆矩阵来做进一步的分析

    混淆矩阵

    对于二分类问题,混淆矩阵实际上就是一个2*2的矩阵,其还需添加一行一列作为内容的标记,其中行代表真实值,列代表预测值,行相当于是这个二维数组的第一个维度,列相当于第二个维度,一般设为0和1,其中0和1的意思看分析的问题对应设置,设0位阴性,1位阳性,则在0,0的位置为预测阴性正确TN,0,1的位置为预测阳性错误FP,1,0的位置为预测阴性错误FN,1,1的位置为预测阴性正确TP

    这就是混淆矩阵,是在分类任务中的一个重要的工具,可以更好的的得到分类算法的好坏,其中,有两个很重要的通过混淆矩阵才能得到的指标,精准率和召回率

    精准率和召回率

    精准率的公式,其就是预测为1且预测正确的概率

    召回率的公式,其就是真实为1中的预测为1的比例,即真实的发生的事件中成功预测的概率

    为什么说精准率和召回率是比分类准确度更好的指标,因为对于一些没有意义的模型可以很好的分辨出来

    那么可以具体实现一下

    实现混淆矩阵,精准率和召回率

    (在notebook中)

    使用手写识别数据集,由于需要使用的极度偏斜的数据,那么就需要设置内容的条件,即9的时候为1,非9位0,然后对数据集进行分割

      import numpy as np
      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)
    

    使用逻辑回归,并看一下表现如何

      from sklearn.linear_model import LogisticRegression
    
      log_reg = LogisticRegression()
      log_reg.fit(X_train,y_train)
      log_reg.score(X_test,y_test)
    

    结果如下

    由于是极度偏斜的数据,所以要考察一下其他的性能指标,首先得到预测值以后,就开始求TN,FP,TP,FP,求解代码如下

      y_log_predict = log_reg.predict(X_test)
    
      def TN(y_true,y_predict):
          assert len(y_true) == len(y_predict)
          return np.sum((y_true == 0)&(y_predict == 0))
    
      TN(y_test,y_log_predict)
    

    结果如下

      def FP(y_true,y_predict):
          assert len(y_true) == len(y_predict)
          return np.sum((y_true == 0)&(y_predict == 1))
    
      FP(y_test,y_log_predict)
    

    结果如下

      def FN(y_true,y_predict):
          assert len(y_true) == len(y_predict)
          return np.sum((y_true == 1)&(y_predict == 0))
    
      FN(y_test,y_log_predict)
    

    结果如下

      def TP(y_true,y_predict):
          assert len(y_true) == len(y_predict)
          return np.sum((y_true == 1)&(y_predict == 1))
    
      TP(y_test,y_log_predict)
    

    结果如下

    可以尝试得出混淆矩阵的内容

      def confusion_matrix(y_true,y_predict):
          return np.array([
              [TN(y_true,y_predict),FP(y_true,y_predict)],
              [FN(y_true,y_predict),TP(y_true,y_predict)]
          ])
    
      confusion_matrix(y_test,y_log_predict)
    

    结果如下

    精准率的求解代码,使用先前的公式即可

      def precision_score(y_true,y_predict):
          tp = TP(y_true,y_predict)
          fp = FP(y_true,y_predict)
          try:
              return tp / (tp+fp)
          except:
              return 0.0
    
      precision_score(y_test,y_log_predict)
    

    结果如下

    召回率的求解代码,使用先前的公式即可

      def recall_score(y_true,y_predict):
          tp = TP(y_true,y_predict)
          fn = FN(y_true,y_predict)
          try:
              return tp / (tp+fn)
          except:
              return 0.0
    
      recall_score(y_test,y_log_predict)
    

    结果如下

    在sklearn中的混淆矩阵以及精准率和召回率

    使用confusion_matrix即可调用出sklearn中的混淆矩阵,使用和上面一样

      from sklearn.metrics import confusion_matrix
    
      confusion_matrix(y_test,y_log_predict)
    

    结果如下

    使用precision_score即可调用出sklearn中的精准率,使用和上面一样

      from sklearn.metrics import precision_score
    
      precision_score(y_test,y_log_predict)
    

    结果如下

    使用recall_score即可调用出sklearn中的召回率,使用和上面一样

      from sklearn.metrics import recall_score
    
      recall_score(y_test,y_log_predict)
    

    结果如下

    以上就是混淆矩阵,精准率以及召回率的概念公式和实现的过程以及sklearn中的类的调用

  • 相关阅读:
    hive基本操作与应用
    理解MapReduce计算构架
    熟悉HBase基本操作
    熟悉常用的HDFS操作
    爬虫大作业
    数据结构化与保存
    使用正则表达式,取得点击次数,函数抽离
    爬取校园新闻首页的新闻
    网络爬虫基础练习
    Hadoop综合大作业
  • 原文地址:https://www.cnblogs.com/jokingremarks/p/14325195.html
Copyright © 2011-2022 走看看