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都越小越好。