机器学习:评估指标

在这里对常用的指标进行一个简单的学习,便于后期自己复习查看。

机器学习评估指标在sklearn官网也讲解了一部分,可以结合 官网解释

以及其他大神的相关博客内容,一起学习这些内容。

1 概述

对于一个模型结果,无论是回归还是分类问题,都需要一个评估指标来衡量模型的优劣,即通过评估指标来反馈模型效果,通过不断地改进模型,直到达到理想的准确度(指标值)。

在诸多的评估指标中,大部分指标只能片面地反映模型的一部分性能。如果不能合理地运用评估指标,不仅不能发现模型本身的问题,而且会得出错误的结论。


在学习评估指标之前,我还总结了一些其他知识,一起学习

1.1 泛化误差与经验误差

模型能够拟合新的数据称为模型的泛化能力
在这里插入图片描述
这里,我想引用知乎上一位大神对泛化误差的解释:
什么是泛化误差(Generalization error)?

作者:Ken Ling
链接:https://www.zhihu.com/question/22944553/answer/92312143
来源:知乎

泛化误差(Generalization Error)即真实情况下模型的误差。

机器学习里的模型一般是针对一个问题设计的,这个问题会有一个数据总体,包括所有可能的情况,比如研究对象是全国人的数据,全国人的数据就是一个总体。

模型先经过训练再测试,都需要数据,就分别叫训练数据与测试数据。往往总体数据量很大,甚至是无法穷尽的,所以不可能把所有数据都用到,一般都是从总体里抽取一部分作为代表。模型在测试数据上测试,会得到一个误差,叫测试误差。但其实我们真正想要的是模型在总体上的误差,这就是泛化误差。而测试误差因为采样的关系,与泛化误差是有偏差的。

此外,泛化误差也叫out of sample error,这是相对于in sample error讲的。in sample error是指模型在训练数据集上的误差。

学习算法的泛化误差可以分解为三个部分:

  • 偏差(Bias),
  • 方差(Variance)
  • 噪声(Noise)

在估计学习算法性能的过程中,主要关注偏差与方差.因为噪声属于不可约减的误差。

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


1.2 过拟合与欠拟合

过拟合与欠拟合问题

过拟合(overfitting)——学习器把训练样本学得“太好了”,以至于对测试样本“不知所措”

即在统计模型中,由于使用的参数过多而导致模型对观测数据(训练数据)过度拟合,以至于用该模型来预测其他测试样本输出的时候与实际输出或者期望值相差很大的现象。

==

模型过于复杂,把噪声数据的特征也学习到模型中,导致模型泛化能力下降,在后期应用过程中很容易输出错误的预测结果。


欠拟合(underfitting)则刚好相反——学习器"hold不住"训练样本

即由于统计模型使用的参数过少,以至于得到的模型难以拟合观测数据(训练数据)的现象。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

图片来源:百度图片

导致模型过拟合的情况有很多种原因,其中最为常见的情况是模型复杂度太高,导致模型学习到了训练数据的方方面面,学习到了一些细枝末节的规律。

欠拟合由模型复杂度较高或模型未训练完全导致的,解决方案很简单:增加模型的复杂度或者增加模型的训练轮数。

====
引用《百面机器学习》

降低“过拟合”的方法

(1)从数据入手,获得更多的训练数据。比如可以通过一定的规则来扩充训练数据

(2)降低模型复杂度。例如,在神经网络模型中减少网络层数、神经元个数等;在决策树模型中降低树的深度、进行剪枝等。

(3)正则化方法。给模型的参数加上一定的正则约束,比如将权值的大小加入到损失函数中。以L2正则化为例:
C = C 0 + λ 2 n ⋅ ∑ i w i 2 C=C_{0}+\frac{\lambda}{2 n} \cdot \sum_{i} w_{i}^{2} C=C0+2nλiwi2

这样,在优化原来的目标函数 C 0 C_0 C0的同时,也能避免权值过大带来的过拟合风险。

(4)集成学习方法。集成学习是把多个模型集成在一起,来降低单一模型的过拟合风险,如Bagging方法。

降低“欠拟合”的方法
在这里插入图片描述


1.3 鲁棒性

鲁棒是Robust的音译,也就是健壮和强壮的意思。它也是在异常和危险情况下系统生存的能力。

或者说

鲁棒性常被用来描述可以面对复杂适应系统的能力

2 回归问题(Regression)评价指标

前言

在实际中,如果只从单一的评估指标出发去评估模型,往往会得出片面甚至错误的结论;只有通过一组互补的指标去评估模型,才能更好地发现并解决模型存在的问题,从而更好地解决实际业务场景中遇到的问题。


假设 y i y_i yi 是第 i i i 个样本的真实值, y i y_i yi 是对第 i i i 个样本的预测值。

2.1 R 2 R^2 R2拟合优度

R2 又称可决系数,是多元回归中的回归平方和占总平方和的比例,它是度量多元回归方程中拟合程度的一个统计量,反映了在因变量 y 的变差中被估计的回归方程所解释的比例。


在这里插入图片描述

