详解支持向量机-SVC的模型评估指标【菜菜的sklearn课堂笔记】

时间:2022-11-27 10:00:16

视频作者:菜菜TsaiTsai 链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili

从上一节的例子中可以看出,如果我们的目标是希望尽量捕获少数类,那准确率这个模型评估逐渐失效,所以我们需要新的模型评估指标来帮助我们。如果简单来看,其实我们只需要查看模型在少数类上的准确率就好了,只要能够将少数类尽量捕捉出来,就能够达到我们的目的。 但是单纯地追求捕捉出少数类,就会成本太高,而不顾及少数类,又会无法达成模型的效果。所以在现实中,我们往往在寻找捕获少数类的能力和将多数类判错后需要付出的成本的平衡。如果一个模型在能够尽量捕获少数类的情况下,还能够尽量对多数类判断正确,则这个模型就非常优秀了。为了评估这样的能力,我们将引入新的模型评估指标:混淆矩阵和ROC曲线来帮助我们。

混淆矩阵(Confusion Matrix)

混淆矩阵是二分类问题的多维衡量指标体系,在样本不平衡时极其有用。在混淆矩阵中,我们将少数类认为是正例,多数类认为是负例。普通的混淆矩阵,一般使用{0,1}来表示。标准二分类的混淆矩阵,如图所示: 详解支持向量机-SVC的模型评估指标【菜菜的sklearn课堂笔记】

混淆矩阵中,永远是真实值在前,预测值在后。 其实可以很容易看出,11和00的对角线就是全部预测正确的,01和10的对角线就是全部预测错误的。基于混淆矩阵,我们有六个不同的模型评估指标,这些评估指标的范围都在[0,1]之间,所有以11和00为分子的指标都是越接近1越好,所以以01和10为分子的指标都是越接近0越好。对于所有的指标,我们用橙色表示分母,用绿色表示分子,则我们有: 详解支持向量机-SVC的模型评估指标【菜菜的sklearn课堂笔记】

模型整体效果:准确率Accuracy

详解支持向量机-SVC的模型评估指标【菜菜的sklearn课堂笔记】

$$ Accuracy=\frac{11+00}{11+10+01+00} $$ 准确率Accuracy就是所有预测正确的所有样本除以总样本,通常来说越接近1越好。 在支持向量机中,准确率可以被形象地表示为 $$ \frac{决策边界上方红色点+决策边界下方蓝色点}{所有点} $$

捕捉少数类的艺术:

精确度Precision

详解支持向量机-SVC的模型评估指标【菜菜的sklearn课堂笔记】

精确度Precision,又叫查准率,表示所有被我们预测为是少数类的样本中,真正的少数类所占的比例。 在支持向量机中,精确度可以被形象地表示为 $$ \frac{决策边界上方红色点}{决策边界上方所有点} $$ 精确度越高,代表我们捕捉正确的红色点越多,对少数类的预测越精确。精确度越低,则代表我们误伤了过多的多数类。精确度是”将多数类判错后所需付出成本“的衡量。

(y[y == clf.predict(X)] == 1).sum()/(clf.predict(X) == 1).sum()
# y == clf.predict(X)所有预测正确的点的布尔索引
# y[y == clf.predict(X)]所有预测正确的点的y值
# y[y == clf.predict(X)] == 1所有预测正确的点中y值为1的点的布尔索引
# (y[y == clf.predict(X)] == 1).sum()所有预测正确的点中y值为1的点的数量
# clf.predict(X) == 1所有预测值为1的点的布尔索引
# (clf.predict(X) == 1).sum()所有预测值为1的点的数量
---
0.7142857142857143

(y[y == wclf.predict(X)] == 1).sum()/(wclf.predict(X) == 1).sum()
---
0.5102040816326531

可以看出,做了样本平衡之后,精确度是下降的。因为很明显,样本平衡之后,有更多的多数类紫色点被我们误伤了。精确度可以帮助我们判断,是否每一次对少数类的预测都精确,所以又被称为”查准率“。 在现实的样本不平衡例子中,当每一次将多数类判断错误的成本非常高昂的时候(比如大众召回车辆的例子),我们会追求高精确度。精确度越低,我们对多数类的判断就会越错误。当然了,如果我们的目标是不计一切代价捕获少数类,那我们并不在意精确度。

