上篇文章我们分析了构建决策树的过程,目的是为了理解真正的“大杀器”–随机森林的原理。这里我们开始尝试讨论一下随机算法原理。
我们先来看历史上一个统计学的失败案例。美国一家有名的刊物《文学文摘》预测1936年美国总统选举结果发生重大失误,导致这家杂志不久即宣告破产。当年的两位候选人,一是民主党的罗斯福,一是共和党的兰登,《文学文摘》通过240万人的问卷调查预测兰登会以57%:43%的优势战胜罗斯福。最后结果:罗斯福以62%:38%的压倒优势当选。
而盖洛普在战后做过多次关于总统大选结果的民意测验,只采用了几千人的问卷,但取得了与实际结果接近的结果。为何《文学文摘》做了这么大规模的调查,反而没有取得满意的结果呢?问题出在样本的挑选上。该刊从电话号码簿和俱乐部会员名册上挑选了过多的调查对象,由于美国安装电话的人都是富裕阶层,这些富裕阶层更偏向于共和党,所以调查结果会偏向共和党。《文学文摘》的失败关键是没有选取到能够代表整体数据的样本。统计学上把这种不是随机选取,不能反映整体数据分布的样本成为样本出现了偏倚。
这个统计学的案例和决策树有什么关系呢?
统计学和概率是一个硬币的两面,而我们应该明白一棵决策树做出的判断都是基于概率的,所以这种判断结果不是对每条数据来说都是正确的,只要有一个较高的概率得出正确判断结果我们就认为决策树是可用的。决策树只能做出概率判断的原因是事实上“用户来源”属性为“注册”的用户和是否是活跃用户之间的关系只是一个概率关系。那么决策树判断的正确性就依赖于训练样本数据集是不是能代表整体数据,所以正确构建决策树需要避免犯与《文学文摘》同样的错误,选取了不能代表整体数据的样本。
怎样才能选择到能够代表整体的数据的样本呢?
统计学原理告诉我们,随机选择足够多的独立样本才能保证样本和整体数据有着相似的概率分布。这就是随机森林为何被成为随机森林的原因。
我们可以把随机森林看成决策树的升级版,我们需要进行升级的原因是为了应对“不完美”的训练数据集。
现在热门的大数据都提倡分析应该基于全量数据而不是样本,但是事实上无论采用什么办法都无法采集到真正的全量数据,那些需要预测和判断的数据肯定不在“全量”数据的范围内,如果在“全量”数据范围内那么也就不需要进行预测和判断了。另一方面我们采集的数据难免有少量的错误和缺失,不管是全量数据还是抽样的数据都要面临这个问题,所谓真正完美的训练数据集是不存在的,我们能做的就是需要尽量的让我们的训练样本能够代表整体数据,尽量避免受到错误和缺失数据的影响。全量数据训练的方式确实可以减少样本数据出现偏倚个概率,但是全量数据必然增加成倍的计算量,训练的结果也不一定比正确随机抽样的数据更准确。而随机选取样本仍旧是一种经济而有效的方法。
接下我们来看看随机森林的构建过程。
假设训练数据集共有N个样本,每条数据共M个属性。
随机森林构造过程可分解如下:
1 | 随机选取训练样本集,从N个样本中有放回的方式选择N个样本,每次选出1个样本后,下次随机选择样本前,将选出的样本放回样本数据集。 |
通过随机地选择样本数据和属性防止了样本数据出现偏倚,避免单棵决策树容易过拟合的问题。在应用随机森林的时候,随机森林将需要预测的数据输入给每个决策,然后根据每棵决策树的输出进行简单多少投票得到最终结果。
最后,我们使用基于python的scikit-learn框架来构建一个随机森林模型。我们采用“费雪鸢尾花卉数据集”作为训练样本。其数据集包含了150个样本,都属于鸢尾属下的三个亚属,分别是山鸢尾、变色鸢尾和维吉尼亚鸢尾。四个特征被用作样本的定量分析,它们分别是花萼和花瓣的长度和宽度。
1 | import pandas as pd |
上面的代码几乎不用做什么解释。程序开始使用pandas模块读入csv文件,然后把数据集中’petal_length’, ‘petal_width’, ‘sepal_length’, ‘sepal_width’列数据转成numpy array类型的trainArr,把数据集中的class列转化成训练标签,创建RandomForestClassifier对象,调用fit方法进行训练,然后就可以调用predict方法进行预测判断了。