分类问题中的混淆矩阵(confusion matrix)

 

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)


横轴是FPR,纵轴是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都越小越好。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值