sklearn中ConfusionMatrix

作者: 小甜瓜Melon | 来源:发表于2017-08-21 17:33 被阅读666次

    sklearn输出的评价矩阵

    # algorithm1:LogisticRegression
    from sklearn import metrics
    from sklearn.linear_model import LogisticRegression
    model = LogisticRegression()
    model.fit(X, y)
    print(model)
    # make predictions
    expected = y
    predicted = model.predict(X)
    # summarize the fit of the model
    print CutoffLine
    # print(metrics.classification_report(expected, predicted))
    classification_report = metrics.classification_report(expected, predicted)
    print classification_report
    print CutoffLine
    confusion_matrix = metrics.confusion_matrix(expected, predicted)
    print confusion_matrix
    # print(metrics.confusion_matrix(expected, predicted))
    

    输出结果

    LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
              intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
              penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
              verbose=0, warm_start=False)
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
                 precision    recall  f1-score   support
    
            0.0       0.79      0.89      0.84       500
            1.0       0.74      0.55      0.63       268
    
    avg / total       0.77      0.77      0.77       768
    
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
    [[447  53]
     [120 148]]
    

    结果分析

    TP = confusion_matrix[0,0]; FN = confusion_matrix[0,1] 
    FP = confusion_matrix[1,0]; TN = confusion_matrix[1,1]
    print u"TP, FN, FP, TN的值依次是:", TP, FN, FP, TN
    
    print CutoffLine
    from __future__  import division
    ################################################
    """
    Matrix
         0     1
    0    TP    FN
    1    FP    TN
    precison = TP/(TP+FP)
      recall = TP/(TP+FN)
          F1 = (2 * precision * recall)/(precision + recall)
    Precision:被检测出来的信息当中 正确的或者相关的(也就是你想要的)信息中所占的比例;
    Recall:所有正确的信息或者相关的信息(wanted)被检测出来的比例。
    F1综合了P和R的结果,当F1较高时则比较说明实验方法比较理想。
    """
    ################################################
    precision_0 = round((TP/(TP + FP)), 2)
    recall_0 = round((TP /(TP + FN)), 2)
    f1_score_0 = round((2 * precision_0 * recall_0 /(precision_0 + recall_0)), 2)
    support_0 = TP + FN
    print u"把结果0看成正例时:", precision_0, recall_0, f1_score_0, support_0
    
    print CutoffLine
    ################################################
    """precison = TN/(TN+FN);
         recall = TN/(TN+FP)
             F1 = (2 * precision * recall)/(precision + recall)"""
    ################################################
    precision_1 = round((TN/(TN+FN)), 2)
    recall_1 = round((TN/(TN+FP)),2)
    f1_score_1 = round((2 * precision_1 * recall_1 /(precision_1 + recall_1)), 2)
    support_1 = FP + TN
    print u"把结果1看成正例时:", precision_1, recall_1, f1_score_1, support_1
    
    print CutoffLine
    f1_score_avg = recall_avg = precision_avg = round(((148 + 447)/768),2)
    print u"平均结果:", precision_avg, recall_avg, f1_score_avg, TP + FN + FP + TN 
    

    输出结果

    TP, FN, FP, TN的值依次是: 447 53 120 148
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
    把结果0看成正例时: 0.79 0.89 0.84 500
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
    把结果1看成正例时: 0.74 0.55 0.63 268
    *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
    平均结果: 0.77 0.77 0.77 768
    

    几点备注:1. sklearn输出的混淆矩阵中,横轴为预测结果,纵轴为实际结果。参考以下文章。

    参考:基于混淆矩阵的评价指标
    识别任务中混淆矩阵(Confusion Matrix)用于评价算法好坏的指标。下图是一个二分类问题的混淆矩阵:


    TP:正确肯定——实际是正例,识别为正例
    FN:错误否定(漏报)——实际是正例,却识别成了负例
    FP:错误肯定(误报)——实际是负例,却识别成了正例
    TN:正确否定——实际是负例,识别为负例

    相关术语:
    AccuracyRate(准确率): (TP+TN)/(TP+TN+FN+FP)
    ErrorRate(误分率): (FN+FP)/(TP+TN+FN+FP)
    Recall(召回率,查全率,击中概率): TP/(TP+FN), 在所有GroundTruth为正样本中有多少被识别为正样本了;
    Precision(查准率):TP/(TP+FP),在所有识别成正样本中有多少是真正的正样本;
    TPR(TruePositive Rate): TP/(TP+FN),实际就是Recall
    FAR(FalseAcceptance Rate)或FPR(False Positive Rate):FP/(FP+TN), 错误接收率,误报率,在所有GroundTruth为负样本中有多少被识别为正样本了;
    FRR(FalseRejection Rate): FN/(TP+FN),错误拒绝率,拒真率,在所有GroundTruth为正样本中有多少被识别为负样本了,它等于1-Recall

    ROC曲线(receiver operatingcharacteristic curve)


    横轴是FAR,纵轴是Recall;

    每个阈值的识别结果对应一个点(FPR,TPR),当阈值最大时,所有样本都被识别成负样本,对应于右上角的点(0,0),当阈值最小时,所有样本都被识别成正样本,对应于右上角的点(1,1),随着阈值从最大变化到最小,TP和FP都逐渐增大;

    一个好的分类模型应尽可能位于图像的左上角,而一个随机猜测模型应位于连接点(TPR=0,FPR=0)和(TPR=1,FPR=1)的主对角线上;

    可以使用ROC曲线下方的面积AUC(AreaUnder roc Curve)值来度量算法好坏:如果模型是完美的,那么它的AUG = 1,如果模型是个简单的随机猜测模型,那么它的AUG = 0.5,如果一个模型好于另一个,则它的曲线下方面积相对较大;

    ERR(Equal Error Rate,相等错误率):FAR和FRR是同一个算法系统的两个参数,把它放在同一个坐标中。FAR是随阈值增大而减小的,FRR是随阈值增大而增大的。因此它们一定有交点。这个点是在某个阈值下的FAR与FRR等值的点。习惯上用这一点的值来衡量算法的综合性能。对于一个更优的指纹算法,希望在相同阈值情况下,FAR和FRR都越小越好。

    相关文章

      网友评论

        本文标题:sklearn中ConfusionMatrix

        本文链接:https://www.haomeiwen.com/subject/qokhdxtx.html