改进自己的机器学习算法系统
当我们初步求出了一个机器学习算法以后,我们希望这个算法的预测或者分类能力是很好的,能够对我们的每一个新的数据做出合理的判断。但是我们实际发现这个算法的错误率其实很高,这个时候我们应该怎么去做,怎么做能够更省力更有效更具有针对性? 这就是week6 要解决的问题。
我们很容易就想到的方法有这些:
1.增加训练数据
2.减少特征
3.增加特征
4.增加多项式特征
5.减小
λ
6.增加
λ
但是这些方法到底有没有用,或者说,在什么情况下有用,这就是值得去探讨的问题
那我们需要做的其实是三件事情:
1. 评估一个学习出来的算法
2. 判断一个表现不太好的学习算法是出了什么问题?high bias(欠拟合)还是high variance(过拟合)的问题
2.1 model selection
- 2.1.1 degree of polynomial
- 2.1.2 bias vs variance
- 2.1.3 regularize parameter
2.2 learning curve
3. 如何更有效更有针对性地怎么去改善学习算法
1. 怎么样去评估一个已有的算法——>划分数据集
要去评价评估学习到的算法时,很重要的一部分就是要有能够检验的数据,以估计算法的泛化能力。在实际训练中,如果把所有的数据全部都当作是训练数据,固然可以得到拟合效果比较好的学习算法,但是我们并不知道这个算法对新的数据的估计情况。在现有的条件下,我们不妨将现有的数据分成两部分,一部分用来训练(70%),一部分用来验证(30%)。通过训练数据来训练参数向量,通过验证数据来评价学习到的算法。于是,我们就有一般过程如下:
a. 训练
θ,s.t.minJ(θ)
b. 计算测试集误差
Jtest(θ)
,来估计学习算法的泛化能力
在不同的情形下, Jtest(θ) 会有不同的形式,但是总体来讲,还是会保持一致性
线性回归:
逻辑回归:
2. 判断欠拟合还是过拟合
做完评估以后,我们接着就可以通过“Learning Curve”的判断方式来判断我们的算法究竟是high bias 还是high cvariance 或者两者皆有的问题。其中,high bais就是欠拟合,high variance就是过拟合。
但是我们在考虑learning curve以前,我们需要先做一个工作,model selection。model selection的目的主要是有个:1.引入交叉验证集的概念。2.解释清楚high bias和 high variance这两个概念 3.阐述清楚如何去选择一个更合适的模型,也就是如何确定更合适的参数d,λ,即搞清楚d,λ和bias,variance之间的关系。
理清一下:我们接下来讲清楚两个内容:1.model selection 2.learning curve
2.1 我们解决模型选择的问题。
模型选择主要设计到两个过程和三个参数:1. 多项式次数d 2. 正则化系数λ 3. 特征Θ
2.1.1 这里引入cross validation set并且解释清楚第一个过程:如何选择d
做模型选择的时候,我们首先要做的事情是确定degree of polynomial。增加一个新的参数
d
来表示每一个hypothesis的degree。我们假设有k个不同的假设,每一个k对应了
一般步骤如下:
a. k个d训练
b. 在验证集上确定
d
,也就是考虑满足
c. 在测试集上估计泛化的能力,也就是
以上是关于d的选择思想。我们输入不同的d,最后得到一个d
2.1.2 接下来我们来解释清楚high bias和high variance这两个概念
我们的test error 是由bias² 和variance组成
bias是回归值的期望与实际值之间的差距
variance是回归曲线的波动程度
具体的数学过程这里不多叙述。
这里重点其实是在于我们怎么去区分这两类不同的情况:
区分bias和variance其实是要从
Jtrain
着手的,因为high bias代表着underfit,high variance代表着overfit 这两个不同状态下
Jcv
或者
Jtest
都是很高的,而在underfit的时候
Jtrain
高,overfit的时候
Jtrain
低
2.1.3 最后我们来考虑第二个过程:λ的选择
λ的选择,也是通过类似选择d的方式来进行。
a. 选择k个λ,然后分别计算使得
min Jλ(θ)
的
θ(k)
b. 代入
Jcv(θ)
,取
min Jcv(θ)
所对应的那个λ,作为我们选定的λ
c. 代入计算
Jtest(θ)
d vs λ | 同 | 异 |
---|---|---|
目的 | 都要求一个合适的参数 | |
输入 | 都是要进行比较的多个参数(不妨设k) | |
过程1 | 训练k个使得 min J(θ) 的θ | 求λ时,θ的训练要用带有正则化项(惩罚项)的 Jλ(θ) ,而求d时,训练θ不用带惩罚项 |
中间输出 | θ(k) | |
过程2 | min Jcv(θ) | |
最终输出 | 要求的参数d或者λ,并且记录对应的θ,便于计算 Jtest(θ) |
最后我们总结一下d,λ和high bias,high variance以及error之间的关系。
在欠拟合的情况下,degree小,λ大 这个时候 Jtrain≈Jcv ,并且都很大
在过拟合的情况下,degree大,λ小,这个时候 Jcv≫Jtrain
用图表来概括d和λ是怎么引发high bias和high variance的问题的
high bias | high variance | |
---|---|---|
d | 太小 | 太大 |
λ | 太大 | 太小 |
2.2 接下来我们又要回到learning curve的内容
首先是理想状态下的learning curve
理想状态下的learing curve,x轴是m(训练集的数量),y轴是error。我们在坐标平面内表示不带λ的
Jtrain
和
Jcv
,于是,我们可以看到,m↑时,
Jtrain
↑,
Jcv
↓,并逐渐趋于平缓,两曲线之间有一个距离不算大的gap
接下来是high bais情况下的learning curve
很明显,两条曲线的升降趋势没有太大变化,但是升降的幅度(也就是收敛的速度)快了很多,两者之间的gap极小,几乎贴近(因为数量多了以后,在训练集和验证集上的表现不会有太大的差别)。另外一个值得注意的地方是,两条曲线的收敛值都比之前要大,也就意味着large error
从而,我们知道,在high bias的情况之下,增加训练集数量并没有太多帮助
最后是high variance情况下的learning curve
同样地,曲线的升降趋势没有太大变化,只是收敛的速度b似乎变慢了,比理想状态下还要慢,在同样的m情况下,gap变大了很多。但是有意思的是,随着m的增大,两条曲线最终还是会逐渐靠拢。
于是,我们就知道了,增加训练集数量可能对high variance的情况助益更大
3. 有针对性地改善现有算法
我们前面已经总结了欠拟合和过拟合状态下d和λ的状态,如果我们想要改善所出现的问题,我们就可以从d,λ和m上下手
所处状态 | high bias | high variance |
---|---|---|
d | 太小 | 太大 |
λ | 太大 | 太小 |
如何解决 | high bias | high variance |
---|---|---|
d | 增大d | 减小d |
λ | 减小λ | 增大λ |
m | 无能无力 | 增加m |
把上面的表格表达成更易理解的语言,就可以回到我们一开始的问题
1.增加训练数据 ———-> 解决过拟合 m↑
2.减少特征 ———-> 解决过拟合 d↓
3.增加特征 ———-> 解决欠拟合 d ↑
4.增加多项式特征 ———-> 解决欠拟合 d ↑
5.减小
λ
———-> 解决欠拟合 λ↓
6.增加
λ
———-> 解决过拟合 λ↑
至此,我们就解决了我们一开始提出的三个问题。
ps:文中所有图的来源是Ng的课程视频截图和讲义截图
======================================
其他的一些想法
我们做这些的目的就是减少error
这里有两个问题,一个是为什么只用了traing set 和cross validation set?另外一个是究竟怎么去判断大和小的问题
验证集和测试集的本质都是用来做测试的数据,只是用途不一样,一个用来测试degree 另外一个用来测试θ
d,λ,m到底是大还是小我们其实不用知道,因为我们使用的这三个参数其实是一个相对的大小。我们只要去比较 Jtrain 和 Jcv 的大小,然后根据我们判断出来的情况,决定是在现有的参数基础上往增加的方向还是减小的方向即可。
3.彩蛋。作者本人可见