∑ ( Y i − Y ˉ ) 2 = ∑ ( Y ^ i − Y ˉ ) 2 + ∑ ( Y i − Y ^ i ) 2 \sum{\left( Y_i-\bar{Y} \right) ^2}=\sum{\left( \hat{Y}_i-\bar{Y} \right)}^2+\sum{\left( Y_i-\hat{Y}_i \right) ^2} (YiYˉ)2=(Y^iYˉ)2+(YiY^i)2
定义可决系数为:
R 2 = S S R S S T = 1 − S S E S S T R^2=\frac{SSR}{SST}=1-\frac{SSE}{SST} R2=SSTSSR=1SSTSSE
也即
R 2 = ∑ i = 1 n ( Y ^ i − Y ˉ ) 2 ∑ i = 1 n ( Y i − Y ˉ ) 2 = 1 − ∑ i = 1 n ( Y i − Y ^ ) 2 ∑ i = 1 n ( Y i − Y ˉ ) 2 R^2=\frac{\sum_{i=1}^n{\left( \hat{Y}_i-\bar{Y} \right) ^2}}{\sum_{i=1}^n{\left( Y_i-\bar{Y} \right) ^2}}=1-\frac{\sum_{i=1}^n{\left( Y_i-\hat{Y} \right) ^2}}{\sum_{i=1}^n{\left( Y_i-\bar{Y} \right) ^2}} R2=i=1n(YiYˉ)2i=1n(Y^iYˉ)2=1i=1n(YiYˉ)2i=1n(YiY^)2

R 2 R^2 R2 作为检验模型拟合优度的指标, 取值范围在[0,1]之间。 R 2 ( 0 ≤ R 2 ≤ 1 ) R^2\left( 0\le R^2\le 1 \right) R2(0R21)越趋近于1,表示表明回归平方和占总平方和的比例越大,用 x x x的变化来解释 y y y值变差的部分就越多,实际值与预测值拟合的越好;反之,越靠近0,说明拟合程度越差。

from sklearn.metrics import r2_score 
r2_score(y_true, y_pred, sample_weight=None, multioutput='uniform_average')

10折交叉验证

n_splits = 10
seed = 7
kfold = KFold(n_splits=n_splits, random_state=seed)
model = LinearRegression()
scoring = 'r2'
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print('R2: %.3f (%.3f)' % (result.mean(), result.std()))

2.2 平均误差ME

M E = ∑ i = 1 n ( y i − y ^ i ) n ME=\frac{\sum\limits_{i=1}^n{\left( y_i-\hat{y}_i \right)}}{n} ME=ni=1n(yiy^i)

2.3 平均绝对误差MAE

平均绝对误差(mean_absolute_error)是所有单个观测值与算术平均值的偏差的绝对值的平均值。

与平均误差相比,平均绝对误差由于离差被绝对值化,不会出现正负相抵消的情况,因而,平均绝对误差能更好地反映预测值误差的实际情况。

M A E = ∑ i = 1 n ∣ y i − y ^ i ∣ n MAE=\frac{\sum\limits_{i=1}^n{\left| y_i-\hat{y}_i \right|}}{n} MAE=ni=1nyiy^i
平均绝对误差能很好地反映预测值误差的实际情况

from sklearn.metrics import mean_absolute_error
mean_absolute_error(
		y_true, 
		y_pred, 
		sample_weight=None,
		multioutput='uniform_average')

10折交叉验证

n_splits = 10
seed = 7
kfold = KFold(n_splits=n_splits, random_state=seed)
model = LinearRegression()
scoring = 'neg_mean_absolute_error'
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print('MAE: %.3f (%.3f)' % (result.mean(), result.std()))

模型使用MAE作为损失函数则是对数据分布的中值进行拟合。某些模型(如XGBoost)必须要求损失函数有二阶导数,所以不能直接优化MAE。

加权平均绝对误差(WMAE)是基于MAE的变种评估指标,对每条样本考虑不同的权重,比如考虑时间因素,离当前时间越久的样本权重越低。其计算公式为:

W M A E = 1 n ⋅ ∑ i = 1 n w i ∣ y i − y ^ i ∣ \mathrm{WMAE}=\frac{1}{n} \cdot \sum_{i=1}^{n} w_{i}\left|y_{i}-\hat{y}_i\right| WMAE=n1i=1nwiyiy^i

2.4 平均相对误差MPE

M P E = 1 n ∑ i = 1 n y i − y ^ i y i MPE=\frac{1}{n}\sum\limits_{i=1}^n{\frac{y_i-\hat{y}_i}{y_i}} MPE=n1i=1nyiyiy^i

2.5 平均相对误差绝对值MAPE

MAPE对每个误差进行了归一化
M A P E = 1 n ∑ i = 1 n ∣ y i − y ^ i y i ∣ MAPE=\frac{1}{n}\sum\limits_{i=1}^n{\left| \frac{y_i-\hat{y}_i}{y_i} \right|} MAPE=n1i=1nyiyiy^i

引用:《美团机器学习实战》
MAPE通过计算绝对误差百分比来表示预测效果,其取值越小越好。如果MAPE=10,这表示预测平均偏离真实值10%。MAPE计算与量纲无关,因此在特定场景下不同问题具有一定可比性。MAPE的缺点也比较明显,在 y i = 0 y_i=0 yi=0 处无定义,并且如果 y i y_i yi 接近0可能导致MAPE大于100%。而且,MAPE对负值误差的惩罚大于正值误差。基于这些缺点也有一些改进的评价指标,如MASE、SMAPE、MDA。

2.6 均方误差MSE

均方误差MSE(Mean Squared Error)即预测误差的方差,又被称为 L2范数损失,是指参数估计值与参数真值之差平方的期望值
M S E = ∑ i = 1 n e i 2 n = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 MSE=\frac{\sum\limits_{i=1}^n{e_i^2}}{n}=\frac{1}{n}\sum\limits_{i=1}^n{\text{(}y_i-\hat{y}_i}\text{)}^2 MSE=ni=1nei2=n1i=1n(yiy^i)2

MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。

from sklearn.metrics import mean_squared_error
mean_squared_error(
		y_true,
		y_pred, 
		sample_weight=None, 
		multioutput='uniform_average')

10折交叉验证

n_splits = 10
seed = 7
kfold = KFold(n_splits=n_splits, random_state=seed)
model = LinearRegression()
scoring = 'neg_mean_squared_error'
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print('MSE: %.3f (%.3f)' % (result.mean(), result.std()))

sklearn在计算模型评估指标的时候,会考虑指标本身的性质,均方误差本身是一种误差,所以被sklearn划分为模型的一种损失(loss)。在sklearn当中,所有的损失都使用负数表示,因此均方误差也被显示为负数了。真正的均方误差MSE的数值,其实就是neg_mean_squared_error去掉负号的数字。

2.7 均方根误差RMSE

由于MSE与我们的目标变量的量纲不一致,为了保证量纲一致性,我们需要对MSE进行开方 。

均方根误差(Root Mean Squared Error)即预测误差的标准差,又叫标准误差,是回归问题中最常用的评估指标。

R M S E = ∑ i = 1 n e i 2 n = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 RMSE=\sqrt{\frac{\sum\limits_{i=1}^n{e_i^2}}{n}}=\sqrt{\frac{1}{n}\sum\limits_{i=1}^n{\text{(}y_i-\hat{y}_i}\text{)}^2} RMSE=ni=1nei2 =n1i=1n(yiy^i)2
如果样本中有严重的离群点,则该指标效果受影响。

在实际问题中,如果存在个别偏离程度非常大的离群点(Outlier)时,即使离群点数量非常少,也会让RMSE指标变得很差。

RMSE受到异常值的影响很大,与平均绝对误差MAE相比,RMSE对大误差样本有更大的惩罚。

因此,在使用此指标之前

如果认定这些异常值点或称离群值点是“噪声点”的话,就需要在数据预处理的阶段把这些噪声点过滤掉。

如果不认为这些离群点是“噪声点”的话,就需要进一步提高模型的预测能力,将离群点产生的机制建模进去。

再或者,可以找一个更合适的指标来评估该模型,例如比RMSE的鲁棒性更好的指标——平均绝对百分比误差(MAPE),相比RMSE,MAPE相当于把每个点的误差进行了归一化,降低了个别离群点带来的绝对误差的影响。
(引用《百面机器学习》)

2.8 归一化均方根误差NRMSE

归一化的均方误差是将均方的表达式经过变换,化为无量纲的表达式,成为标量

N R M S E = R M S E y max ⁡ − y min ⁡ NRMSE=\frac{RMSE}{y_{\max}-y_{\min}} NRMSE=ymaxyminRMSE

2.9 解释方差explained_variance_score

解释方差是根据误差的方差计算得到的:
exp ⁡ l a i n e d _ v a r i a n c e ( y , y ^ ) = 1 − V a r ( y − y ^ ) V a r ( y ) \exp lained\_variance\left( y,\hat{y} \right) =1-\frac{Var\left( y-\hat{y} \right)}{Var\left( y \right)} explained_variance(y,y^)=1Var(y)Var(yy^)

explained_variance_score:解释回归模型的方差得分,其值取值范围是[0,1],越接近于1说明自变量越能解释因变量的方差变化,值越小则说明效果越差。

python笔记:sklearn r2_score和explained_variance_score的本质区别是什么?

2.10 sklearn中回归模型常用指标

在这里插入图片描述

引:sklearn实践之——计算回归模型的四大评价指标(explained_variance_score、mean_absolute_error、mean_squared_error、r2_score)

from sklearn.metrics import explained_variance_score, mean_absolute_error, mean_squared_error, r2_score
 
def calPerformance(y_true,y_pred):
    '''
    模型效果指标评估
    y_true:真实的数据值
    y_pred:回归模型预测的数据值
    explained_variance_score:解释回归模型的方差得分,其值取值范围是[0,1],越接近于1说明自变量越能解释因变量
    的方差变化,值越小则说明效果越差。
    mean_absolute_error:平均绝对误差(Mean Absolute Error,MAE),用于评估预测结果和真实数据集的接近程度的程度
    ,其其值越小说明拟合效果越好。
    mean_squared_error:均方差(Mean squared error,MSE),该指标计算的是拟合数据和原始数据对应样本点的误差的
    平方和的均值,其值越小说明拟合效果越好。
    r2_score:判定系数,其含义是也是解释回归模型的方差得分,其值取值范围是[0,1],越接近于1说明自变量越能解释因
    变量的方差变化,值越小则说明效果越差。
    '''
    model_metrics_name=[explained_variance_score, mean_absolute_error, mean_squared_error, r2_score]  
    tmp_list=[]  
    for one in model_metrics_name:  
        tmp_score=one(y_true,y_pred)  
        tmp_list.append(tmp_score)  
    print ['explained_variance_score','mean_absolute_error','mean_squared_error','r2_score']
    print tmp_list
    return tmp_list
 
 # 调用
