交叉验证,K折交叉验证的偏差和⽅差分析
交叉验证
我的爱人英文犀利的开头
在机器学习中,我们⽤训练数据集去训练(学习)⼀个model(模型),通常的做法是定义⼀个Loss function(误差函数),通过将这个Loss(或者叫error)的最⼩化过程,来提⾼模型的性能(performance)。然⽽我们学习⼀个模型的⽬的是为了解决实际的问题(或者说是训练数据集这个领域(field)中的⼀般化问题),单纯地将训练数据集的loss最⼩化,并不能保证在解决更⼀般的问题时模型仍然是最优,甚⾄不能保证模型是可⽤的。这个训练数据集的loss与⼀般化的数据集的loss之间的差异就叫做generalization error=bias+variance。
注:Bias和Variance是针对Generalization(⼀般化,泛化)来说的。
generalization error分为Bias和Variance两个部分。⾸先如果我们能够获得所有可能的数据集合,并在这个数据集合上将loss最⼩化,这样学习到的模型就可以称之为“真实模型”,当然,我们是⽆论如何都不能获得并训练所有可能的数据的,所以“真实模型”肯定存在,但⽆法获得,我们的最终⽬标就是去学习⼀个模型使其更加接近这个真实模型。
⽽bias和variance分别从两个⽅⾯来描述了我们学习到的模型与真实模型之间的差距。
Bias是 “⽤所有可能的训练数据集训练出的所有模型的输出的平均值” 与 “真实模型”的输出值之间的差异;
Variance则是“不同的训练数据集训练出的模型”的输出值之间的差异。
这⾥需要注意的是我们能够⽤来学习的训练数据集只是全部数据中的⼀个⼦集。想象⼀下我们现在收集⼏组不同的数据,因为每⼀组数据的不同,我们学习到模型的最⼩loss值也会有所不同,当然,它们与“真实模型”的最⼩loss也是不⼀样的。其他答主有提到关于cross validation中k值对bias和variance的影响,那我就从其他⽅⾯来举个例⼦。
假设我们现在有⼀组训练数据,需要训练⼀个模型(基于梯度的学习,不包括最近邻等⽅法)。在训练过程的最初,bias 很⼤,因为我们的模型还没有来得及开始学习,也就是与“真实模型”差距很⼤。然⽽此时variance却很⼩,因为训练数据集(training data)还没有来得及对模型产⽣影响,所以此时将模型应⽤于“不同的”训练数据集也不会有太⼤差异。
⽽随着训练过程的进⾏,bias变⼩了,因为我们的模型变得“聪明”了,懂得了更多关于“真实模型”的信息,输出值与真实值之间更加接近了。但是如果我们训练得时间太久了,variance就会变得很⼤,因
为我们除了学习到关于真实模型的信息,还学到了许多具体的,只针对我们使⽤的训练集(真实数据的⼦集)的信息。⽽不同的可能训练数据集(真实数据的⼦集)之间的某些特征和噪声是不⼀致的,这就导致了我们的模型在很多其他的数据集上就⽆法获得很好的效果,也就是所谓的overfitting(过学习)。
因此,在实际的训练过程中会⽤到validation t,会⽤到诸如early stopping以及regularization等⽅法来避免过学习的发⽣,然⽽没有⼀种固定的策略⽅法适⽤于所有的task和data,所以bias和variance之间的tradeoff应该是机器学习永恒的主题吧。
最后说⼀点,从bias和variance的讨论中也可以看到data对于模型训练的重要性,假如我们拥有全部可能的数据,就不需要所谓的tradeoff了。但是既然这是不现实的,那么尽量获取和使⽤合适的数据就很重要了。
交叉验证是⼀种通过估计模型的泛化误差,从⽽进⾏模型选择的⽅法。没有任何假定前提,具有应⽤的普遍性,操作简便, 是⼀种⾏之有效的模型选择⽅法。
1. 交叉验证的产⽣
举三个简单例⼦,
1.
2. 开枪问题
outsource
想象你开着⼀架⿊鹰直升机,得到命令攻击地⾯上⼀只敌军部队,于是你连打数⼗梭⼦,结果有⼀下⼏种情况:
1.⼦弹基本上都打在队伍经过的⼀棵树上了,连在那棵树旁边等兔⼦的⼈都毫发⽆损,这就是⽅差⼩(⼦弹打得很集
中),偏差⼤(跟⽬的相距甚远)。
2.⼦弹打在了树上,⽯头上,树旁边等兔⼦的⼈⾝上,花花草草也都中弹,但是敌军安然⽆恙,这就是⽅差⼤(⼦弹到处sheepdog
都是),偏差⼤(同1)。
3.⼦弹打死了⼀部分敌军,但是也打偏了些打到花花草草了,这就是⽅差⼤(⼦弹不集中),偏差⼩(已经在⽬标周围
了)。
4.⼦弹⼀颗没浪费,每⼀颗都打死⼀个敌军,跟抗战剧⾥的⼋路军⼀样,这就是⽅差⼩(⼦弹全部都集中在⼀个位置),
偏差⼩(⼦弹集中的位置正是它应该射向的位置)。
3.再来个射箭问题:假设你在射箭,红星是你的⽬标,以下是你的射箭结果
nba排名榜2013分析:
我们可以看到,在Low Variance的⼀列,数据分布是⾮常集中的,恩,⼩伙⼦,你的稳定性很好,⽅差很⼩,表现的很聚集。⽽第⼆列就是High Variance的⼀列,机智的你可能⼀下就看出来了,没错,飘来飘去的,⾮常不稳定!
看下Low Bias这⼀⾏,命中红⼼的次数很多对不对,说明你还是有准头的,⾄少偏差不算⼤,我要是
裁判,我就不管你没射中⼏只箭飘到哪去了(⽅差⼤,不集中),毕竟我看的是命中了多少(准确度),⽽High Bias这⼀⾏,明显可以看出⼀⽀箭都没射中,表现很差,偏离⽬标好远,负分滚粗!
fdisk综合起来看,我们需要的模型最好是两个L,⼜准确⼜稳定,妥妥的,但是,这个在现实模型中是不会存在的。你只能权衡着来
另类圣诞节Bias,Variance和Overfitting(过拟合),Underfitting(⽋拟合)blamed
过拟合,也就是我对训练样本能够百分百命中了,超级拟合了,但是测试时候就掉链⼦,拟合很差,也就是我们说的泛化性能不好的问题,所以如果太追求在训练集上的完美⽽采⽤⼀个很复杂的模型,会使得模型把训练集⾥⾯的噪声都当成了真实的数据分布特征,从⽽得到错误的数据分布估计。
⼀句话,过拟合会出现⾼⽅差问题
⽋拟合:训练样本太少,导致模型就不⾜以刻画数据分布了,体现为连在训练集上的错误率都很⾼的现象。
introduce⼀句话,⽋拟合会出现⾼偏差问题
怎么避免过拟合和⽋拟合
避免⽋拟合(刻画不够)
1. 寻找更好的特征-----具有代表性的乔布斯演讲视频
2. ⽤更多的特征-----增⼤输⼊向量的维度
避免过拟合(刻画太细,泛化太差)
1. 增⼤数据集合-----使⽤更多的数据,噪声点⽐重减少
2. 减少数据特征-----减⼩数据维度,⾼维空间密度⼩
3. 正则化⽅法-----即在对模型的⽬标函数(objective function)或代价函数(cost function)加上正则项
4. 交叉验证⽅法
4. 为什么要⽤交叉验证(Cross-Validation)
1.交叉验证,这是仅使⽤训练集衡量模型性能的⼀个⽅便技术,不⽤建模最后才使⽤测试集
dustin
2.Cross-validation 是为了有效的估测 generalization error(泛化误差) 所设计的实验⽅法,⽽generalization error=bias+variance
⾸先:bias和variance分别从两个⽅⾯来描述了我们学习到的模型与真实模型之间的差距。Bias是 “⽤所有可能的训练数据集训练出的所有模型的输出的平均值” 与 “真实模型”的输出值之间的差异;Variance则是“不同的训练数据集训练出的模型”的输出值之间的差异。
将原始数据分成K组(⼀般是均分),将每个⼦集数据分别做⼀次验证集,其余的K-1组⼦集数据作为训练集,这样会得到K个模型,⽤这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标.K⼀般⼤于等于2,实际操作时⼀般从3开始取,只有在原始数据集合数据量⼩的时候才会尝试取2. ⽽K-CV 的实验共需要建⽴ k 个models,并计算 k 次test ts 的平均辨识率。在实作上,k 要够⼤才能使各回合中的 训练样本数够多,⼀般⽽⾔ k=10 (作为⼀个经验参数)算是相当⾜够了。
看不清上⾯的就来⼀幅更简单的