模型评估指标

2023-12-28 19:34:54



1、评估指标简介


回归与分类算法的模型评估其实是相似的法则:找真实标签和预测值的差异

在分类算法中,这个差异只有一种角度来评判,那就是是否预测到了正确的分类,其结果只存在0(分类错误)或100(分类正确),并不存在中间过程的衡量标准

而在回归类算法中,我们从两种不同的角度来看待回归的效果:第一,我们是否预测到了正确的数值;第二,我们是否拟合到了足够的信息

这两种角度分别对应着不同的模型评估指标

2、是否预测了正确的值

2.1、均方误差(MSE)


回忆一下我们的RSS残差平方和(误差平方和),它的本质是我们的预测值与真实值之间的差异,也就是从第一种角度来评估我们回归的效果。所以RSS既是我们的损失函数,也是我们回归模型的重要评估指标之一

但是,RSS有一个致命的缺点:它是一个无界的和,可以无限地大。我们只知道,我们想要求解最小的RSS,从RSS的公式来看,它不能为负,所以RSS越接近0越好

但我们没有一个概念,究竟多小才算好?多接近0才算好?为了应对这种状况,Scikit-Learn使用RSS的变体:均方误差MSE(Mean Squared Error)来衡量我们的预测值和真实值的差异:
M S E = 1 m ∑ i = 1 m ( y i ? y ) 2 MSE=\frac{1}{m}\sum_{i=1}^m(y_i-y)^2 MSE=m1?i=1m?(yi??y)2

均方误差,本质是在RSS的基础上除以了样本总量,得到了每个样本量上的平均误差。有了平均误差,我们就可以将每个样本的平均误差和我们的标签的取值范围在一起比较,以此获得一个较为可靠的评估依据

在Scikit-Learn当中,我们有两种方式调用这个评估指标:一种是使用Scikit-Learn专用的模型评估模块里的类mean_squared_error,另一种是调用交叉验证的类 cross_val_scoresco并使用里面的参数来设置使用均方误差

# Scikit-Learn均方误差
from sklearn.metrics import mean_squared_error as MSE

mse = MSE(y_pred, y_test)

2.2、交叉验证


交叉验证是一种模型选择的方法。交叉验证可以分为以下三种:

  • 简单交叉验证:即将数据按照一定比例分为训练集和测试集
  • S折交叉验证:将已给数据切分为S个互不相交、大小相同的子集,将S-1个子集的数据作为训练集来训练模型,剩余的一个测试模型,重复S次,选择S次中平均测试误差最小的模型
  • 留一交叉验证:即S=n。往往在数据缺乏的时候使用,因为数据很少没法再分了

由于交叉验证是用来模型选择的,所以是将不同的模型(如SVM,LR等)运用上述方法,然后比较误差大小,选择误差最小的模型

需要注意的是,上述三种方法是针对数据量不充足的时候采用的交叉验证方法,如果数据量充足(如100万),一种简单的方法就是将数据分为3部分:

  • 训练集:用来训练模型
  • 验证集:用于模型选择
  • 测试集:用于最终对学习方法的评估

选择验证集上有最小预测误差的模型

一旦使用交叉验证,模型还需要划分训练集和测试集吗?答案是需要。测试集的目的是评估模型在训练集上的效果。核心也是看模型在测试集上的表现效果,并根据测试集结果来评估模型的优劣

交叉验证主要用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,可以在一定程度上减小过拟合。交叉验证可以完整的利用数据信息,而不是只将数据简单的分为训练集和测试集

1)简单交叉验证

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)

通过训练集来训练模型,然后通过测试集表现来评估该模型

2)S折交叉验证

import warnings
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import GradientBoostingClassifier

warnings.filterwarnings('ignore')

clf = LogisticRegression()
gbdt = GradientBoostingClassifier()
score1 = cross_val_score(clf, X, y, cv=10, scoring='roc_auc')
score2 = cross_val_score(gbdt, X, y, cv=10, scoring='roc_auc')
print(f'逻辑回归 10折交叉验证平均AUC结果: {score1.mean()}')
print(f'GBDT 10折交叉验证平均AUC结果: {score2.mean()}')

