一、什么是过拟合?(高方差)+为什么会产生过拟合?+怎么解决过拟合?
1.过拟合:就是训练时的结果很好,但是在预测时结果不好的情况。
2.产生过拟合的原因:
(1) 模型的复杂度太高。比如:网络太深,
(2)过多的变量(特征)
(3)训练数据非常少。
3.如何解决过拟合?
避免过拟合的方法有很多:(1)尽量减少特征的数量、(2)early stopping、(3)数据集扩增、(4)dropout、(5)正则化包括L1、L2、(6)清洗数据。
避免过拟合(刻画太细,泛化太差)
增大数据集合—–使用更多的数据,噪声点比重减少
减少数据特征—–减小数据维度,高维空间密度小
正则化方法—–即在对模型的目标函数(objective function)或代价函数(cost function)加上正则项
交叉验证方法????一脸茫然?-等我确定哈!
(1)尽量减少选取变量的数量。
=>可以人工检查每一项变量,并确定哪些变量更重要。然后保留那些更重要的特征变量。
=>可以使用模型选择算法,通过该算法自动的选择使用哪些特征变量,舍弃哪些特征变量。
(2)正则化
正则化会保留所有的特征变量,但是会减小特征变量的数量级。
这种方法非常有效,当我们有很多特征变量时,其中每一个特征变量都对预测产生了一些影响。每一个变量都有用,因此我们希望保留所有的变量,这个时候就可以使用正则化的方法。
正则化就是使用惩罚项,通过惩罚项,我们可以将一些参数的值变小。通常参数值越小,对应的函数也就越光滑,也就是更加简单的函数,因此不容易发生过拟合问题。
(3)early stopping、
(4)数据集扩增(Data augmentation)
“有时候不是因为算法好赢了,而是因为拥有更多的数据才赢了。”
不记得原话是哪位大牛说的了,hinton?从中可见训练数据有多么重要,特别是在深度学习方法中,更多的训练数据,意味着可以用更深的网络,训练出更好的模型。
既然这样,收集更多的数据不就行啦?如果能够收集更多可以用的数据,当然好。但是很多时候,收集更多的数据意味着需要耗费更多的人力物力,有弄过人工标注的同学就知道,效率特别低,简直是粗活。
所以,可以在原始数据上做些改动,得到更多的数据,以图片数据集举例,可以做各种变换,如:
-
将原始图片旋转一个小角度
-
添加随机噪声
-
一些有弹性的畸变(elastic distortions),论文《Best practices for convolutional neural networks applied to visual document analysis》对MNIST做了各种变种扩增。
-
截取(crop)原始图片的一部分。比如DeepID中,从一副人脸图中,截取出了100个小patch作为训练数据,极大地增加了数据集。感兴趣的可以看《Deep learning face representation from predicting 10,000 classes》.
更多数据意味着什么?
用50000个MNIST的样本训练SVM得出的accuracy94.48%,用5000个MNIST的样本训练NN得出accuracy为93.24%,所以更多的数据可以使算法表现得更好。在机器学习中,算法本身并不能决出胜负,不能武断地说这些算法谁优谁劣,因为数据对算法性能的影响很大。
(5)dropout。
Dropout则是通过修改神经网络本身来实现的,它是在训练网络时用的一种技巧(trike)。它的流程如下:
假设我们要训练上图这个网络,在训练开始时,我们随机地“删除”一半的隐层单元,视它们为不存在,得到如下的网络:
保持输入输出层不变,按照BP算法更新上图神经网络中的权值(虚线连接的单元不更新,因为它们被“临时删除”了)。
以上就是一次迭代的过程,在第二次迭代中,也用同样的方法,只不过这次删除的那一半隐层单元,跟上一次删除掉的肯定是不一样的,因为我们每一次迭代都是“随机”地去删掉一半。第三次、第四次……都是这样,直至训练结束。
以上就是Dropout,它为什么有助于防止过拟合呢?可以简单地这样解释,运用了dropout的训练过程,相当于训练了很多个只有半数隐层单元的神经网络(后面简称为“半数网络”),每一个这样的半数网络,都可以给出一个分类结果,这些结果有的是正确的,有的是错误的。随着训练的进行,大部分半数网络都可以给出正确的分类结果,那么少数的错误分类结果就不会对最终结果造成大的影响。
(6)重新清洗数据。
导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据
二、什么是欠拟合+为什么会产生欠拟合?(高偏差)+怎么解决欠拟合?
1.什么是欠拟合?
模型没有很好地捕捉到数据特征,不能够很好地拟合数据的情况,就是欠拟合。
2.为什么会产生欠拟合?
- 因为模型不够复杂而无法捕捉数据基本关系,导致模型错误的表示数据。
比如:(1)如果对像是按照颜色和形状进行分类的,但是模型只能按照颜色来区分对象和将对象分类,因而一直会错误的分类对象。 (2)我们的模型可能是多项式的形式,但是训练出来的模型却只能表示线性关系。
3.怎么解决欠拟合?
1)添加其他特征项,有时候我们模型出现欠拟合的时候是因为特征项不够导致的,可以添加其他特征项来很好地解决。例如,“组合”、“泛化”、“相关性”三类特征是特征添加的重要手段,无论在什么场景,都可以照葫芦画瓢,总会得到意想不到的效果。除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作为特征添加的首选项。
2)添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。例如上面的图片的例子。
3)减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。
避免欠拟合(刻画不够) 1.寻找更好的特征—–具有代表性的 2.用更多的特征—–增大输入向量的维度
三、什么是方差?
1.方差的定义:
什么是Variance(方差):Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。反应预测的波动情况。
2.方差和偏差的形象化表示?靶心和射击的结果。
其中,bias表示的是偏差,描述的是模型和预测结果和真实结果的差距;variance表示的是方差。
图中的靶心就是我们的真实值。
离靶心的距离反映了我们的偏差有多大。离靶心越近,偏差越小;离靶心越远,方差越大。
点的聚集程度反映了我们的方差有多大。越分散,方差越大。越聚拢,方差越小。
举个例子来理解:两个射击选手在射靶。甲射出的子弹很集中在某个区域,但是都偏离了靶心。我们说他的射击很稳定,但是不够准,准确性差。也就是说他的方差小(子弹很集中在某个区域),但是他的偏差大(子弹打中的地方距离靶心远)。相反,乙射出的子弹比较分散,但是有些很准,中了靶心。我们说他射击比较准,但是发挥不够稳定,稳定性差。
所以,偏差是描述了准确性。方差是描述稳定性。
四、什么是偏差?
1.偏差的定义:
什么是Bias(偏差):Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,即算法本身的拟合能力
五、涉及到的其他的知识点
1.泛化能力:是指一个模型应用到新样本的能力。这里的新样本是指没有出现在训练集中的数据。
2.方差、偏差和过拟合、欠拟合之间的关系?偏差、方差与欠拟合、过拟合之间又有什么关系呢?
- 过拟合会出现高方差问题
- 欠拟合会出现高偏差问题
如上图中的第二个坐标,随着模型参数的增加,训练集的误差会慢慢减少。从第一个坐标和最后一个坐标可以直观感受到这种效果。因为模型参数少的时候,模型不能很好地拟合训练集的数据,所以偏差就比较大。当模型参数足够多时,模型拟合的效果就非常好了。
但是,当我们用验证集来验证时,却会有这样的情况:
对于欠拟合的情况,我们很容易理解,模型本来拟合的就不好,验证集的误差大也是自然。但是,对于过拟合来说,训练集的效果是非常好的,但是验证集上的效果却并不好,这是因为随着参数越多,模型就越不通用,而是针对了某一种特定的情况,比较有偏见,所以当用验证集验证时,误差会很大。因为验证集中的有些数据可能很符合过拟合的那条曲线,也有可能很不符合,所以数据方差就大了。也就是,方差大的时候我们可以认为是因为过拟合了。相反,模型参数少的时候,模型比较粗糙,偏离正确的拟合比较远,所以是偏差大。
(这个图的横坐标是模型复杂度,也就是说,横轴越大,模型越复杂。同时体现了随着模型参数个数的增加,模型的偏差逐渐降低,方差逐渐增大,当两者相等时,我们获得了期望的模型复杂度)
4.为什么提供更多的数据量并不能解决欠拟合问题?
在这种模型复杂度不够的情况下,我们向模型提供的数据的量并不重要。因为模型根本没有办法表示其中的基本关系,因此我们需要更复杂的模型。
5.方差、偏差的应用场景?
用于计算模型的好坏。具体是使用error公式。
Error = Bias^2 + Variance+Noise
- 什么是Bias(偏差):Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,即算法本身的拟合能力
- 什么是Variance(方差):Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。反应预测的波动情况。
- 什么是Noise(噪声):这就简单了,就不是你想要的真正数据,你可以想象为来破坏你实验的元凶和造成你可能过拟合的原因之一,至于为什么是过拟合的原因,因为模型过度追求Low Bias会导致训练过度,对测试集判断表现优秀,导致噪声点也被拟合进去了
6、题外话——如何判断模型的好坏?
交叉验证!!!
判断模型的好和坏,就是衡量模型的(方差+偏差)和的最小值。因此主要的关注点就是平衡Bias和Variance。现在通用的衡量方法采用的是交叉验证的思想。交叉验证思想能够很好的处理方差大和偏差大这两大痛点,能够更好的评估模型好坏!
更多的关于交叉验证的部分我们稍后再写。
注意:交叉验证使用的仅仅是训练集!!根本没测试集什么事!很多博客都在误导!
说白了,就是你需要用下交叉验证去试下你的算法是否精度够好,够稳定!你不能说你在某个数据集上表现好就可以,
你做的模型是要放在整个数据集上来看的!毕竟泛化能力才是机器学习解决的核心
损失函数:
基本概念:
损失函数:计算的是一个样本的误差
代价函数:是整个训练集上所有样本误差的平均
目标函数:代价函数 + 正则化项
实际应用:
损失函数和代价函数是同一个东西,目标函数是一个与他们相关但更广的概念,举例说明:
上面三个图的曲线函数依次为f1(x),f2(x),f3(x),我们想用这三个函数分别来拟合真实值Y。
我们给定x,这三个函数都会输出一个f(X),这个输出的f(X)与真实值Y可能是相同的,也可能是不同的,为了表示我们拟合的好坏,我们就用一个函数来度量拟合的程度。这个函数就称为损失函数(loss function),或者叫代价函数(cost function)。
损失函数越小,就代表模型拟合的越好。那是不是我们的目标就只是让loss function越小越好呢?还不是。这个时候还有一个概念叫风险函数(risk function)。风险函数是损失函数的期望,这是由于我们输入输出的(X,Y)遵循一个联合分布,但是这个联合分布是未知的,所以无法计算。但是我们是有历史数据的,就是我们的训练集,f(X)关于训练集的平均损失称作经验风险(empirical risk),所以我们的目标就是最小化经验风险。
到这里完了吗?还没有。
如果到这一步就完了的话,那我们看上面的图,那肯定是最右面的f3(x)的经验风险函数最小了,因为它对历史的数据拟合的最好嘛。但是我们从图上来看它肯定不是最好的,因为它过度学习历史数据,导致它在真正预测时效果会很不好,这种情况称为过拟合(over-fitting)。为什么会造成这种结果?大白话说就是它的函数太复杂了,都有四次方了,这就引出了下面的概念,我们不仅要让经验风险最小化,还要让结构风险最小化。
这个时候就定义了一个函数J(f),这个函数专门用来度量模型的复杂度,在机器学习中也叫正则化(regularization)。常用的有L1, L2范数。到这一步我们就可以说我们最终的优化函数是:
即最优化经验风险和结构风险,而这个函数就被称为目标函数
损失函数(loss function)是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构风险函数重要组成部分。模型的结构风险函数包括了经验风险项和正则项,通常可以表示成如下式子:
其中,前面的均值函数表示的是经验风险函数,L代表的是损失函数,后面的
一、log对数损失函数(逻辑回归)
有些人可能觉得逻辑回归的损失函数就是平方损失,其实并不是。平方损失函数可以通过线性回归在假设样本是高斯分布的条件下推导得到,而逻辑回归得到的并不是平方损失。在逻辑回归的推导中,它假设样本服从伯努利分布(0-1分布),然后求得满足该分布的似然函数,接着取对数求极值等等。而逻辑回归并没有求似然函数的极值,而是把极大化当做是一种思想,进而推导出它的经验风险函数为:最小化负的似然函数(即max F(y, f(x)) —-> min -F(y, f(x)))。从损失函数的视角来看,它就成了log损失函数了。
log损失函数的标准形式:
刚刚说到,取对数是为了方便计算极大似然估计,因为在MLE中,直接求导比较困难,所以通常都是先取对数再求导找极值点。损失函数L(Y, P(Y|X))表达的是样本X在分类Y的情况下,使概率P(Y|X)达到最大值(换言之,就是利用已知的样本分布,找到最有可能(即最大概率)导致这种分布的参数值;或者说什么样的参数才能使我们观测到目前这组数据的概率最大)。因为log函数是单调递增的,所以logP(Y|X)也会达到最大值,因此在前面加上负号之后,最大化P(Y|X)就等价于最小化L了。
逻辑回归的P(Y=y|x)表达式如下:
如果是二分类的话,则m值等于2,如果是多分类,m就是相应的类别总个数。这里需要解释一下:之所以有人认为逻辑回归是平方损失,是因为在使用梯度下降来求最优解的时候,它的迭代式子与平方损失求导后的式子非常相似,从而给人一种直观上的错觉。
二、平方损失函数(最小二乘法, Ordinary Least Squares )
最小二乘法是线性回归的一种,OLS将问题转化成了一个凸优化问题。在线性回归中,它假设样本和噪声都服从高斯分布(为什么假设成高斯分布呢?其实这里隐藏了一个小知识点,就是中心极限定理,可以参考【central limit theorem】),最后通过极大似然估计(MLE)可以推导出最小二乘式子。最小二乘的基本原则是:最优拟合直线应该是使各点到回归直线的距离和最小的直线,即平方和最小。换言之,OLS是基于距离的,而这个距离就是我们用的最多的欧几里得距离。为什么它会选择使用欧式距离作为误差度量呢(即Mean squared error, MSE),主要有以下几个原因:
- 简单,计算方便;
- 欧氏距离是一种很好的相似性度量标准;
- 在不同的表示域变换后特征性质不变。
平方损失(Square loss)的标准形式如下:
而在实际应用中,通常会使用均方差(MSE)作为一项衡量指标,公式如下:
三、指数损失函数(Adaboost)
学过Adaboost算法的人都知道,它是前向分步加法算法的特例,是一个加和模型,损失函数就是指数函数。在Adaboost中,经过m此迭代之后,可以得到
Adaboost每次迭代时的目的是为了找到最小化下列式子时的参数
而指数损失函数(exp-loss)的标准形式如下
可以看出,Adaboost的目标式子就是指数损失,在给定n个样本的情况下,Adaboost的损失函数为:
四、Hinge损失函数(SVM)
在机器学习算法中,hinge损失函数和SVM是息息相关的。在线性支持向量机中,最优化问题可以等价于下列式子:
下面来对式子做个变形,令:
于是,原式就变成了:
如若取
前半部分中的
Hinge 损失函数的标准形式
补充一下:在libsvm中一共有4中核函数可以选择,对应的是-t参数分别是:
- 0-线性核;
- 1-多项式核;
- 2-RBF核;
- 3-sigmoid核。
五、其它损失函数
除了以上这几种损失函数,常用的还有:
0-1损失函数
绝对值损失函数
下面来看看几种损失函数的可视化图像,对着图看看横坐标,看看纵坐标,再看看每条线都表示什么损失函数,多看几次好好消化消化。
OK,暂时先写到这里,休息下。最后,需要记住的是:参数越多,模型越复杂,而越复杂的模型越容易过拟合。过拟合就是说模型在训练数据上的效果远远好于在测试集上的性能。此时可以考虑正则化,通过设置正则项前面的hyper parameter,来权衡损失函数和正则项,减小参数规模,达到模型简化的目的,从而使模型具有更好的泛化能力。