构建一个垃圾邮件分类器
对于垃圾邮件,我们可以人为的挑选若干个关键词作为识别垃圾邮件判断的特征,而在实际应用中,我们应该遍历整个训练集,在训练集中找出出现次数最多的n个单词,n介于10,000和50,000之间,将这些单词作为所选用的特征。根据所找到的特征集合,我们可以为每一个邮件构建一个向量,如果在电子邮件中找到一个字,我们将分配其相应的项1,否则这一项将为0,即向量的每一项表示一个单词。一旦我们准备好所有的x向量,我们就会训练我们的算法,最后, 我们可以使用它来分类邮件是否是垃圾邮件。
- 收集更多地数据(例如“honepot”项目,但这并不一定有效)
- 发现更具有代表性的特征(例如:垃圾邮件发送中的题目-header)
- 开发一种算法实现输入的不同方式(垃圾邮件中的拼写错位)
很难讲,以上的措施哪一个更有效。。。从而引出接下来的error analysis
误差分析
解决一个新的机器学习问题的推荐方法是:
- 从一个简单的算法开始,尽快的实现它,并通过交叉验证集测试它
- 尝试绘出学习曲线(learning curve)以决定是否更多地特征、数据会对处理有效
- 手动检查交叉验证集中的样本误差,并尝试发现大多数误差发生的趋势
例如假设我们有500份邮件,我们的模型误分类了其中的100份,我们这是应手动的分析这100份邮件,判断各属于什么类型,然后,我们可以尝试提出新的线索和特征,以帮助我们正确地分类这100封电子邮件。如果大多数错误分类的电子邮件是尝试窃取密码的邮件,那么我们可以找到这些电子邮件特有的功能,并将其添加到我们的模型中。
数值化模型的误差值
将得到误差转化为单个数值是机器学习中的一个窍门。 否则,很难评估学习出的算法的性能。例如,如果我们使用词干截取软件(这是将不同形式的同一个单词(fail/failing/failed)作为一个单词(fail))处理的过程,并且获得3%的错误率而不是5%,那么我们应该增加它到我们的模型。然而,如果我们尝试区分大写字母和小写字母,最终得到3.2%的错误率而不是3%,那么我们应该避免使用这个新功能。总而言之,我们应该尝试方法,并将该方法下的误差率以数值表示,并根据得到的结果决定是否要保留新功能。
错误指标-偏斜类
以癌症的分类为例,训练逻辑回归模型\(h_\theta(x)\).其中(确诊为癌症时y=1,否则y=0)。当通过训练集样本训练出的模型对诊断的精确度达到99%时,即在测试集上误差律仅为1%,这是是否可以说我们的训练模型已经很优秀了呢?然而癌症患者的患病概率仅为0.5%,若我们进定义如下函数:
function y = predictCancer(x)
y = 0; %ignore x!
return
上述函数模型精确度也达到了99.5%,比之前训练的模型看起来更加优秀,事实是这样吗?
查准率/回收率
y=1表示我们想检测的真实类,整体分类可能有以下几种:
设计一种高精度的学习系统:如,对于模糊单词的分类{to,two,too},{then,than}
尝试使用以下4种算法:1.感知器-Perceptron(Logistic regression)2.Winnow 3.Me,ory-based 4.朴素贝叶斯,随着训练集数目的增多,精确度如下图:
使用包含很多参数的学习算法(如:具有很多特征的逻辑回归/线性回归;具有多个隐藏层的神经网络)有:\(J_{train}(\theta)\)将会变小,在没有出现过拟合现象下,增大训练集有:
\(J_{train}(\theta) \approx J_{test}(\theta)\),此时\(J_{test}(\theta)\)也将会变小。