准确率 平均准确率
准确率:
对于验证集,模型预测正确的样本数/ 预测的总样本数
a
c
c
u
r
a
c
y
=
n
c
o
r
r
e
c
t
n
t
o
t
a
l
accuracy = \frac {n_{correct}} {n_{total}}
accuracy=ntotalncorrect
缺点:
在训练集,验证集类别严重不平衡时,准确率无法全面评估模型
平均准确率:
对每个类别,计算准确率,然后所有类别准确率 求均值,作为模型的准确率
如:验证集中0类有95个样本,1类有5分样本,模型预测的时候将全部样本预测为0,此时准确率0.95,但是对1类全部预测错了,虽然准确率高,但是模型不好;而平均准确率为0.5,可以说明模型不好。
所以平均准确率,更能全面的评估模型
例子
y_test = [ 0,1,0,2,1,0]
y_pred = [0,2,0,1,2,0]
准确率:
a
c
c
u
r
a
c
y
=
3
6
=
0.5
accuracy = \frac {3} {6} =0.5
accuracy=63=0.5
平均准确率:
a
c
c
0
=
1
acc_0 = 1
acc0=1
a
c
c
1
=
0
acc_1 = 0
acc1=0
a
c
c
2
=
0
acc_2 = 0
acc2=0
m
e
a
n
a
c
c
=
a
c
c
0
+
a
c
c
1
+
a
c
c
2
3
=
0.333
mean_{acc} = \frac {acc_0+acc_1+acc_2} {3} =0.333
meanacc=3acc0+acc1+acc2=0.333
代码
#手动实现计算准确率
n_correct = (y_pred == y_test).sum()
n_total = y_test.shape[0]
acc = n_correct / n_total
#sklearn 实现
from sklearn.metrics import accuracy_score
from sklearn.metrics import balanced_accuracy_score
acc = accuracy_score(y_test,y_pred)
mean_acc = balanced_accuracy_score(y_test,y_pred)
混淆矩阵
更详细的描述模型预测结果
2分类 --> 2x2矩阵
n分类 --> nxn矩阵
如下:2分类的混淆矩阵
真负率:
T
N
T
N
+
F
P
=
8
8
+
1
\frac {TN} {TN+FP} = \frac {8} {8+1}
TN+FPTN=8+18
假正率:
F
P
T
N
+
F
P
=
1
8
+
1
\frac {FP} {TN+FP} = \frac {1} {8+1}
TN+FPFP=8+11
假负率:
F
N
F
N
+
T
P
=
2
2
+
10
\frac {FN} {FN+TP} = \frac {2} {2+10}
FN+TPFN=2+102
真正率:
T
P
F
N
+
T
P
=
10
2
+
10
\frac {TP} {FN+TP} =\frac {10} {2+10}
FN+TPTP=2+1010
#sklearn API
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test,y_pred)
查准率 召回率 f1_score
查准率,召回率是一对矛盾的指标,一般同时使用
f1_score,是对两者的融合
查准率precision_score:从预测的角度出发,预测正确的样本数 / 预测为某一类的总数,二分类中只计算正类,
多分类中计算预测的每一类的查准率,求均值作为模型的查准率
召回率recall_score:从真实的角度出发,预测正确的样本数 / 某一类真实样本数,二分类只计算正类
多分类计算每一类的召回率,求均值作为模型的召回率
f 1 _ s c o r e = 2 ∗ p r e c i s i o n ∗ r e c a l l p r e c i s i o n + r e c a l l f1\_score = \frac {2 * precision * recall} {precision+recall} f1_score=precision+recall2∗precision∗recall
#sklearn 中的API
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
#0,1 二分类
p = precision_score(y_test,y_pred)
#0,1,2多分类
p = precision_score(y_test,y_pred,average="macro")
#average计算平均值的方式
#macro 简单平均
#weighted 加权平均 预测的每一类的查准率*每一类真实样本的占比
#召回率计算方式同查准率
分类报告
from sklearn.metrics import classification_report
r = classification_report(y_test,y_pred)
如下:
ROC AUC
以FPR为横坐标,以TPR为纵坐标 的折线图
折线下的面积即为 AUC,类别不均衡时仍可以有效的评估模型,用于二分类
#sklearn API
from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score
fpr,tpr,threshold = roc_curve(y_test,y_pred_proba[:,1],pos_label=1)
auc = roc_auc_score(y_test,y_pred_proba[:,1])