关于机器学习的系统构建方法和一些小技巧
对于机器学习问题,如果我们能不断地对自己的模型有新的想法,并且能够将自己的想法实现,能做到这些就已经很不错了。
关于如何系统地构建机器学习模型,我推荐下列步骤:
- 用交叉验证的方法快速实现一个模型,不必管这个模型的好坏,只要快速做出来就好,避免提前优化。
- 画学习曲线来决定下一步该怎么做,比如增加数据特征、增加数据量、减小正则化参数 λ \lambda λ等等措施。不知道学习曲线是什么的参考我的上一篇博客:机器学习如何正确调参之学习曲线
- 进行误差分析,所谓误差分析就是去看看验证集中那些模型计算出错的数据,人为地观察出错的地方有什么共同特征等,从而有针对性地改进你的模型。
其他的一些碎碎念:
- 有时候你有一些想法,不确定这个想法是不是能够提升你模型的性能,而且误差分析也不太能观察出什么,这时候建议直接做一组对比实验反而更直观也更方便。
- 对你模型的结果设计一个数值,该数值能够基本体现出你模型的好坏程度,最基本的数值就是模型在验证集上的准确率或者错误率。
但有时候分类问题上你会遇到偏斜类(skewed classes)的数据集,即两种类别的数据分类很极端,例如患癌症的比例为0.5%。面对这种情况如果你的数值估计依旧使用准确率或者错误率就不太好,因为即使你的模型把所有人都分类为不患癌症,在验证集上的准确率却可以达到99.5%,这种数值估计就不太好。
这时候引进查准率Precision和召回率Recall作为评估指标,查准率Precision指的是:
预
测
患
癌
症
中
真
正
患
癌
症
的
数
量
预
测
患
癌
症
的
数
量
\frac{预测患癌症中真正患癌症的数量}{预测患癌症的数量}
预测患癌症的数量预测患癌症中真正患癌症的数量
召回率Recall指的是:
预
测
患
癌
症
中
真
正
患
癌
症
的
数
量
所
有
人
中
真
正
患
癌
症
的
数
量
\frac{预测患癌症中真正患癌症的数量}{所有人中真正患癌症的数量}
所有人中真正患癌症的数量预测患癌症中真正患癌症的数量
一般来说拥有高查准率,召回率就会比较低,反之亦然。这时就要具体问题具体分析了,看你想要高查准率还是高召回率。当然也可以通过模型优化来让查准率和召回率都尽量高点。
有时候你对查准率和召回率谁高都无所谓,那么我们该怎么知道哪一个模型更好呢?这时候就要引进新的衡量指标,设查准率为P,召回率为R,则
F
1
s
c
o
r
e
=
2
P
R
P
+
R
F_1score=2\frac{PR}{P+R}
F1score=2P+RPR
可以看出在这个公式中,当P或R有一个为0时,
F
1
s
c
o
r
e
F_1score
F1score的值降为0,表明这个模型性能很不好,当P或R都为1时,
F
1
s
c
o
r
e
F_1score
F1score的值为1,表明这个模型是完美的。在平时的测度中就可以根据
F
1
s
c
o
r
e
F_1score
F1score的值来选择更好的模型。
除上述步骤之外,还有一点关于训练数据的问题,毕竟真正能决定模型性能的还是训练数据,大概有以下两点:
- 想知道你的数据是否有效,第一个测试的方法是想象该问题如果让一个该领域的人类专家来做,是否能够做出来,如果因为数据中的特征数太少,人类根本无法判断该问题的正确答案,那么你得考虑考虑是否要加更多的数据特征了。
- 当你有很大的训练数据集,同时用一个很大的模型去训练,最终的模型效果应该八九不离十了。