有时候,模型准确性并不能评价一个算法的好坏。比如针对癌症筛选算法,据统计,普通肿瘤中癌症的概率是0.5%。有个机器学习算法,测试得出的准确率是99.2%,错误率是0.8%。这个算法到底是好还是坏呢?如果努力改进算法,最终得出的准确率是99.5%,错误率是0.5%,模型到底是变好了还是变坏了呢?
坦白讲,如果单纯从模型准确性的指标上很难判断到底是变好了还是变坏了。因为这个事情的先验概率太低了,假如写了一个超级简单的预测函数,总是返回0,即总是认为不会得癌症,那么我们这个超级简单的预测函数的准确率是99.5%,错误率是0.5%。因为总体而言,只有那0.5%真正得癌症的却被我们误判了。
那么怎么样来评价这类问题的模型好坏呢?我们引入了另外两个概念,查准率(Precision)和召回率(Recall)。还是以癌症筛选为例:
查准率和召回率的定义如下:
如何理解True/False和Positive/Negative?
- True/False表示预测结果是否正确;
- Positive/Negative表示预测结果是1(恶性肿瘤)或0(良性肿瘤)。
- TruePositive表示正确地预测出恶性肿瘤的数量;
- FalsePositive表示错误地预测出恶性肿瘤的数量;
- TrueNegative表示正确地预测出良性肿瘤的数量;
- FalseNegative表示错误地预测出良性肿瘤的数量。
在处理先验概率低的问题时,我们总是把概率较低的事件定义为1,并且把y=1作为Positive的预测结果。针对上文介绍的,对总是返回0的超级简单的肿瘤筛选预测函数,我们使用查准率和召回率来检验模型性能时,会发现查准率和召回率都是0,这是因为它永远无法正确地预测出恶性肿瘤,即TruePositive永远为0。
在scikit-learn里,评估模型性能的算法都在sklearn.metrics包里。其中,计算查准率和召回率的API分别是sklearn.metrics.precision_score()和sklearn.metrics.recall_score()。