11.机器学习系统设计

11 机器学习系统设计

11.1 确定执行的优先级

本章使用垃圾邮件分类器的例子,来描述机器学习系统设计方法。

设计垃圾邮件分类器时,首先要确定特征向量$x$和$y$,这里我们选取100个单词组成我们的特征向量,当单词在邮件中出现,我们就将特征向量$x$对应位置出标为1.

image-20250208200801676

接下来我们要考虑的就是如何提高分类器的准确率呢?

通常有很多方法:1.收集更多垃圾邮件和非垃圾邮件样本 2.基于邮件的路由信息设计更复杂的特征(考虑发件人信息、邮件标题)3.基于邮件正文信息设计更复杂的特征 4. 为探测刻意的拼写错误(把 watch 写成 w4tch)开发复杂的算法

image-20250208201329654

哪个才是最有效的呢?

11.2 误差分析

当设计一个机器学习系统时,1.通常先简单快速的实现算法,并在验证集上进行测试,2. 画出学习曲线,分析是否存在高偏差/高方差问题,决定是否需要更多数据,还是更多特征。3. 误差分析:人为检查分析验证集上出错的数据,看它们有哪些特征,算法有哪些优缺点。

2和3可以为我们的后续优化做指导

image-20250208202429552

通过以下方式分析统计验证集上犯错的样本:1. 邮件的类型 2. 没有被正确分类的原因。

通过数字体现出问题的大头,然后着重去解决问题的大头。

image-20250208203447966

通常使用数值评价指标来判断一个方法是否对算法优化有效。比如:不使用单词主干提取在验证集的错误率是5%,使用单词主干提取在验证集的错误率是3%. 有效则采用。

image-20250208205152035

总计:先简单粗暴实现算法,然后通过误差分析,分析出现了哪些失误,以此决定之后的优化方法。使用数值评价指标来试验新的想法,来确定这些想法哪些有用/无用。

11.3 类偏斜的误差度量 Error Metrics for Skewed Classes

偏斜类:正负类别样本数量差距非常大。事实上只有0.5%得人得癌症,是否得癌症就是一个偏斜类。假设在癌症检测算法中,我们的算法错误率为1%,那么我们得算法还不如全输出$y=0$的算法(错误率0.5%)

**在偏斜类问题上使用分类错误率或分类准确度不能恰当的评价算法的好坏。**对于偏斜数据集,如果单纯考虑准确率accuracy,会导致有时候模型预测的结果,还不如全部判断为1或者全部判断0 的结果好。 所以需要引入另外一些辅助度量指标。

image-20250208212553201

这里我们让$y=1$表示数量少的类别(得癌症)

查准率:在我们算法预测得癌症的人中,有多大比率的病人是真正患有癌症的。$precision=\frac{正确预测患有癌症人数}{预测阳性}=\frac{真阳性}{真阳性+假阳性}$

查全率(召回率):数据集中确实得癌症的病人,有多少我们正确预测他们得了癌症。$recall=\frac{正确预测患有癌症人数}{实际阳性}=\frac{真阳性}{真阳性+假阴性}$

image-20250208214504393

查准率和查全率都是越高越好。在偏斜类问题中,使用查准率和召回率比使用准确率要好得多。

11.4 查准率Precision 和 查全率Recall 之间的权衡

假设我们使用逻辑回归来预测癌症,输出$h_\theta(x)$介于[0, 1]之间。我们先设阈值=0.5,若$h_\theta(x) \ge 0.5$,预测为正例,得癌症。若我们把阈值修改为0.7,那么我们预测得癌症的人有更大的可能性确实得癌症,判断的准、但有更多正例被漏掉,即有更高的查准率,但有更低的查全率。相反,若我们把阈值修改为0.3,那么我们找的全,但有更多负例被错判为正例,即有更高的查全率,但有更低的查准率。

image-20250209195928045

那么我们如何权衡查准率和查全率,当不同算法或者不同阈值,有着不同的查准率和查全率,我们该怎么判断哪个算法更好呢?

一个结合了查准率和查全率的数值评价指标是F1分数。$F_1 score=2\frac{PR}{P+R}$,只要P或R有一个低,F1分数就会很低。F1分数越高,算法表现越好。

如何自动选取阈值?可以使用不同的阈值在验证集上计算F1分数,分数最高的算法表现好。

image-20250209201920414

11.5 数据集的大小

对于机器学习,通常可以选择很多不同的算法进行预测,随着训练集规模增大,准确率一般会提高:

image-20250209205401138

但事实上,单纯增大数据集并不能解决一切问题。 如果数据集中含的信息很少(比如想对房价进行预测,但是只有面积数据。这时候即使增加数据、或者对模型在面积这个feature上进行多项式处理,也起不到好的效果)

image-20250209210245426

当我们的算法使用的特征值有足够的信息,即参数多,这将会是一个低偏差的算法。这时$J_{train}(\theta)$会很小;

当我们使用一个非常大的数据集时(不太可能过拟合),这将会是一个低方差的算法。这时$J_{train}(\theta) \approx J_{test}(\theta)$.

若我们结合两者,就能得到一个$J_{test}(\theta)$会很小的优秀算法。

image-20250209204628658

总结:如果我们能做到1.人类专家能够根据特征值$x$预测出来$y$(即,特征值有足够的信息), 2.有一个庞大数据集。那么我们就能训练出性能好的学习算法。

如果模型欠拟合(偏差bias大),那么就要增加特征(对神经网络增加hidden units);如果模型过拟合(方差variance大),那么就要增大数据集,使得$J_{cv} \approx J_{train}$,从而降低过拟合。


11.机器学习系统设计
http://example.com/2025/02/16/11 机器学习系统设计/
作者
Dongxuan Liu
发布于
2025年2月16日
许可协议