前面几周介绍了几种机器学习算法,本周主要讲当你的机器学习算法效果不好时应该如何改进。
评估一个机器学习算法
效果不好时该做什么
当用训练好的模型来评估时,如果我们发现有较大的误差,可以采取下面的措施:
1. 使用更多的训练集
2. 使用更少的特征
3. 使用更多的特征
4. 添加更高次数的特征,例如二项式
5. 缩小正则化系数\(\lambda\)
6. 增加正则化系数\(\lambda\)
采取哪个措施不能闭着眼随便选一种,而是通过下面说的“机器学习诊断法”来先分析一下采取某个措施是否有效,然后再花时间去改进。
如何评估假设(EVALUATING A HYPOTHESIS)
这一节主要介绍如何判断过拟合(Overfitting)。简单的情况可以画图然后用眼睛观察出过拟合
但是,当特征很多时,就不能方便的画图了。这就需要下面的方法
把训练集的数据随机分成两部分:训练集(Training Set)和测试集(Test Set),一般按照七三比例来分。
使用训练数据(Training Set)来训练机器学习算法,得到模型(参数\(\theta\))。
然后用Test set的数据,来计算代价函数,判断是否出现过拟合。
如果模型是合适的,那么在Training set和Test set上的误差应该大致相同。如果在Traing Set上准确率很高,但是在Test Set上准确率却很低,则很可能出现了过拟合。
模型选择和交叉验证集
使用Test set的数据可以评估模型的误差。
当我们有多个模型(例如二次项,三次项,四次项),我们不知道哪个效果好一点。通过Test集的误差,我们能够从多个模型中选出一个Test误差最小的。
但是选好后,我们就没有数据来评估该模型的实际误差了。(因为我们是从误差最小的里面选的模型)
因此,把数据分成三个部分:
60%数据用作训练集(Training set)
20%数据用作交叉验证集(Cross ValidaDon set, CV set)
20%数据用作测试集(Test set)
训练集的数据用于训练算法得到模型(多个不同的模型),交叉验证集的数据可以用来选择合适的模型(选一个误差最小的),测试集的数据用来评估推广后该模型的准确度。
偏差和方差
识别偏差和方差
高偏差(High bias)基本上就是欠拟合,而高方差(High variance)就是过拟合的问题。
选择多项式的次数d,上图的数据,用一次拟合会误差很大,用二次拟合恰好合适,而用4次来拟合出现了过拟合。
高偏差时,test和cv上的结果误差都会很大,而高方差时,test上的误差很小,但cv上的误差很大
归一化和高偏差/高方差
正则化参数,等于0的时候相当于没有,会出现过拟合。参数太大出现欠拟合
学习曲线(Learning Curves)
学习曲线的横坐标是训练集的数目m,它是学习算法的一个很好的合理检验(sanity check)。
m=1时,模型几乎总是可以拟合训练集,m增加时拟合会越来越困难。
随着m增加,通过训练集误差和交叉验证集误差的变化曲线可以识别高偏差和高方差
高偏差的特点是,随着m增加,训练集和交叉验证集上的误差都会很高。
高方差的特点是,训练集误差小,cv集误差高。这时增加m数目可以提高性能。
总结
下面的措施可以解决的问题:
1. 使用更多的训练集(高方差)
2. 使用更少的特征(高方差)
3. 使用更多的特征(高偏差)
4. 添加更高次数的特征,例如二项式(高偏差)
5. 缩小正则化系数\(\lambda\)(高偏差)
6. 增加正则化系数\(\lambda\)(高方差)
神经网络和过拟合
简单的,层数少,结点少的神经网络计算量小,偏差可能大。
复杂的,结点多层数多的神经网络容易出现过拟合,可以使用正则化解决。
机器学习系统设计
垃圾邮件分类
首要的问题是怎么选取特征x ,可以选择一个由100个最常出现在垃圾邮件中的词所构成的列表,根据这些词是否有在邮件中出现,来获得我们的特征向量(出现为1,不出现为0),尺寸为100×1。
为了构建这个分类器算法,我们可以做很多事,例如:
1. 收集更多的数据,让我们有更多的垃圾邮件和非垃圾邮件的样本
2. 基于邮件的路由信息开发一系列复杂的特征
3. 基于邮件的正文信息开发一系列复杂的特征,包括考虑截词的处理
4. 为探测刻意的拼写错误(把watch写成w4tch)开发复杂的算法
上面每一项都可能耗费大量精力,怎么判断到底做哪一项可以到来最大提升呢?
误差分析(ERROR ANALYSIS)
推荐的学习方法是,先快速实现一个简单的学习算法。然后使用训练集进行训练。之后使用交叉验证集来验证,尝试找出判断错误的数据的共性特征。
构建一个学习算法的推荐方法为:
1. 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法
2. 绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择
3. 进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的实例,看看这些实例是否有某种系统化的趋势
以垃圾邮件过滤器为例,误差分析要做的既是检验交叉验证集中我们的算法产生错误预测的所有邮件,看:
是否能将这些邮件按照类分组。看分类器对哪一组邮件的预测误差最大,并着手优化。
思考怎样能改进分类器。例如,发现是否缺少某些特征,记下这些特征出现的次数。例如记录下错误拼写出现了多少次,异常的邮件路由情况出现了多少次等等,然后从出现次数最多的情况开始着手优化。
类偏斜的误差度量(ERROR METRICS FOR SKEWED CLASSES)
偏斜类问题表现为我们的训练集中有非常多的同一种类的实例,只有很少或没有其他类的实例。如何度量误差呢?
例如,预测癌症是否是恶性的学习算法可能学习后达到了99%的准确度。但是实际上恶性的发送率为0.5%,如果算法对所有输入都输出非恶性,也能达到99.5%的准确率。但是这样的算法显然是没用的。因此不能只依靠准确率来判断算法性能。
为此引入了查准率(Precision)和查全率(Recall)的概念
实际为1(小概率) | 实际为0 | |
预测为1 | 正确肯定(True Positive,TP) | 错误肯定(False Positive,FP) |
预测为0 | 正确否定(True Negative,TN) | 正确否定(False Negative,FN) |
查准率 P= TP/(TP+FP) 。例如,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
查全率 R=TP/(TP+FN) 。例如,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。
如果算法对所有输入都输出非恶性,则算法的查全率为0 。
查全率和查准率之间的权衡
继续沿用刚才预测肿瘤性质的例子。逻辑回归中,我们的算法h(x)输出的结果在0-1之间,我们使用阀值(threshold)0.5来预测真和假。
如果我们希望只在非常确信的情况下预测为真(肿瘤为恶性),即我们希望更高的查准率,我们可以使用比0.5更大的阀值,如0.7,0.9。这样做我们会减少错误预测病人为恶性肿瘤的情况,同时却会增加未能成功预测肿瘤为恶性的情况。
如果我们希望提高查全率,尽可能地让所有有可能是恶性肿瘤的病人都得到进一步地检查、诊断,我们可以使用比0.5更小的阀值,如0.3。
我们可以将不同阀值情况下,查全率与查准率的关系绘制成图表,曲线的形状根据数据的不同而不同:
有一种方法是计算F1值(F1 Score),其计算公式为:
$$F_1 \text{score} =2 \frac{PR}{P+R}$$
F1值越高越好。
机器学习的数据
什么时候应该去获取更多数据,而不是改进算法呢?
首先,特征应该足够作出判断。例如判断房价仅仅有面积的话,不足以判断房价,应至少需要位置,房间数目等。
其次,算法中应包含非常多的参数以避免高偏差。
此时,可以获取更多数据来提高性能。