• 机器学习:评价分类结果(ROC 曲线)


    一、基础理解

     1)定义

    • ROC(Receiver Operation Characteristic Curve)
    • 定义:描述 TPR 和 FPR 之间的关系;
    • 功能:应用于比较两个模型的优劣;
    1. 模型不限于是否通过极度偏斜的数据训练所得
    2. 比较方式:ROC 曲线与坐标图形边界围成的面积,越大模型越优;
    1. TPR(True Positive Rate):真正率;被预测为正的正样本结果数 / 正样本实际数:TPR = TP /(TP + FN);
    2. TNR(True Negative Rate):真负率;被预测为负的负样本结果数 / 负样本实际数:TNR = TN /(TN + FP) ;
    3. FPR(False Positive Rate):假正率;被预测为正的负样本结果数 /负样本实际数:FPR = FP /(TN + FP) ;
    4. FNR(False Negative Rate):假负率;被预测为负的正样本结果数 / 正样本实际数:FNR = FN /(TP + FN) ;
    • 召回率(Recall)和精度(Precise)是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量;

     2)与 P - R 曲线的区别

    • P - R 曲线:应用于判定由极度有偏数据所训练的模型的优劣;
    • ROC 曲线:应用于比较两个模型的优劣;
    1. 模型:可以是同样算法不同超参数所得的不同模型,也可以是不同算法所得的不同模型;

     3)TPR 和 FPR 的关系

    • 关系
    1. 随着阈值 threshold 的增大,FPR 和 TPR 都逐渐减小;
    2. FPR 和 TPR 称正相关关系,FPR 越高,TPR 相应的也越高;

    二、代码实现 FPR 和 TPR,并绘制 ROC 曲线

     1)封装

    • TPR
      def TPR(y_true, y_predict):
          tp = TP(y_true, y_predict)
          fn = FN(y_true, y_predict)
          try:
              return tp / (tp + fn)
          except:
              return 0.
    • FPR
      def FPR(y_true, y_predict):
          fp = FP(y_true, y_predict)
          tn = TN(y_true, y_predict)
          try:
              return fp / (fp + tn)
          except:
              return 0.

     2)例

    • 求 TPR 和 FPR
      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)
      decision_scores = log_reg.decision_function(X_test)
      
      
      from playML.metrics import FPR, TPR
      
      fprs = []
      tprs = []
      thresholds = np.arange(np.min(decision_scores), np.max(decision_scores), 0.1)
      
      for threshold in thresholds:
          # dtype='int':将数据类型从 bool 型转为 int 型;
          y_predict = np.array(decision_scores >= threshold, dtype='int')
          fprs.append(FPR(y_test, y_predict))
          tprs.append(TPR(y_test, y_predict))
    • 绘制 ROC 曲线

      import matplotlib.pyplot as plt
      plt.plot(fprs, tprs)
      plt.show()

    • 分析:

    1. ROC 曲线与图形边界围成的面积,作为衡量模型优劣的标准,面积越大,模型越优;
    2. 可以是同样算法不同超参数所得的不同模型,也可以是不同算法所得的不同模型;

    三、scikit-learn 中的ROC

    • 模块及使用格式

      from sklearn.metrics import roc_curve
      
      fprs, tprs, thresholds = roc_curve(y_test, decision_scores)
    • 计算 ROC 曲线与坐标轴围成的面积:称 ROC 的 auc;

    • 面积越大,模型越优;

    •  

      from sklearn.metrics import roc_auc_score
      
      roc_auc_score(y_test, decision_scores)
  • 相关阅读:
    VUE可随意拖动的弹窗组件
    入园仪式
    Node启动https服务器
    《高性能javascript》阅读摘要
    浏览器HTTP缓存机制
    使用nightwatch进行E2E测试中文教程
    Puppeteer的入门教程和实践
    Spring AOP 笔记
    ApplicationContext国际化的支持
    Spring ApplicationContext中的”事件传递“笔记
  • 原文地址:https://www.cnblogs.com/volcao/p/9404519.html
Copyright © 2020-2023  润新知