calPerformance(y_true,y_pred)
def score(y, y_pred):
    model_metrics_name=[explained_variance_score, mean_absolute_error, mean_squared_error, r2_score]  
    models_str = ['explained_variance_score','mean_absolute_error', 'mean_squared_error', 'r2_score']
    tmp_list=[]
    for one in model_metrics_name:  
        #do something with index i
        #do something with element one
        tmp_score=one(y,y_pred)
        tmp_list.append(tmp_score)
    print(pd.DataFrame({'评价指标':models_str,'结果':tmp_list}))

3 分类问题(Classification)评价指标

3.1 二分类指标

3.1.0 不平衡的数据

下面例子来自:https://blog.csdn.net/snail9610/article/details/105925482/

如果在两个类别中,一个类别的出现次数比另一个多很多,那么错误类型将发挥重要作用。例如。我们一共有100个病人,其中99人是健康的(阴性、反类),1人是患癌症的(阳性、正类),那么这种数据集就是不平衡数据集或者具有不平衡类别的数据集。在实际当中,不平衡数据才是常态。

在这个数据集中,我们即使预测得到99%的分类精度,也不代表我们模型的泛化性能就好。有一种可能就是,我们把99个健康的预测正确了,而1个患病的没有预测正确,即其实根本不需要任何机器学习算法,只要系统输出所有人都是健康的,即可达到99%的准确率。也就是说对于不平衡的数据,只使用分类准确度是不能正确衡量其效果的。

3.1.1 混淆矩阵Confusion Matrix

混淆矩阵是二分类问题的多维衡量指标体系,在样本不平衡时极其有用。在混淆矩阵中,我们将少数类认为是正例,多数类认为是负例(反例)。

混淆矩阵是衡量分类型模型准确度中最基本,最直观,计算最简单的方法。

一般的,少数类是1多数类是0

  • TP(True Positive):将正类预测为正类数,真实为0,预测也为0
  • FN(False Negative):将正类预测为负类数,真实为0,预测为1
  • FP(False Positive):将负类预测为正类数, 真实为1,预测为0
  • TN(True Negative):将负类预测为负类数,真实为1,预测也为1

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

在这里插入图片描述

3.1.2 准确率Accuracy

准确率Accuracy就是所有预测正确的所有样本除以总样本,通常来说越接近1越好。
在这里插入图片描述
在这里插入图片描述

斜对角线元素之和除以总数。

针对样本极不平衡的情况,指标的结果由占比大的类别决定。比如多类占比99%,少数类占比1%,这时即使不做训练,直接就可以得出99%的准确度。这是非常不合理的,一般如果一个模型在能够尽量捕获少数类的情况下,还能够尽量对多数类判断正确,则这个模型就非常优秀了。

对于样本不平衡的一种处理方式是设置权重。

3.1.3 精确度Precision

精确度Precision,又叫查准率表示所有被预测为是少数类的样本中,真正的少数类所占的比例
在这里插入图片描述
在这里插入图片描述

在支持向量机中,精确度可以被形象地表示为决策边界上方的所有点中,红色点所占的比例。

  • 精确度越高,代表我们捕捉正确的红色点越多,对少数类的预测越精确。
  • 精确度越低,则代表我们误伤了过多的多数类。

精确度是”将多数类判错后所需付出成本“的衡量。

在这里插入图片描述

精确度可以帮助我们判断,是否每一次对少数类的预测都精确,所以又被称为”查准率“。在现实的样本不平衡例子中,当每一次将多数类判断错误的成本非常高昂的时候(比如大众召回车辆的例子),我们会追求高精确度。精确度越低,我们对多数类的判断就会越错误。

当然了,如果我们的目标是不计一切代价捕获少数类,那我们并不在意精确度。

3.1.4 召回率Recall

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

召回率Recall,又被称为敏感度(sensitivity),真正率,查全率,表示所有真实为1的样本中(少数类),被我们预测正确的样本所占的比例

在支持向量机中,召回率可以被表示为,决策边界上方的所有红色点占全部样本中的红色点的比例。
在这里插入图片描述

  • 召回率越高,代表我们尽量捕捉出了越多的少数类,
  • 召回率越低,代表我们没有捕捉出足够的少数类。

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

注意召回率和精确度的分子是相同的(都是11),只是分母不同。而召回率和精确度是此消彼长的,两者之间的平衡代表了捕捉少数类的需求和尽量不要误伤多数类的需求的平衡。究竟要偏向于哪一方,取决于我们的业务需求:究竟是误伤多数类的成本更高,还是无法捕捉少数类的代价更高。

3.1.5 F值(F-Measure)

为了同时兼顾精确度和召回率创造了两者的调和平均数作为考量两者平衡的综合性指标,称之为F1 measure。两个数之间的调和平均倾向于靠近两个数中比较小的那一个数,因此我们追求尽量高的F1 measure,能够保证精确度和召回率都比较高。F1 measure在[0,1]之间分布,越接近1越好。
在这里插入图片描述

