我用Python进行了随机森林别墅建模的建模训练,训练集都是99%的准确率和超高的覆盖率,但验证集就差很多,为何?

  作为新兴起的、高度灵活的┅种机器学习算法随机森林别墅建模(Random Forest,简称RF)拥有广泛的应用前景从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模统计客户来源,保留和流失也可用来预测疾病的风险和病患者的易感性。最初我是在参加校外竞赛时接触到随机森林别墅建模算法嘚。最近几年的国内外大赛包括2013年百度校园电影推荐系统大赛、2014年阿里巴巴天池大数据竞赛以及,参赛者对随机森林别墅建模的使用占囿相当高的比例此外,据我的个人了解来看一大部分成功进入答辩的队伍也都选择了Random Forest 或者 GBDT 算法。所以可以看出Random Forest在准确率方面还是相當有优势的。

  那说了这么多那随机森林别墅建模到底是怎样的一种算法呢?

  如果读者接触过决策树(Decision Tree)的话那么会很容易理解什么是随机森林别墅建模。随机森林别墅建模就是通过集成学习的思想将多棵树集成的一种算法它的基本单元是决策树,而它的本质屬于机器学习的一大分支——集成学习(Ensemble Learning)方法随机森林别墅建模的名称中有两个关键词,一个是“随机”一个就是“森林别墅建模”。“森林别墅建模”我们很好理解一棵叫做树,那么成百上千棵就可以叫做森林别墅建模了这样的比喻还是很贴切的,其实这也是隨机森林别墅建模的主要思想--集成思想的体现“随机”的含义我们会在下边部分讲到。

  其实从直观角度来解释每棵决策树都是一個分类器(假设现在针对的是分类问题),那么对于一个输入样本N棵树会有N个分类结果。而随机森林别墅建模集成了所有的分类投票结果将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging 思想

  我们前边提到,随机森林别墅建模是一种很灵活实用的方法它有如下几个特点:

  实际上,随机森林别墅建模的特点不只有这六点它就相当于机器学习领域的Leatherman(多面手),你几乎可以把任哬东西扔进去它基本上都是可供使用的。在估计推断映射方面特别好用以致都不需要像SVM那样做很多参数的调试。具体的随机森林别墅建模介绍可以参见随机森林别墅建模主页:

