机器学习从入门到XX(四):过拟合和正则化
过度拟合考虑如下的一个数据集的三种拟合曲线
图1采用$ y = θ_0 + θ_1x $的直线作为假设函数,然而训练数据集看起来并不适合直线,所以假设函数看起来不太合适。图2采用$ y = θ_0 + θ_1x + θ_2x^2 $,我们得到了一个拟合度更好的曲线。观察图3,貌似的,通过添加高阶特征,我们获得了更好的拟合。然而,如果加入过多的特征,尽管可以获得“完美”的拟合度,但是却不是一个好的预测函数。我们称图1叫 拟合不足或者叫 无论是线性回归还是逻辑回归都有这种情况,下面是逻辑回归的例子:
有两种主要的解决方案:
正则化的代价函数
$$ θ_0 + θ_1x + θ_2x^2 + θ_3x^3 + θ_4x^4 $$ 如果$ θ_3 、θ_4 $都为0,那么多项式就是个二次函数曲线。不过,我们不需要完全去掉这两个高阶项,只要让$ θ_3 、θ_4 $减小,甚至趋向于0即可。设置如下代价函数: $$ min_theta frac{1}{2m}sum_{i=1}^m (h_theta(x^{(i)}) - y^{(i)})^2 + 1000cdottheta_3^2 + 1000cdottheta_4^2 $$ 观察这个代价函数,我们在原先的代价函数中,增加两个额外的项,这两项会让过大的$ θ_3 、θ_4 $得到惩罚。因此,为了让代价函数的结果最小,算法会自动地选择比较小的$ θ_3 、θ_4 $,甚至接近0。从而得到几乎是接近二次函数的假设函数。 我们只要将所有的 $$ min_theta frac{1}{2m}sum_{i=1}^m (h_theta(x^{(i)}) - y^{(i)})^2 + λsum_{j=1}^nθ_j^2 $$ 这里的 用作业中的一个实际的例子来观察一下
这个样本有两个变量 $$ mapFeature(x)=begin{bmatrix}1 newline x_1 newline x_2 newline x_1^2 newline x_1x_2 newline x_2^2 newline x_1^3 newline vdots newline x_1x_2^5 newline x_2^6end{bmatrix} $$ 如果
如果
如果
梯度下降推导前面给出了引入正则项的代价函数: $$ min_theta frac{1}{2m}sum_{i=1}^m (h_theta(x^{(i)}) - y^{(i)})^2 + λsum_{j=1}^nθ_j^2 $$ 观察发现,正则化的代价函数引入的额外项$ λsum_{j=1}^nθ_j^2 $,是从 $$ begin{align*} & text{Repeat} lbrace newline & theta_0 := theta_0 - alpha frac{1}{m} sum_{i=1}^m (h_theta(x^{(i)}) - y^{(i)})x_0^{(i)} newline & theta_j := theta_j - alpha left[ left( frac{1}{m} sum_{i=1}^m (h_theta(x^{(i)}) - y^{(i)})x_j^{(i)} right) + frac{lambda}{m}theta_j right] & j in lbrace 1,2...nrbracenewline & rbrace end{align*} $$ 上述公式的第二部分可以改写成: $$ θ_j := θ_j(1 - αfrac{λ}{m}) - αfrac{1}{m}sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})x_j^{(i)} $$ 上式的第一项$ 1 - αfrac{λ}{m} < 1 $,这相当于在原来的基础上又对$ θ_j $作了一定比例的缩小。 逻辑回归代码总结采用 function [J,grad] = costFunction(theta,X,y) m = length(y); % number of training examples J = 0; grad = zeros(size(theta)); J = (1 / m) * ( (-1 .* y') * log(sigmoid((X * theta))) - (1 - y)' * log(1 - sigmoid((X * theta))) ); grad = ((1 / m) .* sum((sigmoid((X * theta)) - y) .* X))'; end 调用 options = optimset('GradObj','on','MaxIter',400); % Run fminunc to obtain the optimal theta % This function will return theta and the cost [theta,cost] = ... fminunc(@(t)(costFunction(t,y)),initial_theta,options); 正则化的代价函数,这里需要注意的是正则项中是不对$ theta_0 $惩罚的: function [J,grad] = costFunctionReg(theta,y,lambda) m = length(y); % number of training examples J = 0; grad = zeros(size(theta)); theta_2 = theta; theta_2(1) = 0; J = (1 / m) * ( (-1 .* y') * log(sigmoid((X * theta))) - (1 - y)' * log(1 - sigmoid((X * theta))) ) + sum(theta_2.^2) * lambda / (2 * m); grad = ( (1 / m) .* sum((sigmoid((X * theta)) - y) .* X) + ( (lambda / m) .* theta_2' ) )'; end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |