Sklearn_工具--3SKlearn中的模型选择体系--四.SKlearn模型选择之模型评估方法--3.使用sklearn.metric中的性能度量函数

四.SKlearn模型选择之模型评估方法

在这里插入图片描述

3.使用sklearn.metrics中的性能度量函数

在这里插入图片描述

3.1sklearn分类器性能指标

在这里插入图片描述
划分方法1

sklearn.metrics中的分类器性能指标根据适用情况不同,可以分为3个大类:

AUC:Area under curve曲线下的面积

在这里插入图片描述
在这里插入图片描述

如何将二元分类指标拓展到多类或多标签问题中去?

在这里插入图片描述
划分方法2

sklearn.metrics中的分类器性能指标可以分为以下几类:
精确度-召回率-F度量,损失函数,接收机操作曲线--只能做二分类,杰卡德指数(相似性系数)--可用于多分类,MCC指标(相关性系数)-只能做二分类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1.1SKLearn分类器评估标准1–准确率和混淆矩阵
  1. 准确率
normalize=False,normalize赋值为False就不归一化,归一化是用总的样本量来归一化的,不归一化返回的是被正确分类的样本数量。

在多标签分类任务中,每一个样本的标签是一个集合;在单标签分类任务中,每一个样本只有一个标签,是一个标量。

公式的意思是:如果^yi=yi,则返回1;如果不相等,则返回0.

在这里插入图片描述

上面的例子中,accuracy_score(y_true,y_pred)=0.5,是按照比例计算的,共有4个样本,2个样本预测正确,则准确率为1/2.
accuracy_score(y_true,y_pred,normalize=False),normalize=False不标准化,则返回样本预测正确的数量。
  1. 混淆矩阵
    在这里插入图片描述
混淆表,也叫混淆矩阵。

Accuracy是一个不可靠的分类器性能度量标准。当数据集中不同类别的样本数量分布不平衡时,会产生误导人的结果。

如下面例子中,尽管分类器的Accuracy非常高,但是在劣势类上,分类器的正确率非常低。
下面例子中是对于猫的混淆表,而对于狗的混淆表也可以写出来,这样有两个混淆表,所以最终的table of confusion是把所有类的table of confusion平均组合起来的结果。

Table of confusion中,对角线TP+TN加起来就是预测为正确的总数,对角线FP+FN就是预测为错误的总数。

在这里插入图片描述
在这里插入图片描述
举例说明

漏检率要降到一定程度,虚警率也要下降.击中率,正确拒绝率。

在这里插入图片描述

  1. sklearn.metrics.confusion_matrix混淆矩阵函数
y_true,真正的目标响应,其实就是列标签。

在这里插入图片描述

上面例子中:
例子1,数字共有3类,所以是3*3矩阵。行表示三类观测值,3各类别0,1,2真实的数量,列表示三类预测值,对应于观测值,三类预测值分别是多少。
例子2也是三类,所以也是3*3矩阵。
3.1.2SKLearn分类器评估标准2–Precision-Recall-Fscore精确率/召回率/F度量

在这里插入图片描述

召回率又叫做查全率。
F1_score是把上面的precision score和recall score结合起来,形成了一个单独的指标。

在这里插入图片描述

precision_recall_curve:曲线的横坐标是recall,纵坐标是precision。
  1. 基本概念:什么是精确度,召回率,F度量
底下是一个列行表,列和行要结合起来看。

在这里插入图片描述

Positive Predictive Value(PPV):正样本预测值。即分类器中挑出来的正样本中是真正正样本的比例,也叫精度Precision或hit击中率。
True Positive Rate(TPR):真正的正样本被分类正确的比例。又叫做灵敏度Sensitivity.在分类器中一般叫做Recall查全率,召回率。
False Positive Rate(FRS):虚警率。
False Negative Rate:漏检率Miss Rate,灵敏度不够高的话,漏检率就会高。

在这里插入图片描述

P:真正的正样本的数量。
N:真正的负样本的数量
TP:分类器挑选出来的正样本的数量,with hit击中,把正样本成功挑选出来就是击中
TN:with correct rejection把负样本成功拒绝掉,
FP:分类器错误地把负样本预测为正样本,虚警率。
FN:分类器错误地把正样本预测为负样本。漏检率

下面同一个比率不同的称呼是在不同的行业中用的

在这里插入图片描述
在这里插入图片描述

  1. 二元分类问题
    在这里插入图片描述
precision和recall一开始就是用来度量二元分类问题的性能的。
precision,是被预测的值,(真正的正样本数--即预测值是正样本,本身也是正样本)/(被预测的正样本总数)
recall又叫查全率。即全部的正样本。(预测值是正样本,本身也是正样本)/(真实的正样本数)
fbeta_score是precision和recall的调和均值,
不断改变beta值,beta值从小到大改变,fbeta_score则从大到小改变。
fbeta_score值越大,说明fbeta_score值越靠近precision_score,调和均值fbeta_score是大于recall小于precision,是在两者之间的某个取值。两者权重一样时,为0.66,beta越小则越看重precision的性能,而降低recall的性能。beta越大,则越看重recall的性能。

举例说明
在这里插入图片描述

precision_recall_curve()返回值有3个,precision,recall,threshold(阈值).
precision_recall_curve()就是在阈值不断变化时,阈值threshold每次变化时都会有一个点对,点对就是precision和recall的值,将点对挪到坐标系上以后就会得到曲线,
3.1.3如何将二元分类指标拓展到多类或多标签问题中?
  1. 理论
    在这里插入图片描述
如何将这些指标扩展到多类多标签问题?
将多类分类问题视为多个二元分类问题的集合,并对数据集也做相应的划分。
然后分别计算这些子分类问题的二元指标,并将所有子分类问题上的得分值平均起来。
根据平均方式的不同,我们有五种选择。通过设置average参数来选择一种平均方式。

在这里插入图片描述

本来F-score是precision和recall的调和均值,调和均值F-score应该也是在这两者之间的,但是用weighted平均方式就会产生不在precision和recall之间的F-score。

在这里插入图片描述

以上几种加权方式的定义:
micro是:
samples是s:s是样本的数量
macro:是用标签数量加权

  1. 应用
    在这里插入图片描述
precision_score可以传入任意一个平均参数,average=.
在多类多标签时候,把一个类看成正类,把其他类看做负类,来计算precision,所有类都这样做,那么最后计算完之后,共有三个类就会产生三个precision,折三个precision通过不同加权方式组合起来就会产生最终的precision。
recall和f1_score也是这样计算的。f_beta_score还多了一个beta参数。
这就是在多类多标签里面,精确度-召回率-F度量如何去评估。
  1. Classification Report
自己手动去调用计算precision,recall,F1,或F_beta的值,会比较啰嗦,所以sklearn就给我们提供了Classification_Report()函数,来建立一个文本报告来展示分类器的主要指标。
Classification Report就提供了三个指标,precision,recall,F度量。

下面例子中:
y_true:真实的标签集合
y_pred:预测的标签集合
target_names:所有类标签
Classification Report(),第一个参数是真正的类标签,第二个参数是预测标签,第三个参数是所有类标签。
最后打印出来的报告:
每一行是一个类。将其看做是二分类问题,这里共有三个类,我把class 0看做是正类时,下面的class 1class 2就是负类,相应的,样本也要归到一处去,这样class 0相对于其他类的精确率是0.67,recall是1,f1_score是0.8,support是支撑集,即支撑我做出这个评估用了多少样本,显然y_true中第0类有2个样本。
现在要计算class 1类的precision,recall,f1_score,那就把class 1当做正类,其他的当做负类,y_true中的calss 1只有一个样本。
最后根据加权平均方法把底下的avg/total计算出来。suppport最底下是总的样本数量。
所以直接调用classification_report就可以直接把precision,recall,f1_score三个值给计算出来,不用再去分别调用precision,recall,f1_score这三个函数。

在这里插入图片描述

3.1.4SKLearn分类器评估标准3-ROC曲线
  1. ROC是什么
discrimination是辨别能力,discrimination threshold分类器的辨别阈值变化时候ROC曲线是如何变化的。
底下是ROC曲线的一个典型的图。
TRP(true positive rate)真正率,也叫灵敏度,recall。
FRP(false positive rate)假正率,也叫虚警率。
ROC曲线就是灵敏度关于虚警率的函数。

在这里插入图片描述
在这里插入图片描述

ROC究竟是什么?为什么会这么广泛的使用?

在这里插入图片描述
在这里插入图片描述

目标是:既要有高的灵敏度,还不能随便乱报警(不能有太高的虚警率),即希望TPR越高越好,FPR越低越好,

在这里插入图片描述
在这里插入图片描述

一个一直坏的分类器的预测输出可以通过反转预测输出变成一个好的分类器。
比如说一个预测男女 的分类器,原本总是把男的预测为女的,把女的预测为男的,那么我们将该分类器反转一下,就变为一个好的分类器了。
所以说,没有严格坏的分类器,如果是坏的分类器,镜像对称一下,就变为好的分类器了。

在这里插入图片描述

  1. ROC曲线是如何画出来的
在二元分类问题中,每个样本实例的类别预测通常是基于一个连续的随机变量X做出的。
比如说,要判断男人和女人。量一下头发的长度,头发长度就是连续的随机变量,头发长度大于10的是女的,头发长度小于10的就是女的。
这个X可以是多维的,比如三维,臀围,腰围,身高,体重这些。这样就是一个随机向量了。

如果样本确实是positive类的,随机变量X服从f1(x)的分布,如果样本是negative类的,随机变量X服从f0(x)的分布。
比如,男人属于positive类,女人属于negative类,男人的三围和女人的三围整体上的分布肯定是不一样的,所以随机变量X属于不同类的时候,x的分布也是不一样的。有可能头发长度和胸围都是高斯分布,男人的高斯分布的均值就小一点,女人的高斯分布的均值就大一点。所以说他们的分布是不一样的。

计算公式:都是从阈值T开始往上走的,因为真正率就是如果X>T,把样本分为正类,所以从T开始积分到无穷,然后把f1(x)概率分布给积分出来,这就是他的真正率。
假正率也是从T开始,但是积分函数就变成了f0(x),negative类了,因为我们已经知道X本身就是个负类,负类服从f0(x)的分布,但是我们把负类判断成了正类,所以要从T开始给他计算。 

要注意积分上下限和里面的函数的关系。

在这里插入图片描述

下面例子中:
病人是正样本,正常人是负样本。
图中的竖线就是阈值。
调整图中的阈值竖线,将竖线往右移动,FP减少,TN增多,FN增多。
ROC曲线的实际形状就是由TP正态分布曲线和TN正态分布曲线的交叠面积处。

https://kennis-research.shinyapps.io/ROC-CURVES/
在网站上
控制均值和方差可以调整TP正态分布曲线和TN正态分布曲线的形态,在每种分布形态下都会对应一个ROC曲线,会计算ROC曲线下面的面积。
Parameters Table就是统计出来的值。
红线就是随机猜测的结果。
mean:正态分布的均值,SD:正态分布的方差,Cutoff:阈值竖线

在这里插入图片描述
在这里插入图片描述

  1. AUC–ROC曲线下的面积
AUC--ROC曲线下的面积是如何计算出来的?
就是将曲线积分一下。
下图中三条曲线是不同分类器。三条曲线交叠在一起,不好判断哪个分类器更好。但是我们知道这些曲线,越靠近左边那条线的点肯定是越好的,越靠近左边哪个店,曲线右下面的面积就越大。
所以,AUC就是把这条曲线给积分一下,变成一个值,

在这里插入图片描述

现在的机器学习研究中,常用AUC--ROC统计值来比较不同的学习器模型。给他排序,AUC的值越大,模型越好。如果到了左上角(0,1)位置,那就是一个完美的分类器了。有最小的虚警率和最高的灵敏度。

在这里插入图片描述

  1. sklearn.metrics.roc-curve
