zoukankan      html  css  js  c++  java
  • 机器学习:评价分类结果(实现混淆矩阵、精准率、召回率)

    一、实例

     1)构造极度偏差的数据

    • import numpy as np
      from sklearn import datasets
      
      digits = datasets.load_digits()
      X = digits.data
      y = digits.target.copy()
      
      # 构造极度偏斜的数据
      # y = digits.target:y 和 digits.target 指向的是同一组数据,此处修改 y 时,digits.target 也会一起被修改,因为赋值符号 '=' 没有进行数据的 copy;
      # 如果想不改变 digits.target 的数据,需要更改赋值方式:y = digits.target.copy()digits.target.copy();
      y[digits.target==9] = 1
      y[digits.target!=9] = 0
    1. y = digits.target:y 和 digits.target 指向的是同一组数据,此处修改 y 时,digits.target 也会一起被修改,因为赋值符号 '=' 没有进行数据的 copy;
    2. y = digits.target.copy():改变 y 的数据时,不会改变 digits.target 的数据;

     2)直接使用二分类算法分类预测

    • LogisticRegression() 模块使用默认参数
      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)
      # 准确率:0.9755555555555555
    1. 由于数据是极度偏斜的,即使模型预测所有的样本的类型都是 0,准确度也能达到 0.9 左右;
    2. 准确度只能说明模型对每一个样本预测的准确程度,并不能真正能准确的找出类型为 1 的样本;
    3. 找出类型为 1 的样本才是业务的要求,精准全面的找出类型为 1 的样本才是算法模型要做的事,准确度并不能反映模型是否精准而全面的找出了类型为 1 的样本;(要根据业务最根本的目的设计算法,以及选择模型好坏的指标)

     3)使用精准率和召回率做为判断模型好坏的指标

    • 求混淆矩阵

      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))
      
      def FP(y_true, y_predict):
          assert len(y_true) == len(y_predict)
          return np.sum((y_true == 0) & (y_predict == 1))
      
      def FN(y_true, y_predict):
          assert len(y_true) == len(y_predict)
          return np.sum((y_true == 1) & (y_predict == 0))
      
      def TP(y_true, y_predict):
          assert len(y_true) == len(y_predict)
          return np.sum((y_true == 1) & (y_predict == 1))
      
      def confusion_matrix(y_true, y_predict):
          return np.array([
              [TN(y_test, y_log_predict), FP(y_test, y_log_predict)],
              [FN(y_test, y_log_predict), TP(y_test, y_log_predict)]
          ])
      
      confusion_matrix(y_test, y_log_predict)
      # 混淆矩阵:array([[403, 2],
                      [9, 36]]
    • 求精准率

      def precision_score(y_true, y_predict):
          tp = TP(y_test, y_log_predict)
          fp = FP(y_test, y_log_predict)
          try:
              return tp / (tp + fp)
          except:
              return 0.0
          
      precision_score(y_test, y_log_predict)
      # 精准率:0.9473684210526315
    • 求召回率

      def recall_score(y_true, y_predict):
          tp = TP(y_test, y_log_predict)
          fn = FN(y_test, y_log_predict)
          # try...except:异常检测;
              # 没有异常,执行 try 后面的语句;
              # 出现异常,执行 except 后面的语句,
          try:
              return tp / (tp + fn)
          except:
              return 0.0
          
      recall_score(y_test, y_log_predict)
      # 召回率:0.8

     4)scikit-learn 中的混淆矩阵、精准率、召回率

    • 混淆矩阵、精准率、召回率,3 者的包都封装在了 sklearn.metrics 中,任何二分类算法都可以通过模块下对应的方法直接得到混淆矩阵、精准率、召回率;
    • 混淆矩阵

      from sklearn.metrics import confusion_matrix
      
      confusion_matrix(y_test, y_log_predict)
      # 混淆矩阵:array([[403, 2],
                        [9, 36]], dtype=int64)
    • 精准率

      from sklearn.metrics import precision_score
      
      precision_score(y_test, y_log_predict)
      # 精准率:0.9473684210526315
    • 召回率

      from sklearn.metrics import recall_score
      
      recall_score(y_test, y_log_predict)
      # 召回率:0.8
  • 相关阅读:
    mysql and与or连用时遇到的坑
    mysql : 使用不等于过滤null的问题
    Bio Nio demo
    线上服务器的cpu使用达到100%了,如何排查、定位和解决该问题?
    二叉查找树、平衡二叉树、B树、B+树、聚集索引、非聚集索引
    java实现折线图统计数据
    递归构造树
    python中获取json数组中的具体数值(调用百度AI返回的json数据)
    python中使用ajax回调函数限制
    python+flask框架——前后端数据传递
  • 原文地址:https://www.cnblogs.com/volcao/p/9394909.html
Copyright © 2011-2022 走看看