3.1.6 特异度(Specificity)

从Recall延申出来的另一个评估指标叫做假负率(False Negative Rate),它等于 1 - Recall,用于衡量所有真实为1的样本中,被我们错误判断为0的,通常用得不多。
在这里插入图片描述
特异度(Specificity)表示所有真实为0的样本中(多数类),被正确预测为0的样本所占的比例。在支持向量机中,可以形象地表示为,决策边界下方的点占所有紫色点的比例。
在这里插入图片描述

3.1.7 假正率(FPR)

特异度衡量了一个模型将多数类判断正确的能力,而1 - specificity就是一个模型将多数类判断错误的能力,这种能力被计算如下,并叫做假正率(False Positive Rate):

在支持向量机中,假正率就是决策边界上方的紫色点(所有被判断错误的多数类)占所有紫色点的比例。
在这里插入图片描述

根据我们之前在precision处的分析,其实可以看得出来,当样本均衡过后,假正率会更高,因为有更多紫色点被判断错误,而样本均衡之前,假正率比较低,被判错的紫色点比较少。所以假正率其实类似于Precision的反向指标,Precision衡量有多少少数点被判断正确,而假正率FPR衡量有多少多数点被判断错误,性质是十分类似的。


小小总结
在这里插入图片描述
图片来源:混淆矩阵(Confusion Matrix)

3.1.8 ROC曲线及AUC面积

机器学习中几种常见的模型评价指标

在二分类中,我们通常会对每个样本计算一个概率值,再根据概率值判断该样本所属的类别,那么这时就需要设定一个阈值来划定正负类。这个阈值的设定会直接影响到Precision和Recall

例如

逻辑回归的 predict_proba 接口对每个样本生成每个标签类别下的似然(类概率)。对于这些似然,逻辑回归天然规定,当一个样本所对应的这个标签类别下的似然大于0.5的时候,这个样本就被分为这一类。

比如说,一个样本在标签1下的似然是0.6,在标签0下的似然是0.4,则这个样本的标签自然就被分为1。逻辑回归的回归值本身,其实也就是标签1下的似然。在这个过程中,0.5就被称为阈值。

选择不同的阈值,即选择不同位置作为截断点可以得到不同的FPR、FNR、Recall、Precision,这些性能指标是阈值的函数,随着阈值的变化而变化。

ROC曲线,全称The Receiver Operating Characteristic Curve,译为受试者操作特性曲线。这是一条以不同阈值下的假正率FPR为横坐标不同阈值下的召回率Recall为纵坐标的曲线
在这里插入图片描述

ROC这里讲的不错的机器学习中常用的评价指标 | 分类任务、回归任务

ROC曲线不会指定一个固定的阈值,而是会尝试所有可能的阈值(截断点),在每一种可能的阈值下,计算出多对TPR和FPR,并画出曲线。

在这里插入图片描述


假正率FPR衡量多数类被判断错误比例
召回率Recall衡量少数类被判断正确比例

在不同阈值下,我们的模型评估指标会发生变化,我们正利用这一点来观察Recall和FPR之间如何互相影响。但是注意,并不是升高阈值,就一定能够增加或者减少Recall,一切要根据数据的实际分布来进行判断。而要体现阈值的影响,首先必须的得到分类器在少数类下的预测概率。

ROC曲线主要是用于X对Y的预测准确率情况

在支持向量机中,召回率可以被表示为,决策边界上方的所有红色点占全部样本中的红色点的比例

在支持向量机中,假正率就是决策边界上方的紫色点(所有被判断错误的多数类)占所有紫色点的比例

在这里插入图片描述

要绘制ROC曲线,就必须在我们的数据中去不断调节阈值,不断求解混淆矩阵,然后不断获得我们的横坐标和纵坐标,最后才能够将曲线绘制出来。
在这里插入图片描述
阈值个数特别多时,把这些点连起来,就是一条曲线


建立ROC曲线的目的是找寻Recall和FPR之间的平衡,让我们能够衡量模型在尽量捕捉少数类的时候,误伤多数类的情况会如何变化

  • 横坐标是FPR,代表着模型将多数类判断错误的能力,
  • 纵坐标Recall,代表着模型捕捉少数类的能力

所以ROC曲线代表着,随着Recall的不断增加,FPR如何增加。我们希望随着Recall的不断提升,FPR增加得越慢越好,这说明我们可以尽量高效地捕捉出少数类,而不会将很多地多数类判断错误。

所以,我们希望看到的图像是纵坐标急速上升,横坐标缓慢增长,也就是在整个图像左上方的一条弧线。这代表模型的效果很不错,拥有较好的捕获少数类的能力。


中间的虚线代表着,当recall增加1%,FPR也增加1%,也就是说,每捕捉出一个少数类,就会有一个多数类被判错,这种情况下,模型的效果就不好,这种模型捕获少数类的结果,会让许多多数类被误伤,从而增加我们的成本。

ROC曲线通常都是凸型的对于一条凸型ROC曲线来说,曲线越靠近左上角越好,越往下越糟糕,曲线如果在虚线的下方,则证明模型完全无法使用

但是它也有可能是一条凹形的ROC曲线。对于一条凹型ROC曲线来说,应该越靠近右下角越好,凹形曲线代表模型的预测结果与真实情况完全相反,那也不算非常糟糕,只要我们手动将模型的结果逆转,就可以得到一条左上方的弧线了。

