如果有太多的feature,假设函数可能会很好的拟合训练集数据, 却无法正确的预测新的数据。
解决过拟合的办法:
- 减少feature数量: 手动或使用模型选择算法 来选择保留的feature, 但是这样有可能丢失一些信息
- 正则化 Regularization: 保留所有feature, 但是降低某些feature(和最终预测关联度比较小的) θⱼ参数的重要性/值 ( 适合有很多feature,每个feature都对预测起一点作用的场合)。
通过降低某些feature θⱼ参数的值 ,正则化可以得到更简单的假设图像,不容易出现过拟合。
右边的求和项,就是正则化项,参数λ 称为正则化参数, λ作用是在两个'求和'目标之间控制一个平衡关系。
注意,正则化项的j 是从1开始的,正则化并不处理θ₀ .
但是如果 λ的值过大, 比如10¹⁰, 会导致大部分的θⱼ接近0, 假设函数就近似h(x)=θ₀, 从而导致欠拟合 underfitting
.
我们把 梯度下降算法拆成两部分
- 对于 θ₀ , 迭代算法和 梯度下降算法一样
- 对于有 正则化项 参数 , θ [1,n]
我们在 线性梯度下降基础上右边加上一项
化简一下:
可以看到,跟 最新的线性回归算法相比, 正则化迭代算法 只是每次迭代,θⱼ 会略微变小
if λ > 0 ,
和 正则化线性回归 代价函数的处理一样,
正则化逻辑回归代价函数, 也是在 逻辑回归代价函数基础上,加上 正则化项:
和 正则化线性回归梯度下降算法一致,仅仅是 假设函数h(x) 的不同
θ₀ 无正则化处理
θ [1,n] :
function out = mapFeature(X1, X2)
% MAPFEATURE Feature mapping function to polynomial features
%
% MAPFEATURE(X1, X2) maps the two input features
% to quadratic features used in the regularization exercise.
%
% Returns a new feature array with more features, comprising of
% X1, X2, X1.^2, X2.^2, X1*X2, X1*X2.^2, etc..
%
% Inputs X1, X2 must be the same size
%
% 当 x1 幂为0时, x2 幂可以为 0-6 ,7 种组合, 其中 (0,0) 组合就是 x0
% 当 x1 幂为1时, x2 幂可以为 0-5 ,6 种组合
% 当 x1 幂为6时, x2 幂可以为 0 ,1 种组合
% 所以,最终有 1+2+3+4+5+6+7 = 28 个 feature
degree = 6; % 最高 6 次方项
out = ones(size(X1(:,1))); % 没必要吧,ones(size(X1)) 也一样
for i = 1:degree
for j = 0:i
out(:, end+1) = (X1.^(i-j)).*(X2.^j); % 这里,end是什么用法?
end
end
end
function [J, grad] = costFunctionReg(theta, X, y, lambda)
% Initialize some useful values
m = length(y); % number of training examples
% You need to return the following variables correctly
J = 0;
grad = zeros(size(theta));
hx = sigmoid( X * theta );
% 添加了 正则化部分
J= 1/m * sum( -y .* log( hx ) - ( 1-y ) .* log( 1- hx ) ) + lambda/(2*m )* ( theta' * theta ) ;
% 处理 feature 0 case
J -= lambda/(2*m )* ( theta(1)^2 ) ;
% 另一种处理 feature 0 case 的做法
% 必须先计算出 grad0 并保存, 因为需要同步更新
grad0 = 1/m *sum( ( hx - y ) .* X(:,1) )' ; % grad0 不正则化
grad = 1/m *sum( ( hx - y ) .* X )' + lambda/(m )* theta ; % 添加了 正则化部分
grad(1) = grad0 ;
% =============================================================
end
注意: λ取值过大,对参数惩罚过大,会导致欠拟合, 取值过小, 会过拟合
data = load('ex2data2.txt');
X = data(:, [1, 2]); y = data(:, 3);
% Note that mapFeature also adds a column of ones for us
X = mapFeature(X(:,1), X(:,2));
% Initialize fitting parameters
initial_theta = zeros(size(X, 2), 1);
% Set regularization parameter lambda to 1
lambda = 1;
[cost, grad] = costFunctionReg(initial_theta, X, y, lambda);
%% ============= Part 2: Regularization and Accuracies =============
% Initialize fitting parameters
initial_theta = zeros(size(X, 2), 1);
% Set regularization parameter lambda to 1 (you should vary this)
lambda = 1;
% Set Options
options = optimset('GradObj', 'on', 'MaxIter', 400);
% Optimize
[theta, J, exit_flag] = ...
fminunc(@(t)(costFunctionReg(t, X, y, lambda)), initial_theta, options);
% 预测
% Compute accuracy on our training set
p = predict(theta, X);