采用机器学习的一些建议
类似引言的部分
假设你已经训练好了一个线性回归模型来预测房屋的价格,但是你在做新房屋价格预测的时候,发现误差太大了,这时该怎么办呢?
线性回归成本函数:
(1)找更多的训练数据
(2)减少特征数
(3)增加特征数
(4)增加多项式特征(比如x1x2,x1^2……)
(5)增大λ
(6)减小λ
机器学习诊断
诊断(Diagnostic):就是一种对学习算法是否工作的测试,同时指导提高算法性能。
诊断会费些时间来实现,但是实现之后你就可以有效的利用时间了。
对hypothesis的评估
在实现房屋预测的系统时,我们得到模型:
该模型对训练数据有很好的拟合
但是,在对新房屋预测时,却表现很糟糕。显然,发生了过拟合。我们有没有办法,让模型还未投入新数据使用之前,就检验是否过拟合呢?
有!通常数据D并不是全部都拿当训练数据的,我们会偷偷藏起来一部分做测试来检验模型。
一般是70%拿去当训练数据,拿30%做测试。30%的数据做测试,其实就是看模型的泛化能力,在《《A Few useful things to Know About machine Learning》读后感》中说到,泛化能力,其实就是在新的数据上的表现能力。
模型的选择/训练/验证/测试
看上面房屋预测的曲线图,如果参数θ在训练数据上拟合的很好的话,那J(θ)在训练数据上的错误就要比没看过的数据上小很多。
(就是Hsuan-Tien Lin所讲的Ein表现很好,而Eout实际比较大。这样Ein和Eout就不接近了。)
如何选模型
所以,我们如何选择模型呢?
比如,我们要在上面的10个模型中做选择。选哪一个呢?
根据前面说的,需要测试误差。所以,70%的D去训练上面的h,求出了各自的参数θ。然后用30%的数据做测试求误差。假设,我们进行误差测试之后,发现h5,即d=5的模型误差很小。
我们选它做模型。
但是这里就有个问题,如果h5对30%的测试数据,存在运气很好的情况,它因为运气好而拟合的好,所以误差小。针对这样的情况,又想出了一个法子,进行交叉验证。就是把数据集分成三个部分:60%训练数据;20%交叉验证数据;20%测试数据。
这样就有三个数据集需要算误差:
误差的计算方式一样,但目的不一样。
第一个求误差是为了求参数θ。
第二个求误差是为了选出模型。
第三个求误差是为了测试模型好不好。
还是上面的10个模型选择问题。
(1)用训练数据求参数θ
(2)用交叉验证数据求出误差最小的模型
(3)用测试数据测试这个模型的泛化能力。
诊断bias和variance
这个在《《A Few useful things to Know About machine Learning》读后感》中也提到了。
Bias是预测的h们的平均值和实际的偏差;
Variance是预测的h们之间的差异。
拟合问题Andrew中Week3中也提到过。
可以看到,特征选择维度越高拟合的就越好,就会造成过拟合。当我们计算这三个模型的train error(简称Jtrain)和cross validation error(简称Jcv),发现:
观察这个图:发现特征维度低的时候,欠拟合,Jtrain和Jcv都比较大,接着二者随着特征增多而减少;特征增加到了一个程度之后,Jtrain继续减少,Jcv反而开始变大;特征维度很高时,Jtrain很小,Jcv很大,过拟合。
欠拟合时,bias大,Jtrain和Jcv都比较大,但是Jtrain≈Jcv;
过拟合时,variance大,Jtrain很小,Jcv很大,Jcv>>Jtrain。
为防止过拟合,我们采用的是正规化的方式,即在J后面加一项regularization项。(Week3(下))
合适的lambda
但是,λ的大小对拟合程度有很大影响:
λ太大会使θj趋于0,最后只剩一个不用受惩罚的阈值θ0,造成欠拟合;
λ太小对θ影响就不大,还是过拟合。
所以λ要选的合适才行。
怎么选到合适的λ呢?以逻辑回归为例:
(1)数据集分为:训练集,交叉验证集和测试集。
(2)λ从0,0.01,0.02之后每个都是前一个的2倍,一直到10.24。一共12个λ。
(3)12个λ对应12个模型
(4)用训练数据集训练12个模型,分别求出它们的参数θ
(5)用交叉验证集求出Jcv最小的模型
(6)用测试集求(5)中选出的模型的泛化误差
看看λ的大小如何影响bias和variance:
大的λ,高bias,Jtrain≈Jcv,欠拟合
小的λ,高variance,Jtrain<<Jcv,过拟合
学习曲线
学习曲线是用来检验算法的学习效果。这里观察随着训练样本的数量(m)增加,Jtrain和Jcv的变化情况的曲线。
我们举个模型如下的例子:
由上面可以看出,随着训练数据m增加,Jtrain增加,Jcv变小。所以,学习曲线为:
从学习曲线来考虑bias和variance问题——增加m
(1)高bias问题
如果模型是
可以看出模型欠拟合,这时增加m
发现拟合效果还是糟糕。
这说明了,如果一个模型高bias,Jtrain≈Jcv,增加训练数据量是没用的。
(2)高variance问题
对于高variance的问题,Jtrain<<Jcv,增加训练样本数量,可以减小Jtrain和Jcv之间的差距,可以提高模型的效果。
综上,增加训练样本数量,对高variance有用,对高bias作用不大。
总结
回到本节最开始的问题:
假设你已经训练好了一个线性回归模型来预测房屋的价格,但是你在做新房屋价格预测的时候,发现误差太大了,这时该怎么办呢?
(1)找更多的训练数据
(2)减少特征数
(3)增加特征数
(4)增加多项式特征(比如x1x2,x1^2……)
(5)增大λ
(6)减小λ
通过本节的分析,我们应该知道了它们的作用。
(1)找更多的训练数据——适用于高variance
(2)减少特征数——适用于高variance
(3)增加特征数——适用于高bias
(4)增加多项式特征(比如x1x2,x1^2……)——适用于高bias
(5)增大λ——适用于高bias
(6)减小λ——适用于高variance
神经网络和拟合问题
这是一个small的神经网络,参数少,很容易欠拟合,但是它计算很容易
这个的神经网络比较复杂,参数多,容易过拟合,计算复杂。用正规化项解决过拟合问题。