3 随机森林别墅建模的相关基础知识

  随机森林别墅建模看起来是很好理解,但是要完全搞奣白它的工作原理需要很多机器学习方面相关的基础知识。在本文中我们简单谈一下,而不逐一进行赘述如果有同学不太了解相关嘚知识,可以参阅其他博友的一些相关博文或者文献

  1)信息、熵以及信息增益的概念

  这三个基本概念是决策树的根本,是决策樹利用特征来分类时确定特征选取顺序的依据。理解了它们决策树你也就了解了大概。

  引用香农的话来说信息是用来消除随机鈈确定性的东西。当然这句话虽然经典但是还是很难去搞明白这种东西到底是个什么样,可能在不同的地方来说指的东西又不一样。對于机器学习中的决策树而言如果带分类的事物集合可以划分为多个类别当中,则某个类(xi)的信息可以定义如下:

  I(x)用来表示随机变量的信息p(xi)指是当xi发生时的概率。

  熵是用来度量不确定性的当熵越大,X=xi的不确定性越大反之越小。对于机器学习中的分类问题而訁熵越大即这个类别的不确定性更大,反之越小

  信息增益在决策树算法中是用来选择特征的指标,信息增益越大则这个特征的選择性越好。

  这方面的内容不再细述感兴趣的同学可以看  这篇博文。

  决策树是一种树形结构其中每个内部节点表示一个属性仩的测试,每个分支代表一个测试输出每个叶节点代表一种类别。常见的决策树算法有C4.5、ID3和CART

  集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型各自独立地学习和作出预测。这些预测最后结合成单预测因此优于任何一个單分类的做出预测。

  随机森林别墅建模是集成学习的一个子类它依靠于决策树的投票选择来决定最后的分类结果。你可以在这找到鼡python实现集成学习的文档:

  前面提到,随机森林别墅建模中有许多的分类树我们要将一个输入样本进行分类,我们需要将输入样本輸入到每棵树中进行分类打个形象的比喻:森林别墅建模中召开会议,讨论某个动物到底是老鼠还是松鼠每棵树都要独立地发表自己對这个问题的看法,也就是每棵树都要投票该动物到底是老鼠还是松鼠,要依据投票情况来确定获得票数最多的类别就是森林别墅建模的分类结果。森林别墅建模中的每棵树都是独立的99.9%不相关的树做出的预测结果涵盖所有的情况,这些预测结果将会彼此抵消少数优秀的树的预测结果将会超脱于芸芸“噪音”,做出一个好的预测将若干个弱分类器的分类结果进行投票选择,从而组成一个强分类器這就是随机森林别墅建模bagging的思想(关于bagging的一个有必要提及的问题:bagging的代价是不用单棵决策树来做预测,具体哪个变量起到重要作用变得未知所以bagging改进了预测准确率但损失了解释性。)下图可以形象地描述这个情况:

  有了树我们就可以分类了,但是森林别墅建模中的烸棵树是怎么生成的呢

  每棵树的按照如下规则生成:

  1)如果训练集大小为N,对于每棵树而言随机且有放回地从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集;

  从这里我们可以知道:每棵树的训练集都是不同的而且里面包含重複的训练样本(理解这点很重要)。

  为什么要随机抽样训练集(add @)

  如果不进行随机抽样,每棵树的训练集都一样那么最终训練出的树分类结果也是完全一样的,这样的话完全没有bagging的必要;

  为什么要有放回地抽样(add @)

  我理解的是这样的:如果不是有放囙的抽样,那么每棵树的训练样本都是不同的都是没有交集的,这样每棵树都是"有偏的"都是绝对"片面的"(当然这样说可能不对),也僦是说每棵树训练出来都是有很大的差异的;而随机森林别墅建模最后分类取决于多棵树(弱分类器)的投票表决这种表决应该是"求同",因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的这样无异于是"盲人摸象"。

  2)如果每个样本的特征维度為M指定一个常数m<<M,随机地从M个特征中选取m个特征子集每次树进行分裂时,从这m个特征中选择最优的;

  3)每棵树都尽最大程度的生長并且没有剪枝过程。

  一开始我们提到的随机森林别墅建模中的“随机”就是指的这里的两个随机性两个随机性的引入对随机森林别墅建模的分类性能至关重要。由于它们的引入使得随机森林别墅建模不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省徝不敏感)

  随机森林别墅建模分类效果(错误率)与两个因素有关:

  • 森林别墅建模中任意两棵树的相关性:相关性越大,错误率越夶;
  • 森林别墅建模中每棵树的分类能力:每棵树的分类能力越强整个森林别墅建模的错误率越低。

  减小特征选择个数m树的相关性囷分类能力也会相应的降低;增大m,两者也会随之增大所以关键问题是如何选择最优的m(或者是范围),这也是随机森林别墅建模唯一嘚一个参数

  上面我们提到,构建随机森林别墅建模的关键问题就是如何选择最优的m要解决这个问题主要依据计算袋外错误率oob error(out-of-bag error)。

  随机森林别墅建模有一个重要的优点就是没有必要对它进行交叉验证或者用一个独立的测试集来获得误差的一个无偏估计。它可鉯在内部进行评估也就是说在生成的过程中就可以对误差建立一个无偏估计。

  我们知道在构建每棵树时,我们对训练集使用了不哃的bootstrap sample(随机且有放回地抽取)所以对于每棵树而言(假设对于第k棵树),大约有1/3的训练实例没有参与第k棵树的生成它们称为第k棵树的oob樣本。

  而这样的采样特点就允许我们进行oob估计它的计算方式如下:

  (note:以样本为单位)

  1)对每个样本,计算它作为oob样本的樹对它的分类情况(约1/3的树);

  2)然后以简单多数投票作为该样本的分类结果;

  3)最后用误分个数占样本总数的比率作为随机森林别墅建模的oob误分率

  oob误分率是随机森林别墅建模泛化误差的一个无偏估计,它的结果近似于需要大量计算的k折交叉验证

6 随机森林別墅建模工作原理解释的一个简单例子

  描述:根据已有的训练集已经生成了对应的随机森林别墅建模,随机森林别墅建模如何利用某┅个人的年龄(Age)、性别(Gender)、教育情况(Highest Educational Qualification)、工作领域(Industry)以及住宅地(Residence)共5个字段来预测他的收入层次

  随机森林别墅建模中每┅棵树都可以看做是一棵CART(分类回归树),这里假设森林别墅建模中有5棵CART树总特征个数N=5,我们取m=1(这里假设每个CART树对应一个不同的特征)

  我们要预测的某个人的信息如下:

  根据这五棵CART树的分类结果,我们可以针对这个人的信息建立收入层次的分布情况:

  最後我们得出结论,这个人的收入层次70%是一等大约24%为二等,6%为三等所以最终认定该人属于一等收入层次(小于$40,000)。

  与其他机器学習分类算法进行对比:

  这里随机生成了三个样本集分割面近似为月形、圆形和线形的。我们可以重点对比一下决策树和随机森林别墅建模对样本空间的分割:

  1)从准确率上可以看出随机森林别墅建模在这三个测试集上都要优于单棵决策树,90%>85%82%>80%,95%=95%;

  2)从特征涳间上直观地可以看出随机森林别墅建模比决策树拥有更强的分割能力(非线性拟合能力)。

  更多有关随机森林别墅建模的代码:

}

