目录
今天跟大家分享下如和评价自己的算法,如何防止过度拟合和欠拟合问题。以及机械学习中的诊断法。
1、如何评价你的算法?
为了可以确保评价我们的假设函数,我们要做的是,把原有的训练样本分成两分,把原有的训练样本的70%作为新的训练样本,把剩下的30%作为算法的测试样本。但是要注意的是,如果我们的训练样本本身是有规律的,那么我们将采用随机的方式选取70%作为新的训练样本,将剩下的作为测试样本。
误差计算error:
①对于线性回归模型的话,我们可以通过新的训练样本计算出θ的值,然后计算出在测试样本中的代价函数J(θ),注意代价函数中的m是测试样本的个数。
②对于逻辑回归模型的话,我们通常对于error的定义为,当我们计算出该样本可能为1时(h(x)>=0.5),但是实际结果为0。最后都是对计算出的error误差求平均值,我们能大概知道这组结果的拟合水平。
2、模型选择
当我们采用上述方法,将样本只分为training set(训练集) 和testing set(测试集)时,我们首先利用training set 计算出θ和几个模型。然后利用testing set来选择出代价函数最小的模型。这时就有一个问题了,如果我们继续使用testing set来计算泛化误差是不是不能很好的说明模型的泛化程度呢?(相当于我是出卷人又是判卷人)其实testing set不能用来确定模型的同时又来评估模型的泛化能力。
这时我们采用一种新的分类方法,将我们的样本分为训练集(training set)、交叉验证集(cross validation)、测试集(testing set),通常我们采用的比例是训练集:交叉验证集:测试集=6 : 2 : 2 。交叉训练集又简称为cv。
这时我们就解决了上述的问题,我们可以采用交叉验证集来选择代价函数最小的模型,然后用测试集来评价模型的泛化程度。
3、模型有关的偏差问题和方差问题
如果这个算法的表现不理想,那么多半是出现两种情况:要么是偏差(欠拟合)比较大,要么是方差(过度拟合)比较大。其中training error指训练集误差,cross validation error指交叉验证集误差。我们可以观察到随着d上涨,交叉验证集误差先降后升。
①当为高偏差(欠拟合)的时候:训练误差会很高,而且训练误差≈交叉验证误差
②当为高方差(过度拟合)的时候:训练误差会很小,而且训练误差<<交叉验证误差
4、正则化有关的偏差问题和方差问题
首先,我们需要明确的是,正则化和验证集是两种训练模型的方法,我们应该先进行正则化的选择,在采用训练集的方法。
①当λ的值过大,也就是惩罚度过高时,θ的值几乎接近于0,我们的模型就约等于h(x)≈θo,模型几乎为一条直线,就产生了欠拟合的问题。
②当λ的值过小,θ几乎没有什么约束条件,那么就容易出现过度拟合的问题。
这时我们就应该选择合适的λ值,我们可以用训练集计算出θ和模型,然后利用交叉验证集选择一个使代价函数最小的λ的值。
我们从图中易观察到,λ的值越大时,就产生了高偏差(欠拟合)问题;λ的值过小就产生了高方差(过度拟合)问题。
5、学习曲线
当已有一个训练模型,希望得到改进时首先应当明确现在是过拟合还是欠拟合,方法就是使用不同的样本数量来对当前模型。简单来说是以m(训练集样本数)为横轴,训练集误差和交叉验证集误差为纵轴的曲线 。
①高偏差(欠拟合)当m很小时,训练误差很小,交叉验证集误差很大,随着m逐渐在增大,两者逐渐逼近且相等。这时说明增加训练集的数量并不会有帮助。
②高方差(过度拟合)当m很小时,训练误差很小,交叉验证集误差很大,随着m逐渐在增大,两者逐渐逼近,但仍会有十分明显的差别,则说明模型还有学习的潜能。这时增加训练集的数量会有帮助。
在需要改进现有模型时,可通过画学习曲线,划分数据集等方式来诊断模型情况,由此制定合适的改进方案。解决方法如下: