这一章节其实就是讲一个主题——判断模型有无高方差或高偏差,也就是过拟合还是欠拟合。同时,如果模型有问题,怎么修正这一问题?

需要注意的是,这一章主要针对线性回归问题。当然,这一思路也可以应用于逻辑回归和简单的神经网络的训练。

个人是按照按照作业里设置好的训练步骤,逐条记录,和课程的顺序有所不同。

数据集的划分

NG的建议是,将总数据集划分为60%的Train set,20%的Cross validation set和20%的Test set。这里解释下各集合的作用:

  • Train set:训练集。顾名思义,专门用作训练。
  • Cross validation set:交叉验证集。是用来辅助训练,判断训练集的拟合情况,绘制学习曲线的。
  • Test set:检验集。用来检验训练模型的准确度。

学习曲线

不同情况的特点

这里介绍的是如何通过学习曲线来判断模型的问题。这里有三种学习曲线:

这是高偏差情况。学习曲线的特点是交叉集和训练集曲线趋于收敛,但是收敛值偏高(区分好交叉验证集、训练集和试验集的不同)。对于高偏差情况,一味地增加数据量是没用的。

这是高方差情况。学习曲线的特点是两条曲线很难收敛。对于高方差情况(也就是过拟合),增加数据量是有效的。

这是正确的学习曲线,当然只是理论上的。学习曲线的特点是趋于收敛,且收敛值很低。这里增加数据量也是很有效的。

以作业作为实例

需要注意的是,上面只是理论上的情况。实际上学习曲线不总是那么标准,曲线也不总是那么光滑,比如这次的作业题,当处于欠拟合状态时,学习曲线看起来却没太大问题(?)

如上面两图,从第一幅图里可以判断是欠拟合,第二幅图却看不出问题。但如果对比着正常的拟合情况就会发现问题了。如下是特征增长处理后的拟合情况和学习曲线:

可以看到,正确的拟合情况下,学习曲线的训练误差趋于0,而交叉验证的曲线相对上面那种情况来讲会更低,而且可以判断的是,随着训练集的增加,验证曲线也会逐渐趋向训练曲线。

那么问题来了,针对作业题,过拟合情况是怎样的?之前正确拟合所设置的特征增长维度p=8,当我改为16时图像如下:

可以看到,学习曲线中,训练集误差还和之前一样趋于零,而交叉集的误差波动很大,看不出收敛趋势。
同时,我还发现三幅拟合曲线的纵轴分度各不相同。对于过拟合情况,我们可以判断,一小部分数据的微小干扰,根本不会影响整体的拟合特征。

另外,之所以两种情况训练误差都是0,个人分析原因是数据量太少。如果数据量加大,应该是过拟合趋于0,正常情况下有训练误差,但是误差很小。如果数据量扩大到现有的100倍,有可能过拟合所采用的特征维度才更合适。简而言之,数据量与相对应的合适特征维度应该是有一定的线性关系的。

模型选择

之前其实已经讨论过学习曲线和模型特征维度之间的关系,不过这里还是有必要再做一个总结,如下图:

这是NG之前反复提及的拟合问题,只不过这次用了两个名词来表达——偏差和方差。可以看到,在同样的数据量下,模型维度过高过低都是不合适的。具体的模型维度与误差的关系曲线如下图:

对于线性拟合问题,模型的选择其实就是特征维度的选择。在真实场景中,我们其实很难判断到底多少合适(如上)。好的做法应该是选择一定区间,一个一个跑一遍,比较它们学习曲线的优劣,就如同‘学习曲线’部分所分析的那样。

正则化

之前NG讲过,正则化同样可以解决偏差和方差的问题。也就是说,正则化可以在一定程度上修正训练集过少或特征维度过高,以及特征维度过低所产生的误差。针对之前作业例子中提到的欠拟合和过拟合问题,我们来进行正则化修正,看看效果如何。

修正过拟合问题

首先是过拟合问题,我们先根据如下曲线,选择一个最佳的正则化参数。

可以看到,\(\lambda=3\)是比较合适的。那么我们就选择这个值,修正我们的模型。

拟合情况有所改善,之前一小部分数据的微小干扰,根本不会影响整体的拟合特征,现在已经好多了。另外学习曲线中交叉集误差波动的情况也修正了。可以说十分有效。

修正欠拟合问题

针对本例的欠拟合问题(p=1),我们先看下能不能根据曲线来选择正则化参数。

很遗憾的是,曲线不收敛,我们没法找出最佳参数。那如果我们试下\(\lambda=3\)会怎样?

可以看到,无论是拟合情况还是学习曲线都没有得到明显改善。也就是说,本例中正则化无法修正误差,更合适的做法应该是进行适当的特征增长。

在选择合适模型下正则化

如果模型选择好了,正则化效果如何呢?如下两图:

比起没有正则化时,收敛的趋势更加明显。所以说还是很有效的。

数据随机化

作业题中有一道选作,是针对数据集很小的情况,让我们在训练过程中随机化数据,多次重复拟合并算出误差平均值。需要注意的是,这里每次运行得到的结果都是不同的,但是整体趋势还是稳定不变的。
这里网上很难找到选做题,我也是思考了很久,并且到处搜索,终于找到一篇博客,最终才写出可运行代码。下面贴出代码:

%% ==== Optional exercise 1: Computing test seterror =========
% find better lambda
index = 1;
min = exp(100);
for a = 1:length(lambda_vec)if (min > abs(error_train(a) - error_val(a)))min = abs(error_train(a) - error_val(a));index = a;end
end
lambda = lambda_vec(index);
m = size(X_poly, 1);
n = size(X_poly_test,1);theta = trainLinearReg([ones(m, 1) X_poly], y, lambda);
error_test = linearRegCostFunction([ones(n, 1) X_poly_test], ytest, theta, 0);fprintf('lambda: %f(this value should be about 3)\n', lambda);
fprintf('error_test: %f(this value should be about 3.8599)\n', error_test);
fprintf('Program paused. Press enter to continue.\n');
pause;%% =============== Optional exercise 2 ========================
% Plotting learningcurves with randomly selected examplestic; % 开始计时lambda = 0.01;
m = size(X, 1);
n = size(Xval, 1);
error_train = zeros(m, 1);
error_val = zeros(m, 1);
repeat = 50;
for i = 1:mfor time = 1:repeatseq = randperm(m, i); % 随机化(1:m)序列并选出其中的i个X_poly_rand = X_poly(seq,:);y_rand = y(seq,:);seq_val = randperm(n, i);Xval_poly_rand = X_poly_val(seq_val,:);yval_rand = yval(seq_val,:);theta = trainLinearReg([ones(i, 1) X_poly_rand], y_rand, lambda);J = linearRegCostFunction([ones(i, 1) X_poly_rand], y_rand, theta, 0);Jval = linearRegCostFunction([ones(i, 1) Xval_poly_rand], yval_rand, theta, 0);error_train(i) = error_train(i) + J;error_val(i) = error_val(i) + Jval;end
end
error_train = error_train / repeat;
error_val = error_val / repeat;figure;
plot(1:m, error_train, 1:m, error_val);
title(sprintf('Polynomial Regression Learning Curve (lambda = %f)', lambda));
legend('Train', 'Cross Validation');
xlabel('Number of training examples');
ylabel('Error');
axis([0 13 0 100]);toc; % 停止计时fprintf('Program paused. Press enter to continue.\n');
pause;

这个方法相比之前要运行很久,在我的小破本里一般要6-8分钟,算是让我体验到了机器学习过程中那种奇妙的期待感。

上面的代码,选择的参数p=8,\(\lambda=0.01\),拟合次数为50次。最终得到的学习曲线如下图:

相比没有这么处理的情况,如下图,似乎更差了?不过还是可以发现,交叉集误差波动没那么大了,收敛的趋势也更加明显。

如果正则化参数为3,其它照旧时,这个方法的学习曲线如下:

总而言之,这个方法是针对数据集量很少的情况,对于误差的计算会更加准确。

总结

本章其实只针对线性回归的拟合修正进行了讨论,当然,其中的一些思想对其它拟合方式也有效,比如说正则化在逻辑回归和简单的神经网络中也很有效。下面对线性回归拟合进行一般性步骤总结:

  1. 将总数据集合适划分。
  2. 选择合适区间,比较不同特征维度p的学习曲线和拟合情况,选择最合适的特征维度。
  3. 选择合适区间,比较不同正则化参数\(\lambda\)的误差曲线,选择合适的正则化参数。
  4. 如果数据集很小的话,训练过程中尽量随机化数据,多次拟合并算出误差平均值。

转载于:https://www.cnblogs.com/ChanWunsam/p/10126739.html

