机器学习:评价分类结果(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)
原文地址:https://www.cnblogs.com/volcao/p/9404519.html