3)留一交叉验证

from sklearn.model_selection import LeaveOneOut

loo = LeaveOneOut()
for train, test in loo.split(X, y):
    print(train.shape, test.shape)

留一交叉验证每一次把n-1的数据集作为训练集,1作为验证集。即训练集样本量为n-1,测试集样本量为1

S折交叉验证设置使用均方误差

from sklearn.model_selection import cross_val_score

score = cross_val_score(reg, X, y, cv=10, scoring="neg_mean_squared_error")
print(score.mean())

这里需要注意的是,虽然均方差永远为正,但是在cross_val_scorescoring参数下,均方误差作为评判标准时,确是计算负均方误差neg_mean_squared_error。这是因为Scikit-Learn在计算模型评估指标时,会考虑指标本身的性质。均方误差本身是一种误差,所以被Scikit-Learn划分为一种损失(Loss)。在Scikit-Learn当中,所有损失都使用负数表示。因此,这里均方误差也显示为负数。真正的均方误差MSE的数值其实就是neg_mean_squared_error去掉负号的数字

3、决定系数( R 2 R^2 R2


决定系数(R2)可用于验证是否拟合了足够的信息

在统计学中,决定系数反映了因变量 y y y的波动有多少百分比能被自变量 x x x(特征)的波动所描述。简单来说,该参数可以用来判断统计模型对数据的拟合能力(说服力)

假设我们有m组观测数据 ( x 1 , y 1 ) , . . . , ( x m , y m ) (x_1,y_1),...,(x_m,y_m) (x1?,y1?),...,(xm?,ym?),在最小二乘法(传送门)一文中,我们已经知道了误差或回归残差(真实值-理论值)可定义为:
e i = y i ? y e_i=y_i-y ei?=yi??y

那么,平均观察值可定义为:
y  ̄ = 1 m ∑ i = 1 m y i \overline{y}=\frac{1}{m}\sum_{i=1}^my_i y?=m1?i=1m?yi?

于是,总体残差平方和(Sum of Squares for Total,SST)为:
S S t o t = ∑ i = 1 m ( y i ? y  ̄ ) 2 SS_{tot}=\sum_{i=1}^m(y_i-\overline{y})^2 SStot?=i=1m?(yi??y?)2

残差平方和或误差平方和(Residual Sum of Squares,RSS)为:
S S r e g = ∑ i = 1 m ( y i ? y ) 2 SS_{reg}=\sum_{i=1}^m(y_i-y)^2 SSreg?=i=1m?(yi??y)2

用数学语言简单描述,决定系数R2就是回归平方和与总平方和之比:
R 2 = 1 ? S S r e g S S t o t = 1 ? ∑ i = 1 m ( y i ? y ) 2 ∑ i = 1 m ( y i ? y  ̄ ) 2 R^2=1-\frac{SS_{reg}}{SS_{tot}}=1-\frac{\sum_{i=1}^m(y_i-y)^2}{\sum_{i=1}^m(y_i-\overline{y})^2} R2=1?SStot?SSreg??=1?i=1m?(yi??y?)2i=1m?(yi??y)2?

其中, y i y_i yi?是我们的真实标签, y y y是我们的预测结果, y  ̄ \overline{y} y?是我们的均值。在 R 2 R^2 R2中,分子是真实值与预测值的差值,也就是我们的模型没有捕获到的信息总量;分母是真实标签的总信息量,所以, R 2 R^2 R2衡量的是1减去我们的模型没有捕获到的信息量占真实标签总信息量的比例,因此, R 2 R^2 R2越接近1越好

在Scikit-learn中,回归模型的性能分数就是利用 R 2 R^2 R2对拟合效果打分的,具体的实现函数是score()



参考文章:
https://zhuanlan.zhihu.com/p/67706712
https://blog.csdn.net/qq_45797116/article/details/112437862
https://blog.csdn.net/qq_27782503/article/details/90350086


文章来源:https://blog.csdn.net/weixin_55629186/article/details/135248740
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。