如果类别标签不是二元分类的,有3个或4个标签,那么pos_label就显示哪个标签是正样本。
roc_curve把多分类问题看做是二分类问题,所以pos_label是在多类分类时指定将哪个样本看做是正样本,就把哪个作为正标签传进去。
y_score是预测的目标得分,可以是估计出来的概率,也可以是置信confidence value,还可以是非阈值化的测量,决策函数中的一个。
sample_weight不常用。
drop_intermediate是0.17后的版本加入的:表示是否要丢掉一些次优的阈值,将不会再ROC曲线上显示。尤其是在创建比较小的ROC曲线时比较有用。
如果阈值划分的特别细密的话,这条曲线看起来波动会很大。

返回值:
这个函数本身是不会划线的。划线要调用matplotlib,这个函数只是返回x轴和y轴上的取值。然后根据这些返回的坐标点把这个曲线给绘制出来。
三个返回值:fpr,假正率,不断增长。tpr,真正率,也在增长。thresholds,阈值,不断降低阈值在用来计算fpr和tpr的阈值的决策函数中。第0个阈值表达了没有样本的预测。

在这里插入图片描述
如何调用的-举例说明

y,是类别标签,共有4个样本,2类,类标签分别是12.
scores,得分,比如说,分类器是贝叶斯分类给出的概率,第一个样本属于第一类的得分是0.1。
将2个参数传进去,pos_label=2,指明正样本标签是2,第二类,
有了fpr和tpr,thresholds,roc_curve曲线就可以画出来。
还可以根据这个曲线来求取AUC,area under the curve,曲线下的面积,

在这里插入图片描述

AUC,area under the curve,曲线下的面积这样算;
roc_auc_score

在这里插入图片描述

3.1.5SKLearn分类器评估标准4-各种分类损失函数
  1. 损失函数是干什么的
    在这里插入图片描述
风险函数是在若干样本上,所有样本上的不一致程度的平均。

对下面公式的解释:
X是特征向量空间,Y是输出空间:可以是类标签集合也可以是回归响应的空间,X,Y就是两个随机变量之间的联合概率分布,针对每一个联合概率分布中的每一个点,都有一个损失。把这个损失用概率加权以后就是期望损失。
学习的目标是使得期望损失最小化。
P(X,Y)是未知的,即针对数据集的联合分布是未知的,所以Rexp(f)无法计算。
我们对(X,Y)数据集进行采样,独立同分布进行采样,采样n个样本,以部分来观察整体。采样完得到数据集的不同数据点,在不同数据点上训练经验模型,经验模型就会有经验风险或经验损失。
经验风险/经验损失:有n个样本,每个样本上都会有一个损失,所有样本的平均损失。
根据大数定律,用经验风险来估计期望风险。
我们要最小化经验风险函数,N是知道的,要知道L的具体形式,L的具体形式就是今天要解决的问题。
这就是为什么我们需要这个损失函数,就是因为在经验风险中有这样一个需求。

在这里插入图片描述

  1. 分类器常用的损失函数
Squae Loss不常用,在回归问题中常用。
参考:http://en.wikipedia.org/wiki/Loss functions for classification

在这里插入图片描述

1,0-1损失(0-1 loss function):
预测正确时没有损失,是0,预测错误时就积累一个损失。
2,平方损失(quandratic loss function)
人为地给标签添加了权重,预测不同类标签就带来不同损失,但是分类中的标签没有权重的意义。因而,一般应用在回归问题中。
3,Hinge损失:
预测正确的话,结果为1;预测错误的话,由于预测标签的不同,所得值会出现线性变化。
4,逻辑斯第损失:
一般yongzailogistic回归分类中,在官方文档中,也叫作对数损失。
5,对数损失或交叉熵损失:

在这里插入图片描述
Zero-One Loss
在这里插入图片描述
Hinge Loss

Hinge Loss通常用于最大间隔分类器,比如支持向量机(support vector machine)
在支持向量机中,有权重和偏置。简单的支持向量机是一个ws+b=0这样一个线性判别函数,

在这里插入图片描述

底下例子中:
X有两个样本,[0],[1].对应的真实标签[0]——-1[1]——1.
声明一个svm.LinearSVC线性分类器对象,然后在X,Y上拟合C线性分类器,拟合完之后调用est.decision_function,因为是线性支持向量机,其实就是做了一个y=wx+b这样一个线性预测,然后在
decision_function中传入三个样本,这三个样本就会预测输出pref_decision。
将预测输出pred_decision和真实的类标签传入损失函数hinge_loss(),计算出结果。
Hinge Loss主要就用在svm分类器中。

