机器学习之算法分析与优化:偏向和方差
作者头像
  • 朱瑞雪
  • 2019-10-15 17:08:13 2

机器学习之算法分析与优化:偏向和方差

简介

本文将探讨如何利用正则化线性回归来改善模型的性能,特别是在处理偏向和方差问题方面。我们将通过一系列实验来说明如何优化模型,使其更好地适应数据集,并提高其泛化能力。

偏向和方差的概念

偏向是指模型预测值与实际值之间的偏差程度。偏向越大,模型的预测结果越远离实际值。方差则是指模型预测值的稳定性或变化范围。方差越大,数据分布越分散,函数波动也越大,导致模型泛化能力较差。

数据集介绍

我们的数据集包含了有关水位变化和从大坝流出的水量的历史记录。数据集分为三个部分:

  • 训练集:用于确定模型参数。
  • 交叉验证集:用于调整正则化参数。
  • 测试集:用于评估模型的最终性能。

正则化线性回归的实现

数据可视化

首先,我们需要对数据进行可视化,以便了解数据的分布情况。从训练集中可以看到,数据呈现出一定的趋势,但并非完全线性。

matlab % 数据可视化 clear; close all; clc load('ex5data1.mat'); m = size(X, 1); plot(X, y, 'rx', 'MarkerSize', 10, 'LineWidth', 1.5); xlabel('水位变化 (x)'); ylabel('大坝流出水量 (y)');

正则化线性回归代价函数

接下来,我们需要定义正则化线性回归的代价函数,以计算模型的损失值。初始的θ值设为[1, 1],此时的代价值应接近303.993192。

```matlab function [J] = linearRegCostFunction(X, y, theta, lambda) m = length(y); J = 0; theta1 = [0; theta(2:end)]; J = sum((X * theta - y).^2) / (2 * m) + lambda / (2 * m) * theta1' * theta_1; end

% 测试 theta = [1; 1]; J = linearRegCostFunction([ones(m, 1) X], y, theta, 1); ```

正则化线性回归梯度下降

在计算代价函数的基础上,我们还需要定义梯度下降函数,以优化模型参数。

```matlab function [J, grad] = linearRegCostFunction(X, y, theta, lambda) m = length(y); J = 0; grad = zeros(size(theta)); theta1 = [0; theta(2:end)]; J = sum((X * theta - y).^2) / (2 * m) + lambda / (2 * m) * theta1' * theta1; grad = (X' * (X * theta - y)) / m + lambda / m * theta1; end

% 测试 theta = [1; 1]; [J, grad] = linearRegCostFunction([ones(m, 1) X], y, theta, 1); ```

拟合线性回归

通过训练线性回归模型,我们可以找到最优的参数θ,进而绘制拟合曲线。

```matlab function [theta] = trainLinearReg(X, y, lambda) initailtheta = zeros(size(X, 2), 1); costFunction = @(t)linearRegCostFunction(X, y, t, lambda); options = optimset('MaxIter', 200, 'GradObj', 'on'); theta = fmincg(costFunction, initailtheta, options); end

% 训练模型 theta = trainLinearReg([ones(m, 1) X], y, 0); ```

处理高偏向和高方差

模型在某些情况下会出现高偏向或高方差的问题。通过调整正则化参数,我们可以解决这些问题。

学习曲线

绘制学习曲线有助于我们更好地了解模型在不同数据集上的表现。

```matlab function [errortrain, errorval] = learningCurve(X, y, Xval, yval, lambda) m = size(X, 1); errortrain = zeros(m, 1); errorval = zeros(m, 1); for i = 1 : m theta = trainLinearReg(X(1:i, :), y(1:i), lambda); errortrain(i) = linearRegCostFunction(X(1:i, :), y(1:i), theta, 0); errorval(i) = linearRegCostFunction(Xval, yval, theta, 0); end end

% 绘制学习曲线 [errortrain, errorval] = learningCurve([ones(m, 1) X], y, [ones(size(Xval, 1), 1) Xval], yval, 0); plot(1:m, errortrain, 1:m, errorval); title('学习曲线'); legend('训练集', '交叉验证集'); xlabel('训练样本数'); ylabel('误差'); ```

多项式回归

线性回归模型对于非线性数据可能效果不佳,因此引入多项式回归来改进模型。

特征映射和归一化

通过多项式特征映射和特征归一化,我们可以提升模型的拟合能力。

```matlab function [Xpoly] = polyFeatures(X, p) Xpoly = zeros(numel(X), p); for i = 1:p X_poly(:, i) = X.^i; end end

function [Xnorm, mu, sigma] = featureNormalize(X) mu = mean(X); Xnorm = bsxfun(@minus, X, mu); sigma = std(Xnorm); Xnorm = bsxfun(@rdivide, X_norm, sigma); end

% 特征映射和归一化 p = 8; xpoly = polyFeatures(X, p); [Xpoly, mu, sigma] = featureNormalize(xpoly); Xpoly = [ones(m, 1) X_poly]; ```

模型训练与评估

训练多项式回归模型,并绘制拟合曲线及误差曲线。

```matlab % 模型训练 [theta] = trainLinearReg(X_poly, y, 0);

% 绘制拟合曲线 plot(X, y, 'rx', 'MarkerSize', 10, 'LineWidth', 1.5); plotFit(min(X), max(X), mu, sigma, theta, p); title('多项式回归拟合曲线'); xlabel('水位变化 (x)'); ylabel('大坝流出水量 (y)');

% 绘制误差曲线 [errortrain, errorval] = learningCurve(Xpoly, y, Xpolyval, yval, 0); plot(1:m, errortrain, 1:m, error_val); title('多项式回归学习曲线'); xlabel('训练样本数'); ylabel('误差'); ```

调整正则化参数

通过调整正则化参数λ,可以进一步优化模型的性能。

```matlab function [lambdavec, errortrain, errorval] = validationCurve(X, y, Xval, yval) lambdavec = [0 0.001 0.003 0.01 0.03 0.1 0.3 1 3 10]'; errortrain = zeros(length(lambdavec), 1); errorval = zeros(length(lambdavec), 1); for i = 1:length(lambdavec) lambda = lambdavec(i); theta = trainLinearReg(X, y, lambda); errortrain(i) = linearRegCostFunction(X, y, theta, 0); errorval(i) = linearRegCostFunction(Xval, yval, theta, 0); end end

% 绘制验证曲线 [lambdavec, errortrain, errorval] = validationCurve(Xpoly, y, Xpolyval, yval); plot(lambdavec, errortrain, lambdavec, errorval); legend('训练集', '交叉验证集'); xlabel('正则化参数 λ'); ylabel('误差'); ```

总结

通过以上步骤,我们可以有效地利用正则化线性回归和多项式回归来改善模型的性能,处理高偏向和高方差问题,提高模型的泛化能力。希望本文提供的方法对你有所帮助。

    本文来源:图灵汇
责任编辑: : 朱瑞雪
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
习之方差偏向算法机器优化分析
    下一篇