Machine|scikit-learn-分类模型评价标准

0 模型指标
??本篇博客记录主要的模型评价标准的含义和用法。先看一个我常用的评价指标图(二分类):
Machine|scikit-learn-分类模型评价标准
文章图片

1 TP ,FP ,TN ,FN
TP:实际正例;预测正例;
FP:实际反例;预测正例;
TN:实际反例;预测反例;
FN;实际正例;预测反例;
2 Recall ,Precision ,FPR , Specificity ,F1-score ,MCC
Recall (True Postive Rate):
r e c a l l = s e n s i t i v i t y = T P R = T P ( T P + F N ) (1) \bm{recall=sensitivity=TPR=\frac{TP}{(TP+FN)}\tag1} recall=sensitivity=TPR=(TP+FN)TP?(1)
称呼:查全率/召回率/真正类率
含义:实际为正例中,被预测为正例的比例。
Precision:
p r e c i s i o n = T P ( T P + F P ) (2) \bm{precision=\frac{TP}{(TP+FP)} \tag2} precision=(TP+FP)TP?(2)
称呼:精确率
含义:预测为正例中,实际也为正例的比例。
FPR (False Postive Rate):
F P R = F P ( F P + T N ) (3) \bm{FPR=\frac{FP}{(FP+TN)}\tag3} FPR=(FP+TN)FP?(3)
称呼:负正类率
含义:实际为负例中,被预测为正例的负例的比例。
TNR (True Negative Rate):
S p e c i f i c i t y = T N R = T N ( F P + T N ) (4) \bm{Specificity=TNR=\frac{TN}{(FP+TN)}\tag4} Specificity=TNR=(FP+TN)TN?(4)
称呼:真负类率
含义:实际为负例中,被预测为负例的比例。
F1-score:
F 1 s c o r e = 2 ? r e c a l l ? p r e c i s i o n r e c a l l + p r e c i s i o n (5) \bm {F_1{score}=\frac{2*recall*precision}{recall+precision}\tag5} F1?score=recall+precision2?recall?precision?(5)
称呼:F1-score
含义:是一个兼顾考虑了Precision 和 Recall 的评估指标。通常, F-measure 就是指 Precision 和 Recall 的调和平均数(Harmonic mean)
MCC(Matthews correlation coefficient):
M C C = ( T P ? T N ? F P ? F N ) ( ( T P + F P ) ? ( T P + F N ) ? ( T N + F P ) ? ( T N + F N ) ) (6) \bm {MCC = \frac{(TP*TN-FP*FN)}{\sqrt{ ((TP+FP)*(TP+FN)*(TN+FP)*(TN+FN))}}\tag6} MCC=((TP+FP)?(TP+FN)?(TN+FP)?(TN+FN)) ?(TP?TN?FP?FN)?(6)
称呼:马修斯相关系数
含义:MCC本质上是一个描述实际分类与预测分类之间的相关系数,它的取值范围为[-1,1],取值为1时表示对受试对象的完美预测,取值为0时表示预测的结果还不如随机预测的结果,-1是指预测分类和实际分类完全不一致。
3 macro avg ,micro avg ,weighted avg
??这里我们以precision,recall为例进行分析。
??我们首先清楚一点是,我们在计算recall或者precision的时候,是根据某一类别进行计算的,什么意思呢?比如:我们做二分类,0代表正例,1代表反例。根据这样的定义我们可以计算出 TP FP TN FN 以及precision 和recall 。反过来,我们以1 代表正例,0代表反例,同样可以计算出刚才那一堆。这里的avg 嗯就是对刚才的那一堆进行avg。首先我们来看 macro avg。
??macro avg的意思是宏平均,从字面意思我们应该明白大概了。就是对类1的recall值和类0的recall值进行平均,权重是0.5.这个明白了,weighted avg 也差不多啦,weighted avg就是用样本的比例充当权重来计算的。macro avg公式如下
r e c a l l = r e c a l l 1 + r e c a l l 2 2 (7) \bm{recall=\frac{recall_1+recall_2}{2}\tag7} recall=2recall1?+recall2??(7)
我们再来看micro avg公式:
r e c a l l = T P 1 + T P 2 ( T P 1 + F N 1 + T P 2 + F N 2 ) (8) \bm{recall=\frac{TP_1+TP_2}{(TP_1+FN_1+TP_2+FN_2)}\tag8} recall=(TP1?+FN1?+TP2?+FN2?)TP1?+TP2??(8)
从公式也可以看出微平均和宏平均的计算层面不一样。precision和recall类似这里就不多说了。
另外,还有就是 f1-score 的宏平均和微平均
macro avg:
m a c r o f = f 1 + f 2 2 (9) \bm{macro_f=\frac{f1+f2}{2}\tag9} macrof?=2f1+f2?(9)
micro avg:
m i c r o f = 2 ? m i c r o p ? m i c r o r m i c r o p + m i c r o r (10) \bm{micro_f=\frac{2*micro_p*micro_r}{micro_p+micro_r}\tag{10}} microf?=microp?+micror?2?microp??micror??(10)

