机器学习系统设计

首先要做什么

给定一个电子邮件数据集,我们可以为每个电子邮件构建一个向量。这个向量中的每个条目代表一个单词(词袋模型)。该矢量通常包含10,000到50,000个条目,通过查找我们数据集中最常用的单词来收集。如果在电子邮件中找到一个单词,我们将分配它的相应条目1,否则如果没有找到,条目将是0.一旦我们已经准备好了所有的x向量,我们将训练我们的算法,最后,我们可以用它来分类电子邮件是否是垃圾邮件。

那么你怎么能花时间来提高这个分类器的准确度呢?

  • Step1.使用快速但不完美的算法实现;
  • Step2.画出学习曲线,分析偏差、方差,判断是否需要更多的数据、增加特征量….;
  • Step3.误差分析:人工检测错误、发现系统短处,来增加特征量以改进系统。

那么你怎么能花时间来提高这个分类器的准确度呢?

  • 收集大量的数据(例如“蜜罐”项目,但并不总是有效)
  • 开发复杂的功能(例如:在垃圾电子邮件中使用电子邮件标题数据)
  • 开发算法以不同的方式处理您的输入(识别垃圾邮件中的拼写错误)。

误差分析

一般我们提升模型的步骤为:

  • Step1.使用快速但不完美的算法实现;
  • Step2.画出学习曲线,分析偏差、方差,判断是否需要更多的数据、增加特征量….;
  • Step3.误差分析:人工检测错误、发现系统短处,来增加特征量以改进系统。

因此,我们应该尝试新的东西,为我们的错误率得到一个数值,并根据我们的结果决定是否要保留新的特征。(使用误差度量值 来判断是否添加新的特征)

处理偏斜类(Skewed Classes)数据

假定我们通过逻辑回归来预测病人是否患有癌症:

并且,令人欣喜的是,测试集的错误率只有 1%。别着急高兴,假如我们的测试样本中只有 0.5% 患有癌症,那么我们何不直接让预测函数为:

hθ(x)=0

即,我们永远预测病人不患病,那么准确率会高达 95%。但这可不是一件好事儿,我们追求高准确率牺牲的是病人的利益。引起这个问题的原因是样本中出现了偏斜类(Skewed Classes),偏斜即倾斜,大量样本倾斜向了某一类型。

有些时候,一些数据很不平衡,比如正向的占99%、负向的占1%(倾斜数据shewed data)。这样只用准确度这个指标就不能很好的衡量算法的好坏,所以我们引入了查准率(precision)召回率(recall)

查准率和召回率

查准率Precision)和查全率Recall) 我们将算法预测的结果分成四种情况:

正确肯定True Positive,TP):预测为真,实际为真

正确否定True Negative,TN):预测为假,实际为假

错误肯定False Positive,FP):预测为真,实际为假

错误否定False Negative,FN):预测为假,实际为真

则:查准率=TP/(TP+FP)。例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。

查全率=TP/(TP+FN)。例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。

这样,对于我们刚才那个总是预测病人肿瘤为良性的算法,其查全率是0。

预测值
Positive Negtive
实际值 Positive TP FN
Negtive FP TN

$Precision = \frac{TruePos}{PredicatedPos} = \frac{TruePos}{TruePos+FalsePos}$

$Recall = \frac{TruePos}{ActualPos} = \frac{TruePos}{TruePos+FalseNeg}$

查准率和召回率的权衡

在大多数的时候我们想找到两个评价指标的平衡。比如:

假设考虑到一个正常人如果误判为癌症,将会承受不必要的心理和生理压力,所以我们要有很大把握才预测一个病人患癌症(y=1)。那么一种方式就是提高阙值(threshold),不妨设我们将阙值提高到0.7,即:

1
2
Predict 1 if: hθ(x)≥0.7 
Predict 0 if: hθ(x)<0.7

在这种情况下,我们将会有较高的precision,但是recall将会变低。

假设考虑到一个已经患癌症的病人如果误判为没有患癌症,那么病人可能将因不能及时治疗而失去宝贵生命,所以我们想要避免错过癌症患者的一种方式就是降低阙值,假设降低到0.3, 即:

1
2
Predict 1 if: hθ(x)≥0.3 
Predict 0 if: hθ(x)<0.3

在这种情况下,将得到较高的recall,但是precision将会下降。

为了将precision和Recal转变为一个单一数值,我们引入了F1值:

$F_1 = 2\frac{PR}{P+R}$

总结:
衡量一个算法应该用一下值综合考虑:

  1. $Accuracy = \frac{true positives + true negatives }{total examples}$

  2. $Precision = \frac{true positives}{true positives + false positives}$

  3. $Recall = \frac{true positives}{true positives + false negatives}$
  4. $ F 1 = \frac{ 2 precision * recall}{precision + recall}$

使用大的数据集

但事实证明,在一定条件下,得到大量的数据并在某种类型的学习算法中进行训练。 可以是一种获得一个具有良好性能的学习算法有效的方法。

像这样的结果引起了一种在机器学习中的普遍共识: “取得成功的人不是拥有最好算法的人,而是拥有最多数据的人”

那么这种说法,在什么时候是真,什么时候是假呢?

  1. 特征x包含足够的信息来准确地预测y。 (例如,验证这种情况的一种方式是,如果只有在给定x的情况下,领域上的专家才能自信地预测y)。
  2. 我们训练一个具有大量参数(能够学习/表示相当复杂的函数)的学习算法。
如果觉得对您有帮助,就扫我交个朋友吧!