如何设计一个机器学习系统?
一个好的系统其实需要考虑很多的东西,不单纯是模型的问题:
如垃圾邮件系统:
- 收集更多的样本
- 基于邮件的路由信息开发一系列复杂的特征: 群发邮件
- 基于邮件的正文信息开发一系列复杂的特征,包括考虑截词的处理:内容检测
- 为探测刻意的拼写错误(把watch写成w4tch)开发复杂的算法
误差分析(ERROR ANALYSIS)
误差分析可以帮助我们系统化地选择该做什么.
构建一个学习算法的推荐方法为:
- 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法.
- 绘制学习曲线,决定:
- 增加更多数据: 过拟合/high variance;
- 添加更多特征: 欠拟合/high bias,还是其他选择;
- 进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的实例,看看这些实例是否有某种系统化的趋势;
- 误差分析可能并不总能帮助我们,我们还需要尝试不同的模型来比较。
类偏斜的误差度量(ERROR METRICS FOR SKEWED CLASSES)
skewed classes
positive的实例很少,只用准确率去判断无法正确反映分类器的实例:若negative样本为99%,那么即使把所有样本全部预测为negative,从整体样本来说准确率还可以达到99%!!两个度量:
- 准确率Precision: 预测正确的个数/预测总数;
- 覆盖率Recall: 预测正确的个数/实际样本中的总数;
在现实中,根据实际需要,取舍两者的比例。
另外,我们可以用F1值/F1 score 来自动均衡两者:
$$F1 = 2 \times \frac{PR}{p+ R}$$
机器学习的数据
回到上面的问题,当效果不好的时候,我们是要增加样本数据,还是考虑修改模型,抑或是换一个模型?
也可以这么想:在这些特征面前,一个真人专家是否能有信心地预测结果?
若可以,而我们的模型又high variance,代价函数也小,那么就可以考虑增加样本,因为模型过拟合了。过拟合其实说明一点:该模型能够描绘出特征信息,可以考虑增加样本,减少特征数的方法。
若此时是high bias,那增加样本也无能为力了。
我们希望我们的算法低偏倚,低偏差:
- 选择更多的特征来降低偏倚;
- 再通过增加数据量来降低偏差。