首先要做什么
给定一个电子邮件数据集,我们可以为每个电子邮件构建一个向量。这个向量中的每个条目代表一个单词(词袋模型)。该矢量通常包含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 | Predict 1 if: hθ(x)≥0.7 |
在这种情况下,我们将会有较高的precision,但是recall将会变低。
假设考虑到一个已经患癌症的病人如果误判为没有患癌症,那么病人可能将因不能及时治疗而失去宝贵生命,所以我们想要避免错过癌症患者的一种方式就是降低阙值,假设降低到0.3, 即:
1 | Predict 1 if: hθ(x)≥0.3 |
在这种情况下,将得到较高的recall,但是precision将会下降。
为了将precision和Recal转变为一个单一数值,我们引入了F1值:
$F_1 = 2\frac{PR}{P+R}$
总结:
衡量一个算法应该用一下值综合考虑:
$Accuracy = \frac{true positives + true negatives }{total examples}$
$Precision = \frac{true positives}{true positives + false positives}$
- $Recall = \frac{true positives}{true positives + false negatives}$
- $ F 1 = \frac{ 2 precision * recall}{precision + recall}$
使用大的数据集
但事实证明,在一定条件下,得到大量的数据并在某种类型的学习算法中进行训练。 可以是一种获得一个具有良好性能的学习算法有效的方法。
像这样的结果引起了一种在机器学习中的普遍共识: “取得成功的人不是拥有最好算法的人,而是拥有最多数据的人”
那么这种说法,在什么时候是真,什么时候是假呢?
- 特征x包含足够的信息来准确地预测y。 (例如,验证这种情况的一种方式是,如果只有在给定x的情况下,领域上的专家才能自信地预测y)。
- 我们训练一个具有大量参数(能够学习/表示相当复杂的函数)的学习算法。