Ch11 是对机器学习系统结构设计的探讨。对于模型训练,推荐先从简单入手,不断调优。对于二分类问题,有可能因为正负样本数量不均衡,导致类偏差的问题,引入了查准率和查全率的概念。最后对数据集的规模是否对模型有用,做了探讨。
目录
机器学习系统设计
垃圾邮件分类
用邮件中出现的词组成词集合$R^n$,对于一封邮件,先生成1个零向量$0$,若出现某词,则在加上该词的one-hot向量,出现多次按1次计算。若要减少特征,可以将词集合更改为常见词集合。
以此构建分类器算法,常见的策略有:
- 使用更多的数据
- 采取更好的特征:邮件的路由/正文信息
- 为拼写错误开发算法
误差分析
学习算法的构建过程:
- 从简单的模型开始,快速完成训练并测试该模型
- 绘制学习曲线,考虑是否加入更多数据/加入更多特征/其他策略进行训练
- 进行误差分析:对交叉验证集中的误差来源进行分析和修正
例如对邮件分类的问题,对交叉验证集出现误差进行分析:
- 什么类别的邮件出现误判的可能性会比较大
- 缺少了什么特征导致误判
在对误差进行分析时,不能靠直觉(gut feeling),而应该用数值体现。看尝试(加入或减少一个特征/采用某种方法)对误差的影响,进而确定是否采取该措施。
类偏差的误差度量
我们之前对二分类模型的评价主要使用的是准确率的方法,即
$$
Accuracy = \frac{true ; positives + true ; negatives}{total;examples}
$$
若训练集中正负样本量相差大,我们称为类偏差(Skewed Classes)。这种情况下,有可能会出现“若单独考虑准确率,训练后模型的预测结果不如全判断为0/1的模型效果好”的情形。所以我们需要引入新的评价体系。
对于一个二分类问题,我们有以下的情形:
规定:
准确率/查准率Precision:预测为正且正确的结果数占总预测结果数的比例
$$Precision = \frac{True;positives}{no.; of; predicted;as;positive} = \frac{True;positives}{True;positives + False;positives}$$召回率/查全率Recall:预测为正且正确的结果数占实际为正的样本数的比例
$$Recall = \frac{True;positives}{no.; of; actual;positives} = \frac{True;positives}{True;positives + False; negatives}$$
对于一个垃圾邮件分类问题,若测试集中只有1%的垃圾邮件($y=1$)、99%的正常邮件($y=0$),则:
1) 若假设函数为$y=1$,则accuracy=0.99,recall=0/(0+99)=0,precision=0/(0+1)
2) 若假设函数为$y=0$,则accuracy=0.01,recall=1/(1+99)=0.01,precision=1/(1+0)=1
所以无论数据集是否偏斜,只需要满足Precision和Recall均很高即可保证其实用性。
准确率与召回率的权衡
对二分类问题,我们对假设函数取一个阈值,进而分类。
$h_\theta(x)\geq threshold$,则$y=1$;$h_\theta(x) < threshold$,则$y=0$。
但针对不同的threshold,我们会有不同的Precision和Recall值,我们可以得到如下曲线:
- threshould 设定越高,查准率Precision越高、查全率Recall越低。因为判断的准、但有更多正例被漏掉。
- threshould 设定越低,查准率Precision越低、查全率Recall越高。因为找的全,但有更多负例被错判为正例。
于是我们引入一个评价指标:
$$F_1score = (2 * precision * recall) / (precision + recall)$$
$F_1score$越接近于1,则算法分类效果越好:
- P=0,R=0–>F1=0
- P=1,R=1–>F1=1
数据集规模
一般有,数据量越大,算法的性能就越好,但对于不同的分类算法,性能提升的幅度不同。我们有下图:
但对于欠拟合的模型,即使增加数据也无法获得好的效果。
所以:
- 如果模型欠拟合:增加特征(对神经网络增加hidden units);
- 如果模型过拟合:增大数据集,使得$J_{cv} ≈ J_{train}$ ,从而降低过拟合。