标签:
当在预测时,有很大的误差,该如何处理?
1.得到更多的训练样本
2.选取少量的特征
3.得到更多的特征项
4.加入特征多项式
5.减少正则项系数
6.增加正则项系数
很多人,在遇到预测结果并不理想的时候,会凭着感觉在上面的6个方案中选取一个进行,但是往往花费了大量时间却得不到改进。
于是引入了机器学习诊断,在后面会详细阐述,
如下,给出了一种评估假设函数的标准方法:
将这些数据集分为两个部分:Training set 和 Test set, 即是 训练集和测试集,
其中一种典型的分割方法是, 按照7:3的比例 ,将70%的数据作为训练集, 30%的数据作为测试集 。
PS:如果数据集是有顺序的话,那么最好还是随机取样。比如说上图的例子中,如果price或者size是按递增或者递减排列的话,那么就应该随机取样本,而不是将前70%作为训练集,后30%作为测试集了。
接下来 这里展示了一种典型的方法,你可以按照这些步骤训练和测试你的学习算法 比如线性回归算法 。首先 ,你需要对训练集进行学习得到参数
Linear Regreesion error:
Logistic Regression error:
假如你想要确定对于某组数据, 最合适的多项式次数是几次 ?怎样选用正确的特征来构造学习算法 或者假如你需要正确选择 学习算法中的正则化参数λ ,你应该怎样做呢?
Model Selection:
1.首先,建立d个model 假设(图中有10个,d表示其id),分别在training set 上求使其training error最小的θ向量,那么得到d个
2.然后,对这d个model假设,带入
PS: 其实d表示dimension,也就是维度,表示该hypothesis的最大polynomial项是d维的。
PS’: 一般地,
选择第一个模型(
接下来,我们需要做的是对所有这些模型,求出测试集误差(Test Error),依次求出
这里选择的是五项式。那么问题来了,现在我想知道这个模型能不能很好地推广到新样本,我们还能通过测试集来验证一般性吗?这看起来似乎有点不合理,因为我们刚才是通过测试集跟假设拟合来得到多项式次数
所以,为了解决这个问题,在模型选择中,我们将数据集不仅仅是分为训练集,测试集,而是分为训练集,交叉验证集和测试集{60%,20%,20%}的比例
一种典型的分割比例是 将60%的数据分给训练集,大约20%的数据给交叉验证集 ,最后20%给测试集。这个比例可以稍微调整,但这种分法是最典型的。
按照上面所述的步骤,这里不再赘述! (详情在上面Model Selection下面有解释)
当你运行一个学习算法时 ,如果这个算法的表现不理想, 那么多半是出现 两种情况 :要么是偏差比较大, 要么是方差比较大, 换句话说, 出现的情况要么是欠拟合, 要么是过拟合问题 。
那么这两种情况, 哪个和偏差有关, 哪个和方差有关, 或者是不是和两个都有关 。搞清楚这一点非常重要 ,因为能判断出现的情况, 是这两种情况中的哪一种, 其实是一个很有效的指示器, 指引着可以改进算法的 ,最有效的方法和途径 。
1. bias指hypothesis与正确的hypothesis(如果有的话)的偏差.
2. varience是指各样本与hypothesis的偏差和
从下图,横轴表示多项式的次数d,纵轴表示误差error,我们可以看出,当d很小时,也就是处于underfit状态时,
这里就产生了bias和variance的概念:
bias: |
variance: |
假设你的学习算法表现的不尽如人意,没有达到你的期望,如何来判定它是一个偏差(bias)的问题还是方差(variance)的问题?我们可以计算他们的训练集误差和交叉验证集误差,如果它们落入了上图的“头部”区域,可以判断是偏差(欠拟合)问题,如果落入了“尾部”区域,可以判断是方差(过拟合)问题,如下图所示:
对于数据集,我们仍将它划为3份:训练集,验证集,测试集。对于给定的正则化模型,例如上面的例子,我们按
偏差/方差可以作为正则化参数
曲线的左端对应的是高方差问题 ,此时我们的 λ 值取得很小很小, 因此我们会对数据过度拟合, 所以由于过拟合的原因, 交叉验证集误差也会很大,当我们改变正则化参数 λ 的值时, 交叉验证集误差和训练集误差随之发生的变化, 当然 ,在中间取的某个 λ 的值 ,表现得刚好合适 ,这种情况下表现最好 ,交叉验证集误差或者测试集误差都很小
能使交叉验证集误差最小的那个点, 然后选出那个与之对应的参数 λ 的值。
考虑假设函数与样本m的关系:
以下通过学习曲线来考虑高偏差和高方差的问题。对于高偏差欠拟合问题:
不难发现,不管样本数量如何增加, 这条直线也基本不会变化太大, 因为这条直线是对这组数据最可能也是最接近的拟合,但一条直线再怎么接近 ,也不可能对这组数据进行很好的拟合。
而对于高方差过拟合问题:
增大样本数目后,模型的泛化能力会好一些,一些是高方差过拟合问题的学习曲线:
如果我们要考虑增大训练集的样本数,也就是在这幅图中向右延伸曲线,我们大致可以看出这两条学习曲线 ,蓝色和红色的两条曲线 正在相互靠近。 因此 ,如果我们将曲线 向右延伸出去 ,那么似乎训练集误差很可能会逐渐增大,而交叉验证集误差则会持续下降。 当然我们最关心的还是交叉验证集误差 或者测试集误差 。对吧 ,所以从这幅图中 ,我们基本可以预测如果继续增大训练样本的数量 ,将曲线向右延伸 交叉验证集误差将会 逐渐下降 。所以,在高方差的情形中,使用更多的训练集数据对改进算法的表现,事实上是有效果的 。
获取更多的训练样本 - 解决高方差
尝试使用更少的特征的集合 - 解决高方差
尝试获得其他特征 - 解决高偏差
尝试添加多项组合特征 - 解决高偏差
尝试减小
尝试增加
当你在进行神经网络拟合的时候, 如果你要进行神经网络的拟合 比如说 一个相对比较简单的神经网络模型 。相对来讲 ,它的隐藏单元比较少 ,甚至只有一个隐藏单元 。如果你要进行神经网络的拟合, 其中一个选择是 ,选用一个相对简单的网络结构 ,比如说只有一个 隐藏层 或者可能相对来讲, 比较少的隐藏单元。 因此像这样的一个简单的神经网络 ,参数就不会很多 ,很容易出现欠拟合 。
这种比较小型的神经网络 ,其最大优势在于计算量较小 。
与之相对的另一种情况 :是相对较大型的神经网络结构, 要么隐藏层单元比较多 比如这一层中的隐藏单元数就很多, 要么隐藏层比较多 。因此这种比较复杂的神经网络 ,参数一般较多, 也更容易出现过拟合 。这种结构的一大劣势, 也许不是主要的 但还是需要考虑: 那就是当网络中的 神经元数量很多的时候, 这种结构会显得 计算量较大 。
最后,你还需要选择 隐藏层的层数,你是应该用一个 隐藏层呢?还是应该用三个呢 ?就像我们这里画的,或者还是用两个隐藏层呢?
默认的情况是,使用一个隐藏层,但是如果你确实想要选择 多个隐藏层,你也可以试试 把数据分割为训练集、验证集 、和测试集。然后使用交叉验证的方法比较一个隐藏层的神经网络 ,然后试试两个 ,三个隐藏层 ,以此类推, 然后看看哪个神经网络在交叉验证集上表现得最理想。
参考:
Coursera机器学习
Coursera公开课笔记
Stanford机器学习—第六讲. 怎样选择机器学习方法、系统
Coursera机器学习-第六周-Advice for Applying Machine Learning
标签:
原文地址:http://blog.csdn.net/dingchenxixi/article/details/51479003