最糟糕的就是,无论曲线是凹形还是凸型,曲线位于图像中间,和虚线非常靠近,那我们拿它无能为力。


AUC面积

现在有了这条曲线,知道模型的效果还算是不错了。但依然非常摸棱两可,有没有具体的数字来帮助理解ROC曲线和模型的效果呢?

这个数字就叫做AUC面积,介于0.1和1之间它代表了ROC曲线下方的面积,这个面积越大,代表ROC曲线越接近左上角,模型就越好

AUC的含义:ROC曲线下的面积(越大越好,1为理想状态)

AUC是一种模型分类指标,且仅仅是二分类模型的评价指标
在这里插入图片描述
图片来源:《机器学习》第2章:模型评估与选择

通过做ROC曲线并计算AUC的值来对模型进行更加综合的评价。

利用ROC曲线找出最佳阈值

# 10折交叉验证
num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds, random_state=seed)
model = LogisticRegression()
scoring = 'roc_auc'
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print('AUC %.3f (%.3f)' % (result.mean(), result.std())) # AUC 0.824(0.041)

3.1.9 准确率-召回率曲线(PR曲线)

这里引用:链接:https://www.jianshu.com/p/b6fe300a0720@李_颖Biscuit
来源:简书
著作权归作者所有。


PR曲线实则是以precision(精准率)和recall(召回率)这两个为变量而做出的曲线,其中recall为横坐标,precision为纵坐标。

一条PR曲线要对应一个阈值。通过选择合适的阈值,比如50%,对样本进行划分,概率大于50%的就认为是正例,小于50%的就是负例,从而计算相应的精准率和召回率。

或者说

在这里插入图片描述

其P-R曲线上的一个点代表着,在某一阈值下,模型将大于该阈值的结果判定为正样本,小于该阀值的结果判定为负样本,此时返回结果对应的召回率和精确率。整条P-R曲线是通过将阈值从高到低移动而生成的。

只有通过P-R曲线的整体表现,才能够对模型进行更为全面的评估。

在这里插入图片描述

曲线越靠近右上角,则分类器越好

如果一个学习器的P-R曲线被另一个学习器的P-R曲线完全包住,则可断言后者的性能优于前者,例如上面的A和B优于学习器C。但是A和B的性能无法直接判断,我们可以根据曲线下方的面积大小来进行比较,但更常用的是平衡点或者是F1值。

平衡点(BEP)是P=R时的取值,如果这个值较大,则说明学习器的性能较好。
而F1 = 2 * P * R /( P + R ),同样,F1值越大,可以认为该学习器的性能较好。

PR曲线与ROC曲线的相同点是都采用了TPR (Recall),都可以用AUC来衡量分类器的效果。

不同点是ROC曲线使用了FPR,而PR曲线使用了Precision,因此PR曲线的两个指标都聚焦于正例。类别不平衡问题中由于主要关心正例,所以在此情况下PR曲线被广泛认为优于ROC曲线。

其次

相比P-R曲线,ROC曲线有一个特点,当正负样本的分布发生变化时,ROC曲线的形状能够基本保持不变,而P-R曲线的形状一般会发生较剧烈的变化。

这个特点让ROC曲线能够尽量降低不同测试集带来的干扰,更加客观地衡量模型本身的性能。

在很多实际问题中,正负样本数量往往很不均衡,若选择不同的测试集,P-R曲线的变化就会非常大,而ROC曲线则能够更加稳定地反映模型本身的好坏。所以,ROC曲线的适用场景更多。

在这里插入图片描述
图片来自:《百面机器学习》

3.1.10 对数损失(Log Loss)

对数损失(Logistic Loss,logloss)是对预测概率的似然估计

在这里插入图片描述

对数损失最小化本质是上利用样本中的已知分布,求解导致这种分布的最佳模型参数,使这种分布出现概率最大。

logloss衡量的是预测概率分布和真实概率分布的差异性,取值越小越好。

对数损失函数越小,模型就越好,而且使损失函数尽量是一个凸函数,便于收敛计算。代码如下:

#10折交叉验证

num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds, random_state=seed)
model = LogisticRegression()
scoring = 'neg_log_loss'
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print('Logloss %.3f (%.3f)' % (result.mean(), result.std()))

3.1.11 分类指标的文本报告(classification_report)

分类模型的评估 (classification_report)

from sklearn.metrics import classification_report
# y_pred是预测标签
y_pred, y_true =[1,0,1,0], [0,0,1,0]
print(classification_report(y_true=y_true, y_pred=y_pred))

classification_report函数用于显示主要分类指标的文本报告.在报告中显示每个类的精确度召回率F1值,还会给出总体的微平均值,宏平均值和加权平均值等信息。
scikit-learn - 分类模型的评估 (classification_report)

sklearn.metrics.classification_report(
   y_true,
   y_pred, 
   labels=None,
   target_names=None,
   sample_weight=None, 
   digits=2,
   output_dict=False)

y_true:1 维数组,真实数据的分类标签
y_pred:1 维数组,模型预测的分类标签
labels:列表,需要评估的标签名称
target_names:列表,指定标签名称
sample_weight:1 维数组,不同数据点在评估结果中所占的权重
digits:评估报告中小数点的保留位数,如果 output_dict=True,此参数不起作用,返回的数值不作处理
output_dict:若真,评估结果以字典形式返回

