以垃圾邮件分类为例来学习机器学习系统设计,左边为垃圾邮件,右边为非垃圾邮件
建立一个垃圾邮件分类器,使用邮件中的单词作为特征,垃圾邮件和非垃圾邮件输出值分别用1和0表示,同时需要采用监督学习的方式,选择一个100个单词出来可以很好对垃圾邮件和非垃圾邮件进行区分。实际上在垃圾邮件有10000到50000个单词是高词频的,通常是选取其中词频最高的100个单词来作为特征
为了构建分类器算法,还有很多策略,比如:
1. 收集更多的数据,让我们有更多的垃圾邮件和非垃圾邮件的样本
2. 基于邮件的路由信息开发一系列复杂的特征
3. 基于邮件的正文信息开发一系列复杂的特征,包括考虑截词的处理
4. 为探测刻意的拼写错误(把 watch 写成 w4tch)开发复杂的算法
1.2 误差分析 Error analysis
推荐一个学习方法:
1. 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法
2. 绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择
3. 进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的实例,看看这些实例是否有某种系统化的趋势
在误差分析中,假设验证集有500个,检查出错误分类的邮件有100个,那么我们就要对人工的去检查这100个被错误分类的邮件,按两种方式对他们进行分析,第一种是区分它们的类型分布,第二种是分析它们被错误分类的原因
还有一个技巧就是数值估计,帮助你去选择是否使用词干提取的软件,就是当出现 discount/discounts/discounted/discounting 的时候是否都把他们看成discount这个feature,这么做有可能是好的,也有可能是不好的,比如遇到universe和university的时候可能就不是我们想要的预期结果,所以具体还得看情况来决定是否使用这个软件,我们可以使用数值估计的办法来分析,比如使用词干提取,结果有3%的error;不使用,则有5%的error,那就选择使用词干提取
1.3 不对称性分类的误差评估 Error metric for skewed classes
对于一个分类问题,结果仅有两类y=0和y=1,其中一类样本非常多、另一类非常少,这就属于不对称性分类,还可以被叫做类偏斜(skewed classes),对于这种不对称性的据集,如果单纯考虑准确率accuracy,会导致有时候模型预测的结果,还不如全部判断为1或者全部判断0 的结果好。所以需要引入另外一些辅助度量指标
在一个二分类问题中,有正类(positive)和负类(negative),那么在分类结果中就会出现这四种情况:
1. 预测正类正确(True Positive,TP):预测为真,实际为真
2. 预测负类正确(True Negative,TN):预测为假,实际为假
3. 预测正类错误(False Positive,FP):预测为真,实际为假
4. 预测负类错误(False Negative,FN):预测为假,实际为真
对这四种情况有了了解后就可以引入助度量指标:
precision(精准度/查准率): 正确预测的正类/所有预测为正类 TP / (TP + FP)
recall(召回率/查全率):正确预测正类/所有真实值为正类 TP / (TP + FN)
1.4 精准度和召回率的权衡 Trading off precision and recall
在二分类问题中,我们往往会设定一个阈值threshould,当大于等于阈值时就预测为1,当小于阈值时就预测为0
阈值的设定会影响到召回率和精准度:
当阈值设定越高,查准率Precision越高、查全率Recall越低。因为判断的准、但有更多正例被漏掉
当阈值设定越低,查准率Precision越低、查全率Recall越高。因为找的全,但有更多负例被错判为正例
那么阈值的选择就十分重要了,那如何去判断一个阈值的是好还是坏呢?显然求召回率和精准度得平均值是不合适的
所以就引入一个评价标准 F1Score,F1Score的定义为:,F1Score越大说明该阈值越好
1.5 机器学习数据 Data for machine learning
在机器学习中通常可以选择很多种的算法,但是扩大训练集的规模可以提高精准度,甚至比选择一个好的算法更有效
但实际上,一味地增加数据集规模也不一定是好的,如果数据集中含的信息很少,这时候即使增加数据也起不到好的效果
总之
如果模型欠拟合,即偏差bias大: 那就要增加特征(对神经网络增加hidden units);
如果模型过拟合,即方差variance大: 那就要增大数据集,使得Jcv ≈ Jtrain ,从而降低过拟合