4 ROC曲线和AUC
FPR和TPR
FPR(False Positive Rate)和TPR(True Positive Rate)分别对应着ROC曲线的横纵坐标,其定义如下 :
T P R = T P ( T P + F N ) (11) \bm{TPR=\frac{TP}{(TP+FN)}\tag{11}} TPR=(TP+FN)TP?(11)
F P R = F P ( F P + T N ) (12) \bm{FPR=\frac{FP}{(FP+TN)}\tag{12}} FPR=(FP+TN)FP?(12)
对于一个学习器它的预测结果只能产生一对(FPR,TPR),这只能绘制一个点,不足以绘制出一条曲线。实际上对于许多学习器在判定二分类问题时是预测出一个对于真值的范围在[0.0, 1.0]之间的概率值,而判定是否为真值则看该概率值是否大于设定的阈值(Threshold)。例如如果阈值设定为0.5则所有概率值大于0.5的均为正例,其余为反例。因此对于不同的阈值我们可以得到一系列相应的FPR和TPR,从而绘制出ROC曲线。
以下列数据举例:
Machine|scikit-learn-分类模型评价标准
文章图片

如果我们将他的score值做阈值,也就是说,只有score大于等于0.9时,我们才把样本归类到正样本,这么一来, 在ROC曲线图中,样本1对应的混淆矩阵(confusion matrix)为:

* 预测 *
真实 正例 反例
正例 1 9
反例 0 10
第一个样本score=0.9,所以预测为正样本,其本身也为正样本,其他样本score都<0.9,所以都预测为负样本,从混淆矩阵中,我们可以算出X轴坐标(false positive rate)= 0/(0+10)= 0 和Y轴坐标(true positive rate)= 1/(1+9)= 0.1,所以第一个点为(0,0.1)
依次按照不同的阈值来计算最终得到的图如下:
Machine|scikit-learn-分类模型评价标准
文章图片

  • AUC绘制说明以及图片来源:https://blog.csdn.net/xiaohuihui1994/article/details/87987836
  • 关于多分类AUC的原理参看:https://blog.csdn.net/YE1215172385/article/details/79443552
  • 同时这里给出一个例子:
from sklearn import datasets from sklearn import metrics from sklearn.model_selection import train_test_split from sklearn.preprocessing import label_binarize import numpy as np from xgboost import XGBClassifier import pandas as pdiris = datasets.load_iris() iris_X = iris.data iris_y = iris.targety = pd.Categorical(iris_y).codes# 将标签转换0,1,... X_train, X_test, y_train, y_test = train_test_split(iris_X, iris_y, test_size=0.3) y_one_hot = label_binarize(y_test, np.arange(3))clf=XGBClassifier(random_state=2020) clf.fit(X_train,y_train) y_pro=clf.predict_proba(X_test) y_pre=clf.predict(X_test)print("AUC:",metrics.roc_auc_score(y_one_hot,y_pro,average='micro'))#2、混淆矩阵 metrics.confusion_matrix(y_test, y_pre)# 4、模型报告 print(metrics.classification_report(y_test, y_pre))

5 使用
下面是sklearn的部分代码:
predicted = cross_val_predict(classifier, X, y, cv=cv, n_jobs=cpu_num) predict_prob = cross_val_predict(classifier, X, y, cv=cv, n_jobs=cpu_num, method='predict_proba') AUC = metrics.roc_auc_score(y, predict_prob[:, 1]) print("AUC:{}".format(AUC)) print("ACC:{}".format(metrics.accuracy_score(y, predicted))) print("MCC:{}".format(metrics.matthews_corrcoef(y, predicted))) print(classification_report(y, predicted, labels=label)) print("confusion matrix\n") print(pd.crosstab(pd.Series(y, name='Actual'), pd.Series(predicted, name='Predicted')))

参考
【Machine|scikit-learn-分类模型评价标准】https://blog.csdn.net/xiaohuihui1994/article/details/87987836

    推荐阅读