机器学习领域的从业人员都有自己最喜欢的一些算法,这种现象在正常不过了。但这种现象有点不太合理,因为没有一个算法可以完全统领所有的应用领域。根据不同的应用类型和待处理数据集的维度,机器学习算法的性能表现差异巨大。甚至对于一个给定的问题和数据集,任何一个单一模型都有可能被一个集成多种不同训练算法的模型所打败。但尽管如此,人们还是会有自己喜欢使用的一些算法。有的喜欢支持向量机(SVM),因为它公式表达的优雅和可利用方法实现的高质量;有的人喜欢决策树,因为它的简洁性和解释能力;还有人对神经网络非常痴狂,因为它解决问题的灵活性。
我最喜欢的现成算法(也许就像你猜的那样)是随机森林算法。这也是我会在任何给定的数据集上都会尝试的第二个典型建模技巧(第一个是线性模型)。
列出一些我的理由吧:
随机森林算法几乎不需要输入的准备。它们不需要测算就能够处理二分特征、分类特征、数值特征的数据。随机森林算法能完成隐含特征的选择,并且提供一个很好的特征重要度的选择指标。
随机森林算法训练速度快。性能优化过程刚好又提高了模型的准确性,这种精彩表现并不常有,反之亦然。这种旨在多样化子树的子设定随机特征,同时也是一种突出的性能优化!调低给定任意节点的特征划分,能让你简单的处理带有上千属性的数据集。(如果数据集有很多行的话,这种方法同样的也可以适用于行采样)
随机森林算法很难被打败。针对任何给定的数据集,尽管你常能找到一个优于它的模型(比较典型的是神经网络或者一些增益算法 boosting algorithm),但这类算法肯定不多,而且通常建这样的模型并调试好要比随机森林算法模型要耗时的更多。这也是为何随机森林算法作为基准模型表现出色的原因。
建立一个差劲的随机森林模型真的很难!因为随机森林算法对指定使用的超参数(hyper-parameters )并不十分敏感。为了要得到一个合适的模型,它们不需要做很多调整。只需使用大量的树,模型就不会产生很多偏差。大多数的随机森林算法的实现方法的参数设置初始值也都是合理的。
通用性。随机森林算法可以应用于很多类别的模型任务。它们可以很好的处理回归问题,也能对分类问题应付自如(甚至可以产生合适的标准概率值)。虽然我从没亲自尝试,但它们还可以用于聚类 分析问题。
简洁性。对于随机森林来说,如果不是结论模型很简洁,就是学习算法本身很简洁。基本的随机森林学习算法仅用几行代码就可以写出来了。也许这样说有点讽刺。但是也精当得体。
提供了数量庞大的精彩、免费、开源实现方法。你能在几乎所有主要的机器学习资料库和工具箱中找到一个好的实现方法。我现在知道的是,随机森林算法在R 、scikit-learn 和 Weka 上都有非常好的实现方法。
如果以上的理由还不够的话,那么随机森林算法还能很容易进行并行生长。Boosted model 或者大规模神经网络可做不到这一点。
scikit-learn给出了清晰的视觉图展示决策森林的模型容量。
scikit-learn.org 的视觉图像展示了单个决策树、随机森林和其他算法的决策边界和模型容量。
缺点?
RF 算法的主要缺点就是模型规模。模型很容易就以会花费成百上千兆字节内存,最后会因为评估速度慢而结束。另一个可能会引发担忧的缺点就是,随机森林模型过程是很难解释清楚的黑箱。
参考文献:
一篇是随机森林算法创始人Leo Breiman的文章。
另一篇是 Rick Caruana 根据许多不同的数据集测算了几个监督学习算法的精彩文章。