机器学习-过拟合与欠拟合(overfitting and underfitting)
通过一个例子来引入过拟合与欠拟合的概念(Stanford)
Who will Repay their Loans?
- A leader hires you to investigate who will repay their loans
-
You are given complete files on 100 applicants
-
5 defaulted within 3 years
- A Surprising Finding? -
All 5 people who defaulted wore blue shirts during interviews
-
Your model leverages this strong signal as well
解释一下
斯坦福大学给出了一个例子:谁能够偿还贷款?
一共有100个申请人,其中五个人三年内不能还清
但巧合的是,这五个人在申请贷款的时候全部穿着蓝色衬衫
因此,机器学习的模型捕捉到了这个明显的特征。
因此,以后只要穿着蓝色衬衫的来贷款,统统拒绝!!
这显然不合理,穿个蓝色衣服招谁惹谁了hhh~~
其实这就是过拟合,机器不应当捕捉这个特征。
概念1. Training and Generalization Errors
- Training Errors:model error on the training data----训练错误
- Generalization error:model error on new data—泛化错误(就是测试样本的出错)
有个很生动形象的例子解释这二者的关系:一个平时学习很好的同学考试不一定考的很好(训练错误很低,但泛化错误很高),反之则训练错误高,但泛化错误第,但这不太可能hhh。
如上图所示(按行分析):
- 训练错误低,泛化错误也低-----说明模型很好
- 训练错误高,泛化错误低----很奇怪,是不是有bug?
- 训练错误低,泛化错误高----过拟合
- 训练错误高,泛化错误高----欠拟合
概念2. Data Complexity
- Multiple factors matters
- time/space structure
- diversity
- E.g a char vs a pixel(Hard to compare among very different data)
Model Complexity
- The ability to fit variety of functions
- Low complexity models struggles to fit training set
- High complexity models can memorize the training set
通俗来讲,对于数据的复杂性有很多定义,总的来说就是结构复杂,或者样式复杂,比如数据包括:文件数据,文本数据,图片数据,视频数据等。
而且数据之间比较是很困难的,尤其是在两个毫无关系的数据之间比较,比如图片和文本,一个是由像素(pixel)构成,另一个由字符(character)构成。
对于模型复杂度来说,
低复杂度的模型很难去拟合训练集,高复杂度的模型可以更完美的拟合训练集。
如上图所示(按行分析):
- 若数据复杂度较低,同时模型也不复杂,能够适应这样的数据,那么机器学习的效果就比较好。
- 若数据复杂度高,但模型简单,那么模型肯定无法适应这种数据,因此会发生欠拟合。
- 若数据复杂度低,但模型十分复杂,那么则有可能发生过拟合。
- 若数据复杂度高,同时模型的复杂度也能适应数据的高复杂度,那么机器学习的效果就比较好。
模型复杂度对于过拟合和欠拟合的影响,上图可以很形象的解释。
横轴表示模型复杂度,纵轴表示训练错误与泛化错误。
从图中不难看出:
- 在模型复杂度很低的情况下,训练错误和泛化错误都很高,同时处于欠拟合状态,这很好理解,原因就是模型太过于简单。
- 随着模型复杂度不断升高,模型逐渐趋于完善,那么训练错误会不断降低,但泛化错误不一定,就像本文开篇的例子,模型将贷款用户的衣服颜色作为特征尽心学习,那么结果会适得其反。
- 因此会有一个拐点,在这个拐点上的模型是最佳的,但注意:及时在最优条件下,过拟合现象也不能消除,因为模型还是会出现错误。
Model Complexity vs Data complexity
当选取一个较为简单的模型(Simple mode—blue line),那么随着数据复杂度提升,泛化错误会逐渐降低,但是收到模型的限制,及时数据越来越具体,复杂度越来越高,那么错误也不会再降低。
因此,就需要引入更为复杂的模型(complex model—green line)
从此图分析也可以得出一些比较有意思的结论:
- 在数据复杂度较低的情况下,复杂的模型,泛化错误不一定低。
- 但随着数据复杂度不断提高,越复杂的模型一定能够越适应复杂的数据。
- 在数据复杂度达到某个量级,复杂的模型就可以超过简单的模型。