您的位置:首页 > 移动开发

(四)Advice for applying machine learning[实施机器学习的一些建议]

2015-03-28 15:20 429 查看
本来是打算按照code的流程梳理思路的,但是标题还是这个适合一些。废话不多说,开始!

当我们采用机器学习算法的时候,很多时候并不是写完算法就万事大吉了,有时候算法在training set上跑的很好,但是已在test set上跑就瞎了,发现错误率很高,这个时候怎么办呢?所以我们不仅要会写出算法,还要会调试,把“敌人”牢牢掌握在手中。

Andrew的ppt中主要有三种尝试方法:

1. 增加training examples

2. 尝试增加features

3. 尝试改变正则项系数λ(我喜欢把它想成“惩罚项”)

接下来还是按照code的流程来,需要时会有补充。

首先我们以一个线性回归(带正则项)的例子为例,当然啦,首先把它的
linearRegCostFunction
搞定,就是计算J,gradθ,以及
trainLinearReg
这个就是调用
linearRegCostFunction
来优化θ的,和之前讲的一样,设置一个终止条件(比如最大迭代次数,那就不断优化θ,顺带着计算一下J),这些搞定后,我们就可以开始我们的调教调试了。

training examples的影响

首先我们考察training examples对训练的影响,看下面代码:

for i = 1:m
theta = trainLinearReg(X(1:i, :), y(1:i), lambda);
error_train(i) = linearRegCostFunction(X(1:i, :), y(1:i), theta, 0);
error_val(i) = linearRegCostFunction(Xval, yval, theta, 0);
end


上面的代码很直观,就是error_*(i)中的值就是当training sets有i个sample时其J的值。下图就是对于习题中给出的例子画出的图:



可以看到随着training sets的samples的增加,训练集&验证集的J都是减小的(这不是正常的嘛,汪)

feature的个数的影响

接下来我们看看feature的影响,我们这里采用的是增加次方的方法(这么叫听起来好low ~ ~)。

比如原来x(i)={1,x},现在我们变成{1,x,x2,x3,…,xp}。

其实我们观察数据一般可以看出来,如果成二次曲线,那么采用直线方程一般会造成高得bias。

注意

1. 增加了多个feature,一般要归一化:xnew=x−μσ,至于原因,参见之前内容。

2. 有多个feature的时候,一般要正则化,给他们点“惩罚”,防止过拟合。

还是采用上面code的算法,我们得到了对于不同feature(p=8,λ=3)的结果。

拟合的曲线:



learning curve(这里是在p=8,λ=3情况下训练集有i个samples的训练集&验证集的J):



这样就能对比发现不同的p的影响从而选择最优的p了。

不同的正则项系数λ

接下来我们还能调教一下λ的大小,直观上讲λ越大会有小的variance和大bias(因为惩罚的太厉害那些feature不敢”造次“,就不大会过拟合);反之亦然。

这里我们选择尝试的λ为[0,0.001,0.003,0.01,0.03,0.1,0.3,1,3,10]′;。在将training sets所有的samples都用上的情况下,结果如下:



可以看到,大约在λ=2.3−2.4的时候,在训练集和测试集上都有比较好的效果。

over,这次的整理完毕!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  machine-learning
相关文章推荐