评价指标
一、ROC、AUC
1. ROC(receiver operating characteristic)
1.1 混淆矩阵
(1)真正类率 TPR(True Postive Rate) ,灵敏度,召回率
T
P
R
=
S
e
n
s
i
t
i
v
i
t
y
=
R
e
c
a
l
l
=
T
P
P
=
T
P
T
P
+
F
N
TPR=Sensitivity=Recall= \frac{TP } {P }=\frac{ TP}{TP + FN}
TPR=Sensitivity=Recall=PTP=TP+FNTP
(2)假正类率 FPR (False Postive Rate)
F
P
R
=
F
P
N
=
F
P
F
P
+
T
N
FPR= \frac{FP } { N } = \frac{FP} {FP + TN}
FPR=NFP=FP+TNFP
(3)真负类率 TNR(True Negative Rate) ,特异度
T
N
R
=
S
p
e
c
i
f
i
c
i
t
y
=
T
N
N
=
T
N
F
P
+
T
N
TNR=Specificity= \frac{TN } { N }= \frac{TN }{FP + TN}
TNR=Specificity=NTN=FP+TNTN
(4)精确率
P
r
e
c
i
s
i
o
n
=
T
P
P
′
=
T
P
T
P
+
F
P
Precision = \frac{TP}{P'}=\frac{TP}{TP+FP}
Precision=P′TP=TP+FPTP
容易看出 查准率P与查全率R的关系在于分母不同。
前三个式子确定分母的技巧:看两个描述词组合后是正类还是负类,分母就是实际类别的正类/负类。而分子显然可以直接确定。
例如:
真正(TP)类 --> 正类( P );
假正(FP)类 --> 负类( N );
真负(TN)类 --> 负类( N );
1.2 ROC的绘制:
注意:分类器输出的值是一个概率,即该样本属于正类的概率p。
-
p的讨论:
- p ∈ { 0 , 1 } p\in\{0,1\} p∈{0,1}, 那么对于一次分类结果,作图得到的是图中一个点。
- p ∈ [ 0 , 1 ] p\in[0,1] p∈[0,1], 那么对于一次分类结果,递增阈值,描点-连线,得到的是一条曲线。
-
分类器性能的讨论:
- 如果为随机分类器
若p属于情况1,无穷多次分类的结果,描点,得到对角线上离散点组成的直线;
若p属于情况2,一次分类结果,递增阈值,描点-连线,得到对角线上的直线。 - 如果分类器性能很好
若p属于情况1,无穷多次分类结果,得到靠近左上角的离散点组成曲线;
若p属于情况2,则一次分类结果,阈值递增,描点-连线,得到靠近左上角的曲线。
- 如果为随机分类器
2. AUC
(Area Under Curve)曲线下的面积
二、MSE、RMSE、MAE
1. MSE 均方误差 (mean squared error)
M
S
E
=
E
[
(
θ
^
m
−
θ
)
2
]
=
B
i
a
s
(
θ
^
m
)
2
+
V
a
r
(
θ
^
m
)
=
1
m
∑
i
=
1
m
(
y
i
−
y
i
^
)
2
MSE= \mathbb{E}[(\hat{\theta}_m-\theta)^2]=Bias(\hat{\theta}_m)^2+Var(\hat\theta_m)\\= \frac{1}{m}\sum^m_{i=1}(y_i-\hat{y_i})^2
MSE=E[(θ^m−θ)2]=Bias(θ^m)2+Var(θ^m)=m1i=1∑m(yi−yi^)2
偏差度量着偏离真实函数或参数的误差期望。而方差度量着数据上任意特定采样可能导致的估计期望的偏差。
利用MSE可以同时衡量偏差和方差这两个不同误差来源。
(如图)增加模型复杂度会增加方差,降低偏差。
2. RMSE 均方根误差 ( root mean squared error)
1 m ∑ i = 1 m ( y i − y i ^ ) 2 = M S E \sqrt{\frac{1}{m}\sum^m_{i=1}(y_i-\hat{y_i})^2}=\sqrt{MSE} m1i=1∑m(yi−yi^)2=MSE
3. MAE 平均绝对误差(mean absolute error )
1 m ∑ i = 1 m ∣ y i − y i ^ ∣ \frac{1}{m}\sum^m_{i=1}|y_i-\hat{y_i}| m1i=1∑m∣yi−yi^∣
三、代码
1. accuracy_score
sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)
- normalize:默认值为True,返回正确分类的比例;如果为False,返回正确分类的样本数
from sklearn.metrics import accuracy_score
y_pred = [0,2,1,3]
y_true = [0,1,2,3]
accuracy_score(y_true, y_pred) # 0.5
accuracy_score(y_true, y_pred, normalize=False) # 2
2. recall_score
sklearn.metrics.recall_score(y_true, y_pred, labels=None, pos_label=1,average='binary', sample_weight=None)
- average : string, [None, ‘micro’, ‘macro’(default), ‘samples’, ‘weighted’]
from sklearn.metrics import recall_score
y_true = [0, 1, 2, 0, 1]
y_pred = [0, 2, 1, 0, 1]
# macro:计算二分类metrics的均值
recall_score(y_true,y_pred,average='macro') # 0.5
# micro:每个类的metrics上的权重及因子进行求和,来计算整个份额。
recall_score(y_true,y_pred,average='micro') # 0.6
# weighted:计算二分类metrics的平均,通过在每个类的score上进行加权实现。
recall_score(y_true,y_pred,average='weighted') # 0.6
# average=None将返回一个数组,它包含了每个类的得分.
recall_score(y_true,y_pred,average=None) # array([1. , 0.5 , 0.])
3. roc_curve、auc、roc_auc_score
sklearn.metrics.roc_curve(y_true,y_score, pos_label=None, sample_weight=None, drop_intermediate=True)
- 函数返回这三个变量:fpr, tpr,和 阈值thresholds; (在对应阈值下的fpr,tpr)
sklearn.metrics.auc(x, y, reorder=False)
- 计算AUC值,其中x,y分别为数组形式,根据(xi,yi)在坐标上的点,生成的曲线,然后计算AUC值;
import numpy as np
from sklearn.metrics import roc_curve
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8]) # “Score”表示每个测试样本属于正样本的概率。
fpr, tpr, thresholds = roc_curve(y, scores, pos_label=2)
print(fpr,tpr, thresholds) # [0. 0. 0.5 0.5 1. ] [0. 0.5 0.5 1. 1. ] [1.8 0.8 0.4 0.35 0.1 ]
from sklearn.metrics import auc
auc(fpr, tpr) # 0.75
roc_auc_score
sklearn.metrics.roc_auc_score(y_true, y_score, average='macro', sample_weight=None)
- 直接根据真实值(必须是二值)、预测值(可以是0/1,也可以是proba值)直接计算出auc值
from sklearn.metrics import roc_auc_score
y_true = np.array([0,0,1,1])
y_score = np.array([0.1, 0.4, 0.35, 0.8])
roc_auc_score(y_true, y_score)
4. mean_squared_error
sklearn.metrics.mean_squared_error(y_true, y_pred, *, sample_weight=None, multioutput='uniform_average', squared=True)
from sklearn.metrics import mean_squared_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
MSE = mean_squared_error(y_true, y_pred) # 0.375
RMSE = mean_squared_error(y_true, y_pred)**0.5 # 0.6123724356957945
5. mean_absolute_error
sklearn.metrics.mean_absolute_error(y_true, y_pred, *, sample_weight=None, multioutput='uniform_average')
from sklearn.metrics import mean_absolute_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_absolute_error(y_true, y_pred) # 0.5
参考链接
[1]: https://blog.csdn.net/u013385925/article/details/80385873
[2]: https://www.zhihu.com/question/23700474
[3]: sklearn_API