在这里插入图片描述
在这里插入图片描述
重点
对数损失Log Loss或交叉熵损失Cross-entropy Loss

交叉熵损失现在在深度学习中用得多。神经网络中都会用交叉熵损失来计算损失。
前面的损失函数都是在比较标签是否先等,对数损失在比较概率分布是否一致。

在这里插入图片描述

下面例子中:

在这里插入图片描述
Hamming Loss

距离就是,

在这里插入图片描述

3.2sklearn回归器性能评估方法

什么是多目标回归问题:
比如说我要回归股票市场的问题,目标变量有2个,一个是股票价格一个是股票交易量。
这两个目标作为函数,可以是任意市场活跃度,k线,根据这两个来估计股票价格和股票交易量。
针对每一个目标都会有一个预测。
单个目标的预测都会有一个损失,最后这个损失如何将其平均起来,这个就是multioutput要做的事情。

在这里插入图片描述

variance_weighted,方差加权参数。

在这里插入图片描述
sklearn.metrics.explained_variance_score

下面例子中:
第二个例子:
Y_true,Y_pred,是两个list,每个list中又套了一个小list。相当于两个目标变量的回归问题。
multioutput='raw_values',会对每一个目标响应都做一个解释方差的计算。
传入multioutpu=[0.3,0.7],是一个列表,列表中加起来是1,就是加权,相当于给第二个目标损失值加了一个0.7,更看重第二个损失。原来没有加权时结果为[0.967...,1..],加权0.7之后,输出越靠近1.
如果反过来,写为multioutpu=[0.7,0.3],输出会越接近0.967.就是在[0.967...,1..]中间摇摆。
这就是多变量回归问题的加权损失。解释方差的加权损失得分。

在这里插入图片描述
sklearn.metrics.mean_absolute_error

如果是多变量,默认请款下是将其做均匀加权。
输入,multioutpu默认是'uniform_average',如果是多变量回归也可以传入加权list.
输出一个loss,如果是均匀加权uniform_average或非均匀加权,输出一个float值,如果传入一个multioutpu='raw_values',返回一个np.array。

下面例子中:
第一个例子是单变量回归问题。
第二个是2变量回归问题:
先把每一个变量组的第一个变量的MAE计算出来,再计算出第二个变量的。然后再计算两者的,如果不指定multioutpu,那就是均匀加权的。

在这里插入图片描述
sklearn.metrics.mean_squared_error

均方误差是在回归中用得最多的。
上面的mean_absolute_error平均绝对损失有一个缺点,他是分段线性的,要对其求导的话,要分成yi>yi^还是yi<yi^,不方便。
但是,均方误差可以直接求导。
均方误差也可以用到多变量回归中。

在这里插入图片描述
sklearn.metrics.median_absolue_error

中值绝对误差。
前面的平均绝对损失和均方损失,他们的值会被某些预测的异常值点给坏掉。本来其他店预测得挺好,因为某一个点给破坏掉。
median_absolue_error对outliers异常值点很robust。
将每一个样本点上的预测拿出来,将他们排序,将最中间的那个取出来作为MedAE,如果是偶数个,就将最中间两个加起来除以2.

在这里插入图片描述
sklearn.metrics.r2_score

determination是行列式。
前面的方法都是评估当前时刻的预测的误差。
而在股票市场中,最感兴趣的是对未来的误差。未来的误差才是真正决定损失的。

下面的公式中:
--y是预测响应的均值。
最大值是1,最小值可以小于0.

下面例子中:
第一个是单目标回归。
multioutput=variance_weighted,是用输出方差进行加权的。
多变量回归时是用输出方差进行加权的。也就是说,根据每一个预测的方差对每一个预测结果的得分进行加权。
也可以指定multioutput=uniform_average均匀加权,
multioutput=raw_values,把每一个目标的预测损失的得分都打印出来。

在这里插入图片描述

五.内容梳理

Model persistence,将训练好的模型保存下来的工具。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值