过度拟合(overfitting)
什么是过度拟合
欠拟合:如果一个算法没有很好的拟合数据,比如一个本应该用二次多项式拟合的数据用了线性去拟合,导致最后拟合数据的效果很差。我们称之为欠拟合(underfitting)或者高偏差(high bias)。
过拟合:如果一个应该用二次多项式去拟合的数据用了四次多项式甚至更高次,在拟合这些数据的时候可能表现的很好,使得代价函数很低。但其实并不是一个好的模型,只要加入新的数据就有极大的可能性不匹配需要重新拟合。这种情况叫做过拟合(overfitting)或者高方差(high variance)。(个人想法:数据中存在着一些噪声,高阶多项式去拟合数据的时候将这些噪声也考虑进去,即尽可能的去拟合这些噪声点,使得代价函数非常的低甚至接近于0,最后拟合出来的模型“歪歪扭扭”,对应高阶多项式的图像,但是非常“脆弱不堪”,一旦有在边界上的数据出现,就会表现的很差)。
什么时候出现过拟合:特征太多而训练数据太少的时候
如何解决过拟合问题
- 减少特征的数量
- 手工去选取特征,留下重要的特征
- model selection algorithm
这种方法的缺点是会丢弃一些有用的信息
- 正则化(regularization)
- 保持所有的特征,但是减少 θj 的数量
当我们有很多特征,并且每个特征对结果 y 都有或多或少的一点影响的时候,正则化这种方法表现的很好。
正则化
原理
如果在线性回归中,此时已经过拟合了,且我们提出的多项式如下:
而实际上我们需要的是:
那么我们可以令代价函数如下:
“1000”只是代指一个非常大的数。那么如果要使代价函数最小, θ3≈0,θ4≈0 .也就是说, x3,x4 的权重是非常小的,可以忽略不计。所以我们改用二次多项式去拟合。
那么在正则化的过程中,我们并不知道该在哪个参数前面乘上一个较大的数“1000”。那么是这样处理的:
正则化参数
λ
如果过大,那么为了保证代价函数尽可能小,除了
θ0
以外的所有参数都约等于0,这样会产生欠拟合的情况。
如果过小,效果不佳,仍然过拟合。
为什么所有的
θ
都要乘以
λ
?
因为这样可以是所有
θ
值都非常小,最后产生的曲线不会因为高次多项式而变的“歪歪扭扭”,而是一条近似最佳拟合的曲线,但是由于高次项仍然存在但是权重很小,所以扭曲的程度非常的小。
正则化线性回归
求 θ 的两种方法:
- 梯度下降
代价函数 J(θ) 在上面已经给出,那么为了得到 θ 的值,我们定义的更新过程如下:
- 标准方程
在这里提一下在线性回归中没有提及的
XTX
不可逆的情况:
那么正则化,可以在m远远小于n的情况下也可以得到可逆的矩阵(
λ≠0
)。
todo:推导该公式
正则化逻辑回归
- 梯度下降
cost funtion:
更新过程:
这里的式子看起来和线性回归中的一样,但是 hθ(x) 其实是不一样的。
- Advanced optimization
function [jVal, gradient] = costFunction(theta)
jVal = [code to compute J(\theta)];
gradient(1) = [code to compute $\frac{\partial}{\partial\theta_0}J(\theta)$];
...
gradient(n+1) = [code to compute $\frac{\partial}{\partial\theta_n}J(\theta)$];
将这个函数带入fminunc函数中:
options = optimset('GradObj','on','MaxIter','100');
initialTheta = zeros(2,1);
[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);
todo:使用fminunc函数到具体的问题中,来理解该算法的具体应用和优势