【发布时间】:2015-09-29 10:29:01
【问题描述】:
我试图了解随机森林是如何用简单的英语而不是数学来工作的。谁能给我一个非常简单的解释这个算法是如何工作的?
据我了解,我们提供特征和标签而不告诉算法应该将哪个特征归类为哪个标签?就像我以前做的基于概率的朴素贝叶斯一样,我们需要判断哪个特征应该是哪个标签。我真的很遥远吗?
如果我能得到任何非常简单的解释,我将不胜感激。
【问题讨论】:
标签: algorithm classification random-forest
我试图了解随机森林是如何用简单的英语而不是数学来工作的。谁能给我一个非常简单的解释这个算法是如何工作的?
据我了解,我们提供特征和标签而不告诉算法应该将哪个特征归类为哪个标签?就像我以前做的基于概率的朴素贝叶斯一样,我们需要判断哪个特征应该是哪个标签。我真的很遥远吗?
如果我能得到任何非常简单的解释,我将不胜感激。
【问题讨论】:
标签: algorithm classification random-forest
添加到上述两个答案,因为您提到了一个简单的解释。这是一篇我认为是解释随机森林的最简单方法的文章。
感谢 Edwin Chen 以通俗的方式对随机森林进行简单的解释 here。在下面发布相同的内容。
假设你很优柔寡断,所以每当你想看电影时,你都会问你的朋友 Willow,她是否认为你会喜欢它。为了回答,Willow 首先需要弄清楚你喜欢什么电影,所以你给她一堆电影,并告诉她你是否喜欢每一部(即,你给她一个有标签的训练集)。然后,当你问她是否认为你会喜欢电影 X 时,她会在 IMDB 上玩 20 个类似问题的游戏,问诸如“X 是一部浪漫电影吗?”、“约翰尼·德普出演 X 吗?”之类的问题。 , 等等。她首先提出更多信息丰富的问题(即,她最大化每个问题的信息增益),并在最后给你一个是/否的答案。
因此,Willow 是您电影偏好的决策树。
但是 Willow 只是人类,所以她并不总是很好地概括你的偏好(即,她过度拟合)。为了获得更准确的推荐,如果他们中的大多数人说他们认为你会喜欢它,你想问问你的一群朋友并观看电影 X。也就是说,您不仅要问 Willow,还想问 Woody、Apple 和 Cartman,他们会投票决定您是否喜欢一部电影(即,您构建了一个集成分类器,在这种情况下也称为森林)。
现在你不希望你的每个朋友都做同样的事情,给你同样的答案,所以你先给他们每个人稍微不同的数据。毕竟,你自己也不确定自己的喜好——你告诉 Willow 你喜欢泰坦尼克号,但也许那天你很开心,因为那天是你的生日,所以也许你的一些朋友不应该利用你喜欢这个事实泰坦尼克号提出他们的建议。或者你告诉她你爱灰姑娘,但实际上你真的很爱它,所以你的一些朋友应该给灰姑娘更多的重量。因此,不要给你的朋友你给 Willow 的相同数据,而是给他们稍微不安的版本。你不会改变你的爱/恨决定,你只是说你或多或少地爱/恨一些电影(正式地,你给你的每个朋友一个原始训练数据的引导版本)。例如,虽然你告诉 Willow 你喜欢黑天鹅和哈利波特,但不喜欢阿凡达,但你告诉伍迪你非常喜欢黑天鹅,看了两遍,你不喜欢阿凡达,根本不提哈利波特。
通过使用这个合奏,你希望虽然你的每个朋友都给出了一些特殊的推荐(Willow 认为你比你更喜欢吸血鬼电影,Woody 认为你喜欢 Pixar 电影,而 Cartman 认为你只是讨厌一切),但错误在大多数情况下被取消。因此,您的朋友现在形成了您的电影偏好的袋装(引导聚合)森林。
但是,您的数据仍然存在一个问题。虽然你喜欢泰坦尼克号和盗梦空间,但这并不是因为你喜欢莱昂纳多·迪卡普里奥主演的电影。也许您出于其他原因喜欢这两部电影。因此,您不希望您的朋友都根据 Leo 是否在电影中进行推荐。因此,当每个朋友向 IMDB 提出问题时,只允许可能问题的随机子集(即,当您构建决策树时,在每个节点上,您使用一些随机性来选择要拆分的属性,例如通过随机选择一个属性或通过从随机子集中选择一个属性)。这意味着您的朋友不得随时询问莱昂纳多·迪卡普里奥是否出现在电影中。因此,之前您在数据级别注入随机性,稍微扰乱您的电影偏好,现在您在模型级别注入随机性,让您的朋友在不同时间提出不同的问题。
所以你的朋友现在形成了一个随机森林。
【讨论】:
我会尽量用简单的词来补充解释。
随机森林是随机决策树的集合(在 sklearn 中编号为 n_estimators)。
您需要了解的是如何构建一棵随机决策树。
粗略地说,要构建随机决策树,您需要从训练样本的子集开始。在每个节点,您将随机绘制一个特征子集(数量由 sklearn 中的max_features 确定)。对于这些特征中的每一个,您将测试不同的阈值,并查看它们如何根据给定的标准(通常是熵或基尼,criterion sklearn 中的参数)分割您的样本。然后,您将保留最适合拆分数据的特征及其阈值并将其记录在节点中。
当树的构建结束时(可能是由于不同的原因:达到最大深度(sklearn 中的max_depth),达到最小样本数(sklearn 中的min_samples_leaf)等)您查看每个叶子中的样本并保持标签的频率。
结果,就像树根据有意义的特征为您提供了训练样本的分区。
由于每个节点都是根据随机抽取的特征构建的,因此您了解以这种方式构建的每棵树都会有所不同。正如@Jianxun Li 所解释的那样,这有助于在偏差和方差之间取得良好的折衷。
然后在测试模式下,测试样本将遍历每棵树,为您提供每棵树的标签频率。代表最多的标签一般是最终的分类结果。
【讨论】:
RandomForest 使用所谓的 bagging 方法。这个想法是基于经典的偏差-方差权衡。假设我们有一组(比如N)具有低偏差但高交叉样本方差的过度拟合估计量。所以低偏差是好的,我们想保持它,高方差是不好的,我们想减少它。 RandomForest 试图通过所谓的引导/子采样来实现这一点(正如@Alexander 提到的,这是对观察和特征的引导采样的组合)。预测是单个估计量的平均值,因此成功保留了低偏差属性。进一步通过中心极限定理,该样本平均值的方差等于variance of individual estimator divided by square root of N。所以现在,它同时具有低偏差和低方差特性,这就是为什么RandomForest 经常优于独立估计器的原因。
【讨论】: