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还没时间做,留个坑以后回来补。。