机器学习:软件工程方法与实现
上QQ阅读APP看书,第一时间看更新

4.1.4 如何选择学习算法

理论上来说,算法的选择需要考虑问题的复杂度、模型的复杂度和样本规模。我们常常会听到一些不太负责任的回答:“看数据情况,诸如样本量、特征情况,复杂的问题用复杂的算法,简单的问题用简单的算法……”确实,在尝试具体的学习算法前,没人能下定论。没有一种学习算法适用于所有情况,例如,一般来说问题简单或没有足够的数据时,我们倾向于选择线性模型,样量大时则选择非线性模型。而在实践中样本量大,但数据稀疏,线性模型可能比更复杂的非线性模型的性能更好。

当然在实践中我们依然有些方案可寻,例如算法是否被广泛使用或开源是否成熟(存在错误的可能性更小)、是否匹配当前的场景和数据量、是否是领域内算法、是否是竞赛中获奖的方法(如Kaggle)、训练时间如何、列比行多建议使用线性模型等。论文一[1]和论文二[2]根据数据集的形式给出了多种分类算法的性能比较。数据集的表现形式有大数据集、小数据集、宽数据集、高瘦数据集等。

1.3节也提到了几种算法作为参考:

·有应用经验的、熟知的或喜欢的学习算法;

·书或论文中对某类问题推荐的学习算法;

·以企业IT基础架构和数据环境为选择依据,例如企业内部是否支持上线和维护。

算法的选择是一个实践和权衡的过程,简单的学习算法,稳定性、可调试性、解释性、工程复杂性往往会优于复杂的学习算法,而复杂的学习算法性能表现往往更好,各有优势。从简单算法入手似乎更适合入门,但不管怎样,建议进行实践与实验,并综合考量。

另外,有相关研究人员做了sklearn中的各算法性能比较,请参考sklearn-benchmarks[3]

微软的一篇文章从机器学习的种类(分类、回归、异常检测)、算法的准确性、训练时长、参数量等角度也提供了一些算法选择的建议[4]

著名数据科学网站KDnuggets[5]展示了近一年最流行的机器学习算法,如图4-5所示。

图4-5 KDnuggets排名前17的方法

[1] Rich Caruana,Alexandru Niculescu-Mizil.“An Empirical Comparison of Supervised Learning Algorithms.”ACM,2006

[2] Rich Caruana,Nikolaos Karampatziakis,Ainur Yessenalina.“An empirical evaluation of supervised learning in high dimensions.”ACM,2008

[3] https://github.com/rhiever/sklearn-benchmarks

[4] https://docs.microsoft.com/en-us/azure/machine-learning/studio/algorithm-choice

[5] https://www.kdnuggets.com/2019/04/top-data-science-machine-learning-methods-2018-2019.html