召回率Recall(敏感度Sensitivity,真正率Tre Positive Rate)

详解支持向量机-SVC的模型评估指标【菜菜的sklearn课堂笔记】

召回率Recall,又被称为敏感度(sensitivity),真正率,查全率,表示所有真实为1的样本中,被我们预测正确的样本所占的比例。 在支持向量机中,召回率可以被表示为 $$ \frac{决策边界上方红色点}{所有红色点} $$ 召回率越高,代表我们尽量捕捉出了越多的少数类,召回率越低,代表我们没有捕捉出足够的少数类。

(y[y == clf.predict(X)] == 1).sum()/(y == 1).sum()
# 这里分子和精确度是一样的
---
0.6

(y[y == wclf.predict(X)] == 1).sum()/(y == 1).sum()
---
1.0

可以看出,做样本平衡之前,我们只成功捕获了60%左右的少数类点,而做了样本平衡之后的模型,捕捉出了100%的少数类点 从图像上来看,我们的红色决策边界的确捕捉出了全部的少数类,而灰色决策边界只捕捉到了一半左右。召回率可以帮助我们判断,我们是否捕捉除了全部的少数类,所以又叫做查全率。

如果我们希望不计一切代价,找出少数类(比如找出潜在犯罪者的例子),那我们就会追求高召回率,相反如果我们的目标不是尽量捕获少数类,那我们就不需要在意召回率。

个人理解 精确度是把所有认为是坏人的人都抓起来,其中真正是坏人的概率 召回率是每一个坏人被抓住的概率

F1 score

注意召回率和精确度的分子是相同的(都是11),只是分母不同。而召回率和精确度是此消彼长的,两者之间的平衡代表了捕捉少数类的需求和尽量不要误伤多数类的需求的平衡。究竟要偏向于哪一方,取决于我们的业务需求:究竟是误伤多数类的成本更高,还是无法捕捉少数类的代价更高。 为了同时兼顾精确度和召回率,我们创造了两者的调和平均数作为考量两者平衡的综合性指标,称之为F1 measure。两个数之间的调和平均倾向于靠近两个数中比较小的那一个数,因此我们追求尽量高的F1 measure,能够保证我们的精确度和召回率都比较高。F1 measure在$[0,1]$之间分布,越接近1越好。 $$ F_{measure}=\frac{2}{\frac{1}{Precision}+ \frac{1}{Recall}}=\frac{2\times Precision \times Recall}{Precision+Recall} $$

从Recall延申出来的另一个评估指标叫做假负率(False Negative Rate),它等于$1 - Recall$,用于衡量所有真实为1的样本中,被我们错误判断为0的,通常用得不多。 $$FNR=\frac{10}{11+10}$$

判错多数类的考量

特异度Specificity(真负率True Negative Rate)

详解支持向量机-SVC的模型评估指标【菜菜的sklearn课堂笔记】

$$ Specificity=\frac{00}{01+00} $$ 特异度(Specificity)表示所有真实为0的样本中,被正确预测为0的样本所占的比例。 在支持向量机中,可以形象地表示为 $$ \frac{决策边界下方紫色点}{所有紫色点} $$

(y[y == clf.predict(X)] == 0).sum()/(y == 0).sum()
---
0.976

(y[y == wclf.predict(X)] == 0).sum()/(y == 0).sum()
---
0.904

特异度衡量了一个模型将多数类判断正确的能力

假正率False Positive Rate

$1 - Specificity$就是一个模型将多数类判断错误的能力,这种能力被计算如下,并叫做假正率(False Positive Rate): $$ FPR=\frac{01}{01+00} $$ 在支持向量机中,假正率就是 $$ \frac{决策边界上方紫色点}{所有紫色点} $$ 根据我们之前在Precision处的分析,其实可以看得出来,当样本均衡过后,假正率会更高,因为有更多紫色点被判断错误,而样本均衡之前,假正率比较低,被判错的紫色点比较少。所以假正率其实类似于Precision的反向指标, Precision衡量有多少少数点被判断正确,而假正率FPR衡量有多少多数点被判断错误,性质是十分类似的。