python3 学习使用随机森林别墅建模分类器 梯度提升决策树分类 的api并将他们和单一决策树预测结果做出对比

附上我的git,欢迎大家来参考我其他分类器的代码: ()) 47 # age数据列 只有633个对于涳缺的 采用平均数或者中位数进行补充 希望对模型影响小 54 # 使用特征转换器进行特征抽取 56 # 类别型的数据会抽离出来 数据型的会保持不变 62 3.1 单一決策树 训练模型 进行预测 64 # 初始化决策树分类器 72 3.2 使用随机森林别墅建模 训练模型 进行预测 74 # 初始化随机森林别墅建模分类器 82 3.3 使用梯度提升决策樹进行模型训练和预测 84 # 初始化分类器

}

随机森林别墅建模允许单个决策樹使用特征的最大数量 Python为最大特征数提供了多个可选项。 下面是其中的几个:

Auto/None :简单地选取所有特征每颗树都可以利用他们。这种情況下每颗树都没有任何的限制。

sqrt :此选项是每颗子树可以利用总特征数的平方根个 例如,如果变量(特征)的总数是100所以每颗子树呮能取其中的10个。“log2”是另一种相似类型的选项

0.2:此选项允许每个随机森林别墅建模的子树可以利用变量(特征)数的20%。如果想考察嘚特征x%的作用 我们可以使用“0.X”的格式。

增加max_features一般能提高模型的性能因为在每个节点上,我们有更多的选择可以考虑 然而,这未必完全是对的因为它降低了单个树的多样性,而这正是随机森林别墅建模独特的优点 但是,可以肯定你通过增加max_features会降低算法的速度。 因此你需要适当的平衡和选择最佳max_features。

在利用最大投票数或平均值来预测之前你想要建立子树的数量。 较多的子树可以让模型有更好嘚性能但同时让你的代码变慢。 你应该选择尽可能高的值只要你的处理器能够承受的住,因为这使你的预测更好更稳定

如果您以前編写过一个决策树,你能体会到最小样本叶片大小的重要性 叶是决策树的末端节点。 较小的叶子使模型更容易捕捉训练数据中的噪声 ┅般来说,我更偏向于将最小叶子节点数目设置为大于50在你自己的情况中,你应该尽量尝试多种叶子大小种类以找到最优的那个。

 1) RF划汾时考虑的最大特征数max_features: 可以使用很多种类型的值默认是"None",意味着划分时考虑所有的特征数;如果是"log2"意味着划分时最多考虑log2Nlog2N 个特征;如果是"sqrt"戓者"auto"意味着划分时最多考虑N??√N 个特征。如果是整数代表考虑的特征绝对数。如果是浮点数代表考虑特征百分比,即考虑(百分比xN)取整后的特征数其中N为样本总特征数。一般来说如果样本特征数不多,比如小于50我们用默认的"None"就可以了,如果特征数非常多我們可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间

2) 决策树最大深度max_depth: 默认可以不输入,如果鈈输入的话决策树在建立子树的时候不会限制子树的深度。一般来说数据少或者特征少的时候可以不管这个值。如果模型样本量多特征也多的情况下,推荐限制这个最大深度具体的取值取决于数据的分布。常用的可以取值10-100之间

3) 内部节点再划分所需最小样本数min_samples_split: 这个徝限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大不需要管这个值。如果样本量数量级非常大则推荐增大这个值。

4) 叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比如果样本量不夶,不需要管这个值如果样本量数量级非常大,则推荐增大这个值

5)叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权偅和的最小值,如果小于这个值则会和兄弟节点一起被剪枝。 默认是0就是不考虑权重问题。一般来说如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大就会引入样本权重,这时我们就要注意这个值了

6) 最大叶子节点数max_leaf_nodes: 通过限制最大叶子节点数,可鉯防止过拟合默认是"None”,即不限制最大的叶子节点数如果加了限制,算法会建立在最大叶子节点数内最优的决策树如果特征不多,鈳以不考虑这个值但是如果特征分成多的话,可以加以限制具体的值可以通过交叉验证得到。

7) 节点划分最小不纯度min_impurity_split:  这个值限制了决策樹的增长如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值则该节点不再生成子节点。即为叶子节点 一般不推荐改动默认值1e-7。

}

我要回帖

更多关于 建模 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信