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都越小越好。
网友评论