1. Error analysis
研究机器学习的东西或者构造机器学习应用程序,最好的实践方法不是建立一个非常复杂的系统拥有多么复杂的变量,而是构建一个简单的算法。这样你可以很快地实现它.通过画出学习曲线以及检验误差来找出算法是否有高偏差和高方差的问题或者别的问题。在这样分析之后再来决定用更多的数据训练或者加入更多的特征变量。
除了画出学习曲线之外,一件非常有用的事是误差分析。什么是误差分析?
举个例子,比如构造垃圾邮件分类器时,使用交叉验证数据集去验证模型,然后亲自看一看哪些邮件被算法错误地分类。通过这些被算法错误分类的垃圾邮件与非垃圾邮件,发现某些系统性的规律,什么类型的邮件总是被错误分类。 进而能启发你构造新的特征变量。这种误差分析是一种手动检测的过程,检测算法可能会犯的错误。
最后在构造机器学习算法时另一个有用的小窍门是保证你能有一种数值计算的方式来评估你的机器学习算法,如交叉验证错误率。
小结:
2. Error Metrics for Skewed Classes
上面说到要找一个数值去评估算法的性能,一个合适的误差度量值是很重要的。下面讨论数据不均衡或者说数据偏斜类的问题。
比如癌症的分类问题就是一个数据偏斜类的问题。我们的模型能够达到99%的精度,只有1%的误差。然而实际上人患癌症的概率只有0.5%,也就是说我随便从测试集中pick一个样本,它也有99.5%的概率是没有病的。但是这个模型说它只有99%的概率没病就有问题了。
正例和负例的比率非常接近于一个极端,在这个例子中正样本的数量与负样本的数量相比非常非常少,因为y=1非常少我们把这种情况叫做偏斜类。
对于偏斜类问题,要使用不同的误差度量值或者不同的评估度量值,其中一种评估度量值叫做查准率(precision)和召回率(recall)。
查准率就是说模型认为是正例的样品有多少是真正的正例;
召回率就是说真正的正例中有多少被查出来了。
拥有高查准率或者高召回率的模型是一个好的分类模型。
3.Trading Off Precision and Recall
上面说到的都是通过一个逻辑回归模型获得输出, 如果h(x)大于或等于0.5预测值为1;如果方程输出值小于0.5预测值为0;这个回归模型能够计算查准率和召回率。我们可以修改这个阈值来获得不同的查准率和召回率。在不同的问题中,我们可能看中查准率,也有可能看中召回率。比如如果一个病人实际患有癌症,但是我们并没有告诉他患有癌症,那这可能造成严重后果,这就强调查准率的重要性。将阈值设为0.7或者更高能够获得更高的查准率。如果我们过于保守,将阈值调低,召回率就高,这样这个模型就会认为更多人患有癌症,但实际上这里面有很多是假阳性的,此时查准率就会下降。
当你改变临界值的值时,画出曲线来权衡查准率和召回率。查准率-召回率曲线的形状有很多可能性,这取决于回归模型的具体算法。那么怎样决定哪一个算法是最好的?比如下面这3个例子:
到底是0.5的查准率与 0.4的召回率好;还是说0.7的查准率与0.1的召回率好; 计算一下查准率和召回率的平均值,用P和R来表示查准率和召回率。你可以发现这并不是一个好办法。引入一个新的评估度量值F1.它会给查准率和召回率中较低的值更高的权重。通过尝试不同的临界值,你可以在验证集上测试得到一个高F1值的模型。
4. Data For Machine Learning
“取得成功的人不是拥有最好算法的人 而是拥有最多数据的人” 这句话什么时候正确?什么时候错误?假设在机器学习问题中,特征值x包含了足够的信息帮助我们准确地预测y。那么这个假设什么时候成立呢?一个方法就是把相同的信息拿给这个领域的人类专家,人类专家能够准确或自信地预测出y的值说明这个假设是成立的。
当我们使用大量数据去训练一个复杂的模型,如果训练集比参数的数量还大,甚至是更多,那么这些算法就不太可能会过度拟合。有庞大的训练集并且不太可能过度拟合,误差有希望接近测试误差。
为了有一个高性能的学习算法,我们希望它不要有高的偏差和方差。偏差问题将通过确保有一个具有很多参数的学习算法来解决;通过用非常大的训练集来保证 我们在此没有方差问题。从根本上来说一个关键的假设:特征值有足够的信息量 且我们有一类很好的函数。这是能保证低误差的关键所在。