评估学习算法Evaluating a learning algorithm
搭建完算法后下一步做什么?
需要用机器学习诊断法,排除掉list上的,至少一半的方法,留下那些确实有用的方法
评估Evaluating a Hypothesis
比如线性回归算法
首先 你需要对训练集进行学习得到参数θ ,具体来讲就是最小化训练误差J(θ),这里的J(θ)是使用那70%数据
我将用J下标test来表示测试误差,取出你之前从训练集中学习得到的参数θ放在这里 ,来计算你的测试误差 ,我们使用包含参数θ的假设函数对每一个测试样本进行测试
然后通过假设函数和测试样本
比如逻辑回归(和线性回归类似)
模型选择及train/validation/test sets
要评价某个假设 我们通常采用以下的方法 ,给定某个数据集 ,与之前分为训练和测试集不同的是 我们要将其数据分为三段 ,第一部分还是叫训练集 ,所以 我们还是称这部分为训练集 ,第二部分我把它叫做交叉验证集
原因:
左图是只对数据集进行训练和测试的分类,1-10是都拟合训练集的多项式,现在要选择能最好地拟合你数据的模型,换句话说 你应该选择一次函数 二次函数 还是三次函数呢 ....等等一直到十次函数 ,所以d表示的就是你应该选择的多项式次数
这样对于训练得出的theta5最拟合测试集的参数,但是不能说明推广到一般时的效果,因为我是找了一个最能拟合测试集的参数d ,因此我再用测试集 来评价我的假设就显得不公平了 ,因为我已经选了一个能够最拟合测试集的参数
右图插入验证集,我们刚才做的是拟合出最好的系数d等于4,并且我们是通过交叉验证集来完成的,因此 这样一来这个参数d ,这个多项式的次数 就没有跟测试集进行拟合 ,这样我们就回避了测试集的嫌疑,我们可以光明正大地使用测试集,来估计所选模型的泛化误差了
诊断:variance方差 vs bias偏差
在这一节中,我们将检验多项式d的次数与我们的假设的欠拟合或过拟合之间的关系。
——我们需要区分偏差还是方差是导致错误预测的原因。
——高偏差是欠拟合,高方差是过拟合。理想情况下,我们需要在这两者之间找到一个黄金分割线。
随着多项式阶数d的增加,训练误差趋于减小。同时,交叉验证误差会随着d的增大而减小,然后随着d的增大而增大,形成一条凸曲线。
正则化和偏差/方差
在我们在训练模型的过程中,一般会使用一些正则化方法来防止过拟合。但是我们可能
会正则化的程度太高或太小了,即我们在选择λ 的值时也需要思考与刚才选择多项式模型次
数类似的问题。
我们选择一系列的想要测试的 𝜆 值,通常是 0-10 之间的呈现2 倍关系的值(如:
0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10共12 个)。我们同样把数据分为训练
集、交叉验证集和测试集。
选择𝜆的方法为:
1.使用训练集训练出12 个不同程度正则化的模型
2.用12 个模型分别对交叉验证集计算的出交叉验证误差(交叉验证不需要正则化或者lambda=0)
3.选择得出交叉验证误差最小的模型
4.运用步骤3 中选出模型对测试集计算得出推广误差,我们也可以同时将训练集和交叉验证集模型的代价函数误差与λ 的值绘制在一张图表上:
当 𝜆 较小时,训练集误差较小(过拟合)而交叉验证集误差较大
随着 𝜆 的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后
增加
learning curves
m表示训练集个数,随着数量越来越高,Jt和Jcv会越来越接近
高偏差:如果一个学习算法正在经历高偏差,增加训练个数,也不会有好的缓解,依然有高的错误率
如果经历高方差,增加训练的数据可能会有所帮助
下一步如何做
课后测试:
课后编程:
建一个垃圾邮件的分类器
设置一些单词,邮件中有此单词的设置为1,无设为0;
提高准确性:
- Collect lots of data (for example "honeypot" project but doesn't always work)
- Develop sophisticated features (for example: using email header data in spam emails)
- Develop algorithms to process your input in different ways (recognizing misspellings in spam).
It is difficult to tell which of the options will be most helpful.
错误分析
把误差结果作为一个单一的数值来计算是非常重要的。否则很难评估算法的性能。例如,如果我们使用词干分析,这是将同一个不同形式的单词(fail/failing/failed)作为一个单词(fail)处理的过程,并且得到3%的错误率而不是5%,那么我们肯定应该将其添加到我们的模型中。然而,如果我们试图区分大写和小写字母,最终得到的错误率是3.2%,而不是3%,那么我们应该避免使用这个新特性。因此,我们应该尝试新的东西,得到一个错误率的数值,并根据我们的结果决定是否要保留新的特征。
偏斜类(skewed classes)
倾斜类的错误度量
查准率(precision)和召回率(recall)
actual=1&predicted=1表示真阳性,也就是预测是1,真实的也是1,预测病人得了癌症,实际上客户也得了癌症
权衡查准率(precision)和召回率(recall)
可以设置threshold临界值的大小来调整查准率和召回率,如果希望非常精准的预测那么h必须要大于0.9才能设置predict为1
使用f1 score来评估算法,对于一个最完美的F值,如果查准率等于1 ,同时召回率,也等于1 ,那你得到的F值,等于1乘以1,除以2再乘以2,那么F值,就等于1
测试