吴恩达机器学习笔记七_应用机器学习的建议相关推荐

  1. P3 吴恩达推荐笔记:22张图总结深度学习全部知识

    吴恩达推荐笔记:22张图总结深度学习全部知识 本文简要的解释了深度学习中的基本概念,包括监督学习.逻辑回归.正则化等等. 并且,在了解了一些基本概念后,本文还对目标检测.人脸识别.自然语言处理进行了简 ...

  2. 干货|机器学习零基础?不要怕,吴恩达课程笔记第三周!逻辑回归与正则

    吴恩达Coursera机器学习课系列笔记 课程笔记|吴恩达Coursera机器学习 Week1 笔记-机器学习基础 干货|机器学习零基础?不要怕,吴恩达机器学习课程笔记2-多元线性回归 1 Logis ...

  3. 吴恩达深度学习 | (15) 结构化机器学习项目专项课程第二周学习笔记

    课程视频 第二周PPT汇总 吴恩达深度学习专项课程共分为五个部分,本篇博客将介绍第三部分结构化机器学习项目专项的第二周课程:机器学习(ML)策略(2) . 目录 1. 进行误差分析 2. 清除标注错误 ...

  4. 资源 | Hinton、LeCun、吴恩达......不容错过的15大机器学习课程都在这儿了

    翻译 | AI科技大本营 参与 | 刘畅 编辑 | Donna 之前,我们推送了由sky2learn整理的15大深度学习课程.这次,我们整理了15个必看的机器学习课程.这些课程内容包括决策树,朴素贝叶 ...

  5. 吴恩达推荐笔记:22 张图总结深度学习全部知识

    来源|Sophia@知乎 https://zhuanlan.zhihu.com/p/152362317 编辑 | 公众号极市平台 本文仅用于学术分享,如有侵权,联系后台作删文处理 最近在做笔记查阅内容 ...

  6. 吴恩达新动作:建立全新机器学习资源 Hub,「以数据为中心的 AI」大本营

    行早 发自 凹非寺 量子位 | 公众号 QbitAI,AI有道 近日,吴恩达教授发推给大家推荐了一个新的资源站:Data-centric AI(DCAI). 很高兴给大家介绍我们建立的一个新资源站Da ...

  7. 【深度学习】吴恩达深度学习-Course3结构化机器学习项目-第一周机器学习(ML)策略(1)作业

    题目仅含中文!! 视频链接:[中英字幕]吴恩达深度学习课程第三课 - 结构化机器学习项目 参考链接: [中英][吴恩达课后测验]Course 3 - 结构化机器学习项目 - 第一周测验 吴恩达< ...

  8. 吴恩达又双叒叕刷屏了_你准备入坑了吗?

    阅读原文请点击 美国太平洋时间8点16分,吴恩达在推特上发布了重磅消息:deeplearning.ai课程登录Cousera,并同时在 Medium 发布博文介绍这套课程. 吴恩达坦言自己一直在进行3 ...

  9. 吴恩达新动作:建立全新机器学习资源Hub,「以数据为中心的AI」大本营

    来源:量子位 吴恩达教授发推给大家推荐了一个新的资源站:Data-centric AI(DCAI). 很高兴给大家介绍我们建立的一个新资源站Data-centric AI,这里有许多专家的文章和Neu ...

  10. 吴恩达深度学习代码_吴恩达深度学习笔记(58)-深度学习框架Tensorflow

    TensorFlow 有很多很棒的深度学习编程框架,其中一个是TensorFlow,很期待帮助你开始学习使用TensorFlow,我想在这个笔记中向你展示TensorFlow程序的基本结构,然后让你自 ...

最新文章

  1. java8 CompletableFuture异步编程
  2. NAPTR和SRV记录
  3. android 之ListView分页效果以及从网络上加载数据一系列的综合运用
  4. 文巾解题 21. 合并两个有序链表
  5. 【机器视觉】 default算子
  6. Nuget发布Dll
  7. mysql在线快速修改密码_MySQL修改密码的几种方式
  8. xcode 插件安装路径
  9. JAVA受检异常和非受检异常举例
  10. onClick,onServerClick,onClientClick
  11. 简单好用的mac版Mysql可视化工具 - Sequel Pro
  12. SubSonic使用技巧
  13. 区块链开发入门到精通
  14. Java迭代器和lambda的区别,Java使用Lambda表达式遍历Iterator迭代器
  15. Servlet 实现上传附件(支持多附件)
  16. Python实现汉字转换拼音
  17. 重磅长文!先进院李骁健等人:在体神经界面技术的发展-从小到大规模记录
  18. 【B站】陈睿:令人刮目相看的年轻一代
  19. 5月27日股市趋势追踪策略分析
  20. 针对目前windows系统的所有勒索病毒补丁和安全工具

热门文章

  1. Atitit 软件运行环境平台的变迁 attilax大总结 1.1.Native os时代 1.2.Vm时代 java net php 1.3.Script时代 js node。js 1.4.B
  2. Aitit 认证体系之道 attilax著艾龙著 1. 认证体系分类 2 1.1. 按照语言来分 java net php 2 1.2. 按照平台来分 web cs 桌面 2 1.3. 综合性认证
  3. paip.c++ qt 外部dll共享库的导入以及引用
  4. paip.声音按键音延迟的解决
  5. paip.Answer 3.0 注册功能SQL注入漏洞解决方案
  6. (转)全球17大业务安全事件发布
  7. 何诚:3月21日阿里云北京峰会基础设施集群智能运维大神
  8. 腾讯云TStack与IBM LinuxONE互认证
  9. 【优化算法】混沌游戏优化 (CGO)【含Matlab源码 1010期】
  10. 【优化算法】闪电连接过程优化算法(LAPO)【含Matlab源码 1444期】