模型评估指标一
1、评估指标简介
回归与分类算法的模型评估其实是相似的法则:找真实标签和预测值的差异
在分类算法中,这个差异只有一种角度来评判,那就是是否预测到了正确的分类,其结果只存在0(分类错误)或100(分类正确),并不存在中间过程的衡量标准
而在回归类算法中,我们一般从两种不同的角度来看待回归的效果:第一,我们是否预测到了正确的数值;第二,我们是否拟合到了足够的信息
这两种角度分别对应着不同的模型评估指标
2、均方误差(MSE)
均方误差(MSE)可用于验证是否预测到了正确的数值
回忆一下我们的RSS残差平方和(误差平方和),它的本质是我们的预测值与真实值之间的差异,也就是从第一种角度来评估我们回归的效果。所以RSS既是我们的损失函数,也是我们回归模型的重要评估指标之一
损失函数和RSS的介绍见文章:传送门
但是,RSS有一个致命的缺点:它是一个无界的和,可以无限地大。我们只知道,我们想要求解最小的RSS,从RSS的公式来看,它不能为负,所以RSS越接近0越好
但我们没有一个概念,究竟多小才算好?多接近0才算好?为了应对这种状况,Scikit-Learn使用了RSS的变体:均方误差MSE(Mean Squared Error,L2损失)来衡量我们的预测值和真实值的差异:
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=m1i=1∑m(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)
MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据精确度越高
一些教材也使用均方根误差(RMSE)代替MSE。均方根误差是均方误差的算术平方根,可使用参数squared=False
指定
在线性回归中,MSE(L2损失)计算简便,由于它的惩罚是平方和,所以含有异常值的损失(Loss)会非常大,因此,MSE对异常值敏感。当预测值和真实值接近时,MSE较小;反之非常大。使用MSE会导致异常点有更大的权重,因此数据有异常点时,使用平均绝对误差(MAE)损失函数更好
平均绝对误差MAE(Mean Absolute Error,L1损失)是另一种用于回归模型的损失函数:
M A E = 1 m ∑ i = 1 m ∣ y i − y ∣ MAE=\frac{1}{m}\sum_{i=1}^m|y_i-y| MAE=m1i=1∑m∣yi−y∣
平均绝对误差表示预测值和观测值之间绝对误差的平均值。平均绝对误差认为每个样本的差异在平均值上的权重都相等
3、交叉验证
交叉验证是一种模型选择的方法。交叉验证可以分为以下三种:
- 简单交叉验证:即将数据按照一定比例分为训练集和测试集
- S折交叉验证:将已给数据切分为S个互不相交、大小相同的子集,将S-1个子集的数据作为训练集来训练模型,剩余的一个测试模型,重复S次,选择S次中平均测试误差最小的模型
- 留一交叉验证:即S=n。往往在数据缺乏的时候使用,因为数据很少没法再分了
由于交叉验证是用来模型选择的,所以是将不同的模型(如SVM,LR等)运用上述方法,然后比较误差大小,选择误差最小的模型
需要注意的是,上述三种方法是针对数据量不充足的时候采用的交叉验证方法,如果数据量充足(如100万),一种简单的方法就是将数据分为3部分:
- 训练集:用来训练模型
- 验证集:用于模型选择
- 测试集:用于最终对学习方法的评估
选择验证集上有最小预测误差的模型
测试集的目的是评估模型在训练集上的效果。核心也是看模型在测试集上的表现,并根据测试集结果来评估模型的优劣
交叉验证主要用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,可以在一定程度上减小过拟合。交叉验证可以完整的利用数据信息,而不是只将数据简单的分为训练集和测试集
1)简单交叉验证
from sklearn.model