最近开始学习 "机器学习", 早就听说祖国宝岛的李宏毅老师的大名, 一直没有时间看他的系列课程. 今天听了一课, 感觉非常棒, 通俗易懂, 而又能够抓住重点, 中间还能加上一些很有趣的例子加深学生的印象.
视频链接(bilibili): 李宏毅机器学习(2017)
另外已经有有心的同学做了速记并更新在 GitHub 上: 李宏毅机器学习笔记(LeeML-Notes)
所以, 接下来我的笔记只记录一些我自己的总结和听课当时的困惑, 如果有能够帮我解答的朋友也请多多指教.
一, 误差来自哪里? 该如何处理这些误差?
从第一课可以知道, 越复杂的模型并不一定会带来越低的误差(error). 误差来自两方面:
偏差(bias)
方差(variance)
如果可以诊断误差的来源, 就可以选择适当的方法来改进自己的模型.
看到这里我有一些困惑, 误差, 偏差, 方差听起来太像了, 到底有什么区别呢?
[此处与机器学习无关: 图 1 真的挺难得, 不知不觉有一种管理方面感触的代入感, 左上角图表示好的领导 (战略决策层) 与好的员工 (战术执行层) 的配合, 右上角图表示好的领导 (战略决策层) 与差的员工 (战术执行层) 的配合, 左下角图表示差的领导 (战略决策层) 与好的员工 (战术执行层) 的配合, 右下角图表示差的领导 (战略决策层) 与差的员工 (战术执行层) 的配合. 从这方面可以看出, 一个好的战略决策有多么重要!]
简单的模型 (如一次方程) 所带来的方差比复杂模型 (如五次方程) 所带来的方差要小如图 4.
虽然简单的模型有助于控制方差, 但如果一开始选定的范围并没有包含 f^, 那么 f * 所带来的偏差也有很大可能带来误差. 如图 5.
如果误差来自于偏差, 那么往往在训练集上欠拟合(underfitting)
如果误差来自于方差, 那么往往在训练集上过拟合(overfitting)
机器学习需要弄清楚一件事情: 误差来自哪里? 如果是偏差, 那么该怎么办? 如果是方差, 那么又该怎么办? 如图 7.
当欠拟合的时候(数据无法很好拟合 f), 那就来自偏差, 这时应该重新设计模型, 因为 f^ 没有被 f 所包含
当过拟合的时候, 那误差就来自方差, 这时候有两种办法:
增加数据: 几乎是万灵丹, 不会伤害偏差, 但有一个缺点是成本太高
正则化: 可以使曲线变得平滑
二, 选择模型的过程中需要注意的事情
通常我们都可以在偏差和方差之间找到一个平衡, 从而找到合适的模型. 但一定不要做这样的事情:
直接用全部训练集直接选择模型, 这样你在测试集上得到的误差并不能反映真实测试集上的误差. 如图 8.
那么应该怎么做?
交叉验证: 将训练集分为训练集和验证集(validation set), 先用这两个集合选择出误差比较小的模型, 然后拿自己的测试集来比较误差的大小. 如果觉得第一步本身训练集并不大还要再分的话, 可以在选好模型后在整个训练集上再确认一下. 这样你的测试集基本上可以反映出模型在真正测试集的误差. 如图 9.
如果你担心自己分的测试集可能带来偏差的话, 可以做 N 次交叉验证, 将训练集分为多组小训练集 1, 小训练集 2, 小验证集, 得到误差最小的模型后再在全量的训练集上继续训练即可. 如图 10.
在这里李宏毅老师特别提到, 在训练集上选好模型后, 如果测试集上表现偏差比较大, 不要再返回去选择那些误差表现大的模型, 因为他们可能在 private 测试集上表现出的误差可能会更大.
来源: https://www.cnblogs.com/leogoforit/p/12597650.html