交叉验证
首先选择模型最简单的方法就是,利用每一种机器学习算法(逻辑回归、SVM、线性回归等)计算训练集的损失值,然后选择其中损失值最小的模型,但是这样是不合理的,因为当训练集不够、特征过多时容易过拟合,那么训练集的损失值就会不断变小,但是此时针对测试集可能损失值很高,所以训练集上的损失值是无法衡量模型的好坏的。
我们的办法就是增加交叉验证集,即将所有数据分为三部分:训练集、交叉验证集和测试集。交叉验证集不仅在选择模型时有用,在超参数选择、正则项参数
和评价模型中也很有用。
简单交叉验证利用训练集训练模型
利用交叉验证集在每一种模型上测试并计算损失值
选择损失值最小的模型
但是简单交叉验证存在一个问题,就是因为增加了验证集后,导致训练集的数据更少了,这样模型可能无法更好地的体现整体数据,所以提出以下交叉验证的方法。
k-折叠交叉验证假设训练集为
,将训练集等分为
份:
然后每次从集合中拿出
份进行训练
利用集合中剩下的那一份来进行测试并计算损失值
最后得到
次测试得到的损失值,并选择平均损失值最小的模型
Bias与Variance,欠拟合与过拟合
如下图,针对同一组数据的三种模型,可以看出来中间的模型可以更好的表现数据,其中左边的模型一般称为欠拟合,右边的模型称为过拟合。
欠拟合一般表示模型对数据的表现能力不足,通常是模型的复杂度不够,并且Bias高,训练集的损失值高,测试集的损失值也高。
过拟合一般表示模型对数据的表现能力过好,通常是模型的复杂度过高,并且Variance高,训练集的损失值低,测试集的损失值高。
具体如下图所示:
针对Bias于Variance,有多种解释方法。
第一种:
一般用下面两张图表示:
Bias描述的是模型与数据表现的真实情况的差别,Variance描述的是我们的假设与最好的假设之间的差别。
第二种:Bias是表明模型在整体数据上表现,不在乎其中某一个样本的正确与否
对于Variance,一个样本的变动会给整个模型带来很大的影响,是模型抗样本干扰能力有多强
如下图所示:
高Bias的模型,单个样本对模型影响不大。
高Variance的模型,一个样本的变化可以改变整个模型。
第三种:
解决方法
针对机器学习模型,在效果不佳时可以有如下解决办法:增加训练样本----解决高Variance情况
减少特征维数----解决高Variance情况
增加特征维数----解决高Bias情况
增加模型复杂度----解决高Bias情况
减小模型复杂度----解决高Variance情况
针对过拟合的情况,我们可以采取上述中的1、2、5的方法,除此之外,我们还可以在损失函数中增加正则项(L0、L1、L2范数)来解决过拟合的问题。
一般监督学习可以看做最小化下面目标函数:
其中
函数为损失函数,
就是规则化函数,也可以叫做正则项。我们增加正则项的主要原因是为了让
更稀疏,使模型不容易过拟合(后面会详细解释)。
函数具体可以有很多种选择,常见的有L0范数、L1范数、L2范数等。其中:L0范数是向量中非零元素的个数
L1范数是向量中各个元素绝对值之和,
L2范数是向量的模,
其中L0范数由于不好实现,所以一般不采用。
针对L1范数,它能实现特征的自动选择,一般来说,
的大部分元素(也就是特征)都是和最终的输出
没有关系或者不提供任何信息的,在最小化目标函数的时候考虑
这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,会干扰了对正确
的预测。稀疏规则化算子就是为了完成特征自动选择,它会自己学习去掉这些没有信息的特征,也就是把这些特征对应的权重置为0。
针对L2范数,与L1范数的区别是不会将权重置为0,而会是一个很小的数,这样可以通过
来控制模型拟合程度,如下图所示
针对正则项,我们还可以有如下理解(来自知乎问题机器学习中常常提到的正则化到底是什么意思? @陶轻松的回答 ):将函数
泰勒展开,
当n很大的时候,特征就越多,模型就越复杂,越容易过拟合。
因为
是我们学习到的,所以我们要做的就是改变
的大小减少特征维数,降低模型复杂度,也是让一部分
趋近于0。
所以在目标函数中加入正则项,利用L0、L1、L2范数来改变
。
参考