机器学习应用建议
决定下一步做什么
调试学习算法
如果我们正利用正则化线性回归来预测房价,代价函数如公式
备注:Andrew Ng的ppt中公式有误,我这里更改了过来
然而,当你在新数据集上测试你的假设时,会发现预测结果的错误率不可接受。那下一步该怎样做?
- 获取更多的训练数据
- 尝试更小的特征集
- 尝试获取额外的特征
- 尝试添加多项式特征
- 尝试减小 λ
- 尝试增大 λ
机器学习诊断
-什么是诊断?
诊断就是一种测试,该测试可以让你更加清楚哪些有利于学习算法,哪些有害于学习算法,给你更好地改善学习算法性能提供更多指导。
诊断很费时,但很有用。
评价假设
对假设进行评价
如果选择的特征过多,模型可能对不在训练集中的数据缺乏泛化能力。
如图1所示,这里选择了4个特征
[x1,x2,x3,x4]
,假设为:
这种请情况就是过拟合。过拟合造成对训练数据拟合非常好,但对测试数据缺乏泛化推广能力。
图1 过拟合
线性回归训练/测试过程
-通过最小化训练误差 J(θ) 来学习参数 θ
-计算测试误差
逻辑回归训练/测试过程
-通过训练数据来学习参数 θ
-计算测试集误差
Jtest(θ)=−1mtest∑mtesti=1(y(i)testloghθ(x(i)test)+(1−y(i)test)loghθ(x(i)test))
-误分类误差
模型选择和训练/验证/测试集
对于如图1所示的过拟合例子,一旦参数
θ0,θ1,....,θ4
对训练集能够很好地拟合,训练集获得的参数误差可能比真是的泛化误差低。
通过测试集误差
Jtest(θ(5))
来反映模型泛化能力的好坏,
Jtest(θ(5))
通常可能是泛化误差的乐观的估计。选择额外的参数能够对测试集进行拟合。
训练/验证/测试误差
训练误差:
交叉验证误差:
训练误差:
诊断偏差vs.方差
偏差和方差
如下三张图分别代表了高偏差(欠拟合)、“正好”、高方差(过拟合)
图2 欠拟合-适中-过拟合
训练误差:
交叉验证误差:
随着多项式维度d的增大,训练误差逐渐减小;但交叉验证误差开始时会随多项式维度增大而减小,但当维度超过临界值后,交叉验证误差会随着维度的增大而增大。因此,多项式维度要选择适当大小的值。
诊断偏差vs.方差
如果学习算法的性能比预期的差( Jcv(θ) 或 Jtest(θ) 高)。那它是偏差问题还是方差问题?
从图2可以看出偏差(欠拟合)问题和方差(过拟合)问题的差别:
-偏差问题(欠拟合):
训练误差
Jtrain(θ)
大,测试误差与交叉验证误差也较大并且近似相等;
-方差问题(过拟合):
训练误差
Jtrain(θ)
小,交叉验证误差远大于训练集误差(
Jcv(θ)>>Jtrain(θ)
);
正则化和偏差/方差
线性回归正则化
选择的模型为:
代价函数为:
尝试不同的正则化参数
λ
,可以做出交叉验证集的代价函数
Jcv(θ)
,训练集的代价函数
Jtrain(θ)
与正则化参数
λ
的关系曲线,如图所示
从图中可以看出,当正则化参数 λ 较小时,训练集的代价函数 Jtrain较小,并随着 \lambda 增大而增大;交叉验证集的代价函数 J_{cv}(\theta) ,随着 \lambda 增大先减少后增大。说明,正则化参数 \lambda$参数要适中。
学习曲线
选择不同的训练集规模(即
m
不同),交叉验证集的代价函数
高偏差(欠拟合)
当学习算法经历高偏差时,增加过多的训练集数据也不会由太大帮助,因为随着样本数
m
的增大,训练集的代价函数
高方差(过拟合)
当学习算法经历高方差时,增加过多的训练集数据可能会很有用,因为随着样本数
m
的增大,训练集的代价函数
决定下一步该怎么做
回到开始提到的问题,当算法性能不理想时,该如何进行处理:
- 高方差——获取更多的训练数据
- 高方差——尝试更小的特征集
- 高偏差——尝试获取额外的特征
- 高偏差——尝试添加多项式特征
- 高偏差——尝试减小
λ
- 高方差——尝试增大
λ