吴恩达 机器学习 第六周 笔记+编程

  • Post author:
  • Post category:其他


Evaluating a Learning algorithm

假设在用linear regression 预测房价,然后你发现预测结果与实际结果偏差甚远。what should you try next?



然后 这里 引入两个概念,训练集和测试集。一般来说,训练集占70%,测试集占30%。

一般来说,都是先通过训练集求得θ然后再丢到测试集中测试测试误差。

图中,test error 公式跟linear regression的一样,就下标变了。


为了进一步精确我们的hypothesis我们引入交叉验证Cross validation

其中,训练集占60%,交叉验证集占20%,测试集占20%

以上所交代的是关于机器学习模式的选择,考虑该使用哪种多项式,然而regularization正则化中的λ 和 样本数量m也是影响算法性能的重要元素。以下引入 偏差(bias)和方差(variance)

前面我们所学习过的overfit和underfit中,underfit(欠拟合)就是典型的高bias,overfit则是典型的高variance

我们来看这两个图,横坐标是degre表示hypothesis的项数,纵坐标为error 误差数,在这里,底下那条线代表training error,而上面那条则是cross validation error, 可以看出,上面那条线是两边高中间低,而当d很小时,容易产生underfit(一条直线),导致高bias,而当d很大(式子够复杂)则容易导致高variance

正则化的linear regression,当λ很大时,θ≈0,导致函数趋向于一条直线,那自然是underfit

而当λ很小,则θ的权重就会很大,容易overfit

下面讲如何选择λ

首先设立一个λ集合(吴老师喜欢)= {0, 0.01, 0.02, 0.04, 0.08, 0.16, 0.32, 0.64, 1.28, 2.56, 5.12, 10.24]


更正:建立了λ集合后再建立各种model(各种多项式,以便选出最好的θ),看下图中,theta = trainLinearReg,这个函数就是在λ的循环下,遍历所有已经产生的多项式model(也就是说用正常的for循环来写,就是lambda乘model个数次循环),在θ和λ的共同参与下得出最好的θ(仅仅是θ),然后再用这个θ代入costfunction中计算(这里计算error_train和error_val用于作图,不要带λ)。下图代码到这里就完了,然后正常的后续操作就是找出最小的error_val时所使用的θ和参与计算θ的λ,最后把这一对组合送入测试集中,看看效果。以下为原笔记。


再补充,为啥计算err_train和err_val时不带λ,但做曲线的时候又用到λ,因为θ使用λ参与运算而来的,如果在err_train和err_val中再来个regularization会导致结果被修正,就是说得不到我们想要看到的学习曲线效果。

然后对这些λ分别代入计算最小的costFunction, 然后将得到的θ代入计算training error 和 cross validation error (这里图中并没有写training error,但之后的编程中会出现。这里的计算train error 和 cv error 都不能代入λ,就是说λ= 0)

这里先提前贴上点代码帮助理解

trainLinearReg.m

图中函数就是刚说的,costfunction用λ,  train和cv 不用 ,然后这个坐标图是以λ为横坐标

学习曲线(Learning Curve)


学习曲线可以很好的帮助我们观察learning algoritm出现的问题,如上图是

hypothesis比较简单的情况下 ,可以看到cv error和train error曲线逐渐靠近,

最后趋于直线,

所以对于high bias的情况,增加样本数量m是没什么帮助的,因为最后是直线。。。。

而对于high variance来说 ,复杂的hypothesis往往带来overfit,而其对应的学习曲线两条逐渐相交的线,而且可以看到,两条线中是有很大的gap,由此可以看出,增大training example可以带来很大的帮助(线接近。。)

这里贴上点代码帮助理解

这里的i代表着横坐标,从少到多的情况

基于上面两张图,我们可以得出以下:

再来看下神经网络:


Prioritizing what to work on: Spam classificaton example

假设要做一个辣鸡邮件分类的东东。


这里给了一些推荐的方法。其中画重点 error analysis

过后,就是怎么设计一个 准确度高的学习算法


简单来说就是有没有足够的information 来预测y,还有如果让人类专家通过这些数据能不能很自信地预测出y。

查准率和查全率(precision and recall)

举个栗子,学习算法算出1%的人有cancer,而事实上只有0.5%的人有cancer。如果忽略所有的x,并预测所有的病人都没cancer,那么学习算法的error只有0.5%(很厉害吧),然而这样子根本不可行,在这里这0.5%就是偏斜类(skewed classes)

显然,只用准确率来平衡算法的好坏是不可行的,。

因此,我们引入查准率(precision)和查拳率(recall)

画的有点丑。简单说,就是如果预测的结果和事实上的结果一致则为True,如果预测的结果是1则为postive,其他情况就反过来。

P(precision) = True postive(预测对的且结果为1的数量)/ #predicted postive(预测结果为1的数量) = True postive/ True postive + False postive

R(recall) = True postive(预测对的且结果为1的数量)/ #actual postive(事实结果为1的数量) = True postive/ True postive + False negative

简单看图就是true postive/ 第一行就是P,  true postive/ 第一列就是R

这里附上西瓜书上的图

然后附上一个例子—-买瓜

—希望将好瓜尽可能多的选出来,可以通过增加选瓜的数量来实现。如果全部西瓜都选上,那么好瓜也必然选上,但查准率precision会较低;如果希望选到的瓜中好瓜比例高,则可只挑选最有把握的瓜,但这样会漏掉不少好瓜,使得查全率较低。

trade of P and R


接下来就是怎么权衡P和R了,因为P和R是一对相反的值,如图。如果我们设置阈值(threshold)来判断这个人是否有cancer(if threshold > 0.5  , y= 1)之类的,那么这个阈值又该怎么取呢

看图,权衡P和R,如果用平均数(Average)来衡量就会导致误差有大,看图看图。

这里推出一种全新体验,F1score ,公式在上面。

然后最后的最后,就是说用大量数据的好处ba.labala,对高variance有好处啦(看上面的学习曲线就能理解)

编程:

其他的我上面已经贴出大部分了,理解了就挺简单的。不懂就出门隔壁blog

optional还没时间做,留个坑以后回来补。。



版权声明:本文为YzarrK原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。