Building a Spam Classifier
Prioritizing What to Work On
本节将会设计一个垃圾邮件分类器,具体方法是这样的:首先设定一些经常在垃圾邮件中出现的单词,比如
buy, discount, deal等等,假如有m个。然后对于一封邮件,用一个长度为m的0/1向量表示这些单词是否在
这封邮件中出现过。
一般来说,这些单词不是人工设定的,而是从训练集中选择出现频率最高的。提高准确性的方法有:
1. 收集更多数据。
2. 关注隐含信息,如发送邮件的服务器等。
3. 注意字符替换,比如w4tch , med1cine等。
而具体选择哪个方法是需要策略的,下面将会介绍。
Error Analysis
改善算法一般可以这样:
- 提出算法,并用cross validation集检验。
- 画出learning curve,看看增大数据集是否会有改善(是否过拟合/欠拟合)。
- 手动调查哪些数据会出现错误,并研究原因,看看能设置哪些新属性从而区分它们。
Handling Skewed Data
Error Metrics for Skewed Classes
有时不能用预测准确率来评估一个算法好坏。比如一个肿瘤良性/恶性分类器,数据集中只有0.5%的数据是
恶性的(数据非常skewed),那么举一个极端的例子,如果你对于所有数据都预测良性,你的准确率是
99.5%,因此这不能反映出算法的优劣。
在这种情况下,可以使用Precision/Recall模型:
Precision = true positive / predicted positive = true positive / ( true positive + false positive)
Recall = true positive / actual positive = true positive / (true positive + false negative)
这两项都是越高越好,如果像上面一样对所有数据都预测为良性,那么这两项都会等于0。
注意要把出现频率极少的一项作为1。
accuracy = SUM(TruePositive,TrueNegative)/All (ALL为表格所有值之和)
Trading Off Precision and Recall
对于一个肿瘤分类算法,假设1表示良性,0表示恶性,正常的预测方法是hθ(x)< 0.5 预测为0,>0.5预测为
1。如果我们想要预测为0(恶性)的预测尽量准确,一种方法是修改分类的参数值0.5为更小的数。这样的效
果是预测为0的结果正确性更高,但同时也有更多确实为0(恶性)的患者被预测为1了。直接的效果就是
precision上升同时recall下降。实际上,在调节分类参数时precision和recall是此消彼长的。
假设测出了各个算法的P,R值,如何确定哪个最好呢?平均数肯定是不合理的,一种合理的方法是计算:
2*P*R/(P+R)
Using Large Data Sets
Data For Machine Learning
对于大多数学习算法来说,给足够多的数据,最终都会有较好的结果
“It’s not who has the best algorithm wins, it’s who has the most data.”
然而这需要满足一个条件,就是模型使用的属性包含了足够的信息,假如只给出房子的大小,而没有其他的
信息来预测房价,有再多的数据也不能保证准确性。检验模型是否有用的一个方法就是想想如果把模型中的
信息给一个人类专家,他可以准确预测吗?
因此一个好的算法一般是:
1由一个复杂的模型组成(linear/logistic regression中参数复杂或是神经网络中的网络结构复杂)
2用大量的数据来避免过拟合。
第一条保证low bias (Jtrain(θ) 非常小),第二条保证low varience(Jtrain(θ) 约等于 Jtest(θ)),因此这
种情况下 Jtest(θ)也会非常小。