对于机器学习从业者而言,有自己最喜欢的算法是很常见的。可能这有点不太合乎常理,因为没有一个算法能够完全地主导所有的应用,而且机器学习算法的性能很大程度上依赖于应用程序和数据集的维度。甚至对于一个给定的问题和数据集,由不同算法训练而得到的一个组合模型往往会优于单个模型。尽管如此,人们还是有自己最喜欢的算法。有些人喜欢SVM,因为它们有着优美的公式或者是可直接使用的高质量算法实现;也有些人喜欢决策规则,因为它们的简单性和可解释性;还有些人则因为神经网络的灵活性而痴迷于它。
我所喜欢的算法就是(你可能已经猜到了)Random Forest(随机森林),而且它属于第二种常用的建模技术(首选项是线性模型),我通常会在所有给定的数据集上都尝试一下。
这里有几个原因
- 随机森林几乎不需要输入准备。它们可以处理二元特征,分类特征,数字特征,并且不需要任何缩放处理。
- 随机森林可实现隐式特征选择,并且提供一个很好的特征重要性指标。
- 随机森林训练速度非常快。它的一个特色就是当性能优化时,恰巧会提高模型精度,反之亦然。随机特征子集设置的目的在于多样化单个树,同时也是一个出色的性能优化!此外,特征调整部分被认为是,在任何给定的节点下,都可以让你在有着成千上万个特征的数据集中轻松的工作。(如果你的数据集有很多行,此方法同样适用于行采样)。
- 随机森林很难超越。尽管你通常可以找到一个模型,该模型在任何给定的数据集上都可以超越随机森林(一般是神经网络或者一些boosting算法),但是这样的模型并不多,而且和随机森林相比,建立和调整这些模型所需要的时间通常更长。这也是为什么仅仅把它们当作优秀的参考模型的原因。
- 真的很难建立一个糟糕的随机森林模型!因为随机森林对特定的超参数的使用并不是非常敏感,它们不需要做大量的调整和修改就可以得到一个体面的模型,只要使用大量的树,实验结果就不会显得糟糕。大多数Random Forest的实现对于可选的参数都有一个合理的默认值。
- 通用性。随机森林适用于各种各样的建模工作,它们可以很好的处理回归任务和分类任务(甚至产生体面的校正的概率分数),尽管我在聚类方面没有尝试过,但它同样可以用于聚类分析。
- 简洁性。如果不是模型产生的,那么就是学习算法自身带有的特性。基本的RF学习算法只需要几行代码就可以实现。对于这一点确实有点讽刺意味,但也有一种优雅的感觉。
- 大量优秀、免费以及开源的实现。你可以在几乎所有主要的机器学习库或工具箱中找到很好的实现。R,scikit-learn和Weka就是因为有着特别好的实现而备受关注。
- 似乎所有的这些都还不够,Random Forest能够以并行方式轻松的成长。而对于boosted模型和大的神经网络,则不能。
这个来自scikit-learn美观的可视化结果证实了决策森林的建模能力。
缺点?
- 随机森林的主要劣势在于模型大小。你可能需要数百兆的内存才能轻松地结束一个森林,而且评估的速度也很慢。
- 另外一点,有些人可能会发现一个问题,也就是随机森林模型其实是个很难去解释的黑盒子。
一些参考资料:
Leo Breiman发表的一篇论文,他是随机森林算法描述的发明者。
这里还有Rich Caruana等人发表的另一篇论文,内容讲的是在各种不同的数据集上评估不同的监督学习算法。
原文链接:The Unreasonable Effectiveness of Random Forests(译者/刘帝伟 审校/赵屹华、朱正贵、李子健 责编/周建丁)
译者简介: 刘帝伟,中南大学软件学院在读研究生,关注机器学习、数据挖掘及生物信息领域。