构建一个机器学习算法的推荐方法为:
1.从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法
2.绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择
3.进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的实例,看看这些实例是否有某种系统化的趋势
但是有时候,只使用绝对误差值未必能能作为评判算法效果的唯一依据,还要借助其它参数,尤其当我们的训练集中有非常多的同一种类的实例,只有很少或没有其他类的实例。
查准率(Precision)和查全率(Recall)我们将算法预测的结果分成四种情况:
1.正确肯定(True Positive,TP):预测为真,实际为真
2.正确否定(True Negative,TN):预测为假,实际为假
3.错误肯定(False Positive,FP):预测为真,实际为假
4.错误否定(False Negative,FN):预测为假,实际为真
(补充下,还有个accuracy = (TP + TN) / (TP + FP+ TN + FN))
则:
查准率=TP/(TP+FP)例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
查全率=TP/(TP+FN)例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。
这样,对于我们刚才那个总是预测病人肿瘤为良性的算法,其查全率是
查准率和查全率之间怎么权衡?一般会设个阈值如0.5,通常会根据场景和需要,是要高查准率还是高查全率适当调高阈值。下面两个例子帮助理解如何权衡及场景:
1. 地震的预测
对于地震的预测,我们希望的是RECALL非常高,也就是说每次地震我们都希望预测出来。这个时候我们可以牺牲PRECISION。情愿发出1000次警报,把10次地震都预测正确了;也不要预测100次对了8次漏了两次。
2. 嫌疑人定罪
基于不错怪一个好人的原则,对于嫌疑人的定罪我们希望是非常准确的。及时有时候放过了一些罪犯(recall低),但也是值得的。
将不同阀值情况下,查全率与查准率的关系绘制成图表,曲线的形状根据数据的不同而不同:
可以通过计算F1值,选择高F1值对应的PR作为阈值。 F1=2PR/(P+R)
当然还有些F1的变体和其它方式,具体参见https://www.zhihu.com/question/30643044/answer/48955833
最后引用在机器学习中的普遍共识:"取得成功的人不是拥有最好算法的人,而是拥有最多数据的人"。
只要结果可以根据特征值被准确地预测出来,同时有一组庞大的训练集并且从这些训练集中能训练一个有很多参数的学习算法,这时候得到一个性能很好的学习算法是必然的。