3.2 多分类指标

多分类问题的所有指标基本上都来自于二分类指标,但是要对所有类别进行平均。多分类的精度被定义为正确分类的样本所占的比例。

3.2.1 准确率accuracy

在多类分类的背景下,accuracy = (分类正确的样本个数) / (分类的所有样本个数)

3.2.2 混淆矩阵

如果类别是不平衡的,准确率并不是很好的评估度量。除了准确率,常用的工具有混淆矩阵分类报告
在这里插入图片描述
混淆矩阵(confusion_matrix)的可视化

3.2.3 F-score

对于多分类问题中的不平衡数据集,最常用的指标就是多分类版本的 f- 分数(f1、f1_macro、f1_micro 和f1_weighted)。

多分类f- 分数背后的想法是,对每个类别计算一个二分类f- 分数,其中该类别是正类,其他所有类别组成反类。然后,使用以下策略之一对这些按类别f- 分数进行平均。

3.2.4 宏平均和微平均


引:Python3 sklearn实现分类评价指标


“宏”(macro)平均:计算未加权的按类别 f- 分数。

它对所有类别给出相同的权重,无论类别中的样本量大小。

在这里插入图片描述

“加权”(weighted)平均:以每个类别的支持作为权重来计算按类别 f- 分数的平均值。分类报告中给出的就是这个值。

“微”(micro)平均:计算所有类别中假正例、假反例和真正例的总数,然后利用这些计数来计算准确率、召回率和f- 分数。

在这里插入图片描述


print('准确率:', metrics.accuracy_score(y_test, y_predict)) #预测准确率输出
print('宏平均精确率:',metrics.precision_score(y_test,y_predict,average='macro')) #预测宏平均精确率输出
print('微平均精确率:', metrics.precision_score(y_test, y_predict, average='micro')) #预测微平均精确率输出
print('宏平均召回率:',metrics.recall_score(y_test,y_predict,average='macro'))#预测宏平均召回率输出
print('平均F1-score:',metrics.f1_score(y_test,y_predict,average='weighted'))#预测平均f1-score输出

3.3 分类指标Python实现

sklearn当中提供了大量的类来帮助我们了解和使用混淆矩阵。

在这里插入图片描述

Confusion Matrix 混淆矩阵

from sklearn.metrics import confusion_matrix   
confusion_matrix(y_true, y_pred)

Precision 精准度

from sklearn.metrics import precision_score   
y_pred
y_true
accuracy_score(y_true, y_pred)

召回率Recall

from sklearn.metrics import recall_score   
recall_score(y_true, y_pred, average='macro')  

F1值

from sklearn.metrics import f1_score  
f1_score(y_true, y_pred, average='macro') 

ROC—— ROC曲线

from sklearn.metrics import roc   

AUC ——ROC曲线下的面积

from sklearn.metrics import auc

PR曲线

from sklearn.metrics import precision_recall_curve
#y_true和y_scores分别是gt label和predict score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
precision, recall, thresholds = precision_recall_curve(y_true, y_scores)
plt.figure(1)
plt.plot(precision, recall)
plt.show()

在sklearn中,有帮助计算ROC曲线的横坐标假正率FPR,纵坐标Recall和对应的阈值的类sklearn.metrics.roc_curve。计算AUC面积的类sklearn.metrics.roc_auc_score

sklearn.metrics.roc_curve (
							y_true, 
							y_score, 
							pos_label=None, 
							sample_weight=None, 
							drop_intermediate=True)

y_true : 数组,形状 = [n_samples],真实标签
y_score : 数组,形状 = [n_samples],置信度分数,可以是正类样本的概率值,或置信度分数,或者decision_function返回的距离
pos_label : 整数或者字符串, 默认None,表示被认为是正类样本的类别
sample_weight : 形如 [n_samples]的类数组结构,可不填,表示样本的权重
drop_intermediate : 布尔值,默认True,如果设置为True,表示会舍弃一些ROC曲线上不显示的阈值点,这对于计算一个比较轻量的ROC曲线来说非常有用

4 聚类

对于聚类算法的评价指标,以后在慢慢学习吧!

  • 兰德指数
  • 互信息
  • 轮廓系数

5 排序指标

5.1 平均准确率均值

平均准确率均值(MAP)的公式分两部分计算,先计算一次排序的平均准确率,再计算总体的平均准确率。

常用的MAP指标会限定评估排在前面的文档质量。

A P @ K = ∑ k = 1 min ⁡ ( M , K ) P ( k ) ⋅ rel ⁡ ( k ) min ⁡ ( M , K ) \mathrm{AP@K}=\frac{\sum_{k=1}^{\min (M, K)} P(k) \cdot \operatorname{rel}(k)}{\min (M, K)} AP@K=min(M,K)k=1min(M,K)P(k)rel(k)

P ( i ) =  前i个结果中相关文档数量  i P(i)=\frac{\text { 前i个结果中相关文档数量 }}{i} P(i)=i i个结果中相关文档数量 

其中,AP@K表示计算前K个结果的平均准确率;M表示每次排序的文档总数,可能一次返回文档数不足K个;P(k) 表示前k个结果的准确率;rel(k) 表示第k个结果是否是相关文档,相关取值为1,不相关取值为0。

5.2 NDCG

NDCG(归一化贴现累计收益)是常用的一个衡量排序质量的指标

6 交叉验证(评估算法)

引用:《机器学习python_魏贞原》

评估就是估计算法在预测新数据的时候能达到什么程度,但这不是对算法准确度的保证。当评估完算法模型之后,可以用整个数据集(训练数据集和评估数据集的合集)重新训练算法,生成最终的算法模型。

接下来将学习四种不同的分离数据集的方法,用来分离训练数据集和评估数据集,并用其评估算法模型:

(1)留出法(Hold-Out)
参考:《美团机器学习实战》

留出法是将数据集随机划分成两份互斥的数据集,一份作为训练集,一份作为测试集,在训练集上训练模型,然后用测试集评估模型效果。本质上,留出法并非一种交叉验证方法,因为数据并没有交叉。

留出法只需将数据划分成两部分,简单好实现。

在这里插入图片描述

这种方法的缺点也比较明显,它不能充分利用数据训练模型,并且训练集和测试集的划分严重影响最终结果,比如得到的模型会产生大的偏差或者得到的结论可信度变低,对于二分类数据,当样本正负类极不平衡时,如果只用一次留出法,结果可能会有较大偏差。通常的做法是,训练集70%,测试集30%。

在这里插入图片描述

X_train, X_test, Y_traing, Y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)

指定(seed=4),将数据随机进行分离。通过指定随机的粒度,可以确保每次执行程序得到相同的结果,这有助于比较两个不同的算法生成的模型的结果。

(2)K折交叉验证分离

交叉验证是用来验证分类器的性能的一种统计分析方法,有时也称作循环估计,在统计学上是将数据样本切割成小子集的实用方法。

将数据划分为n份,依次使用其中一份作为测试集,其他n-1份作为训练集,多次计算模型的精确性来评估模型的平均准确程度。

或者说

K折交叉验证是将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,再用这K个模型最终的验证集的分类准确率的平均数,作为此K折交叉验证下分类器的性能指标。K一般大于等于2,实际操作时一般从3开始取值,只有在原始数据集和数据量小的时候才会尝试取2。K折交叉验证可以有效地避免过学习及欠学习状态的发生,最后得到的结果也比较具有说服力

num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds, random_state=seed)
model = LogisticRegression()
result = cross_val_score(model, X, Y, cv=kfold)
print("算法评估结果:%.3f%% (%.3f%%)" % (result.mean() * 100, result.std() * 100))
KFold(n_splits=’warn’, shuffle=False, random_state=None)

KFold是一个类

n_splits 表示划分为几块(至少是2)

shuffle 表示是否打乱划分,默认False,即不打乱

random_state 表示是否固定随机起点,Used when shuffle == True.

在这里插入图片描述

==
在这里插入图片描述

==

在这里插入图片描述

cross_val_score(estimator, X, y=None, *, groups=None, scoring=None,
                    cv=None, n_jobs=None, verbose=0, fit_params=None,
                    pre_dispatch='2*n_jobs', error_score=np.nan)

关于scoring参数的取值问题

在使用机器学习算法的过程中,针对不同场景需要不同的评价指标,如在网格搜索GridSearchCV或交叉验证中cross_val_score中,不同的问题,scoring参数可以取不同的值。

在这里插入图片描述

在这里插入图片描述
针对上述参数中,为什么有一些指标结果是负数的问题:

sklearn在计算模型评估指标的时候,会考虑指标本身的性质,均方误差本身是一种误差,所以被sklearn划分为模型的一种损失(loss)。在sklearn当中,所有的损失都使用负数表示,因此均方误差也被显示为负数了。真正的均方误差MSE的数值,其实就是neg_mean_squared_error去掉负号的数字。

在这里插入图片描述

(3)弃一交叉验证分离(留一)

如果原始数据有N个样本,那么弃一交叉验证就是N-1个交叉验证,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以弃一交叉验证会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此次弃一交叉验证分类器的性能指标。

在这里插入图片描述

loocv = LeaveOneOut()
model = LogisticRegression()
result = cross_val_score(model, X, Y, cv=loocv)
print("算法评估结果:%.3f%% (%.3f%%)" % (result.mean() * 100, result.std() * 100))

(4)重复随机评估、训练数据集分离

另外一种K折交叉验证的用途是随机分离数据为训练数据集和评估数据集,但是重复这个过程多次,就如同交叉验证分离。下面的例子就是将数据按照70%:30%的比例分离,然后重复这个过程10次。

n_splits = 10
test_size = 0.30
seed = 7
kfold = ShuffleSplit(n_splits=n_splits, test_size=test_size, random_state=seed)
model = LogisticRegression()
result = cross_val_score(model, X, Y, cv=kfold)
print("算法评估结果:%.3f%% (%.3f%%)" % (result.mean() * 100, result.std() * 100))

参考:
【菜菜的sklearn】07 支持向量机(上)
机器学习 | 评价指标
机器学习评估指标
机器学习模型的评价指标和方法
机器学习-浅谈模型评估的方法和指标
机器学习(五)之评价指标:二分类指标、多分类指标、混淆矩阵、不确定性、ROC曲线、AUC、回归指标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值