微信号:QunarTL

介绍:Qunar技术沙龙是去哪儿网工程师小伙伴以及业界小伙伴们的学习交流平台.我们会分享Qunar和业界最前沿的热门技术趋势和话题;为中高端技术同学提供一个自由的技术交流和学习分享平台.

机器学习之scikit-learn开发入门(8)

2019-01-17 09:30 曹华

曹华,2018 年加入去哪儿网技术团队。目前在火车票事业部/技术部小组。个人对图像处理、数据挖掘、图论、VR 等有浓厚兴趣。


机器学习之 scikit-learn 开发入门 - 

集成学习 - 随机森林算法


一 概要

本文主要讲解随机森林算法,主要内容包括: 1、随机森林算法的介绍; 2、随机森林算法类库的介绍; 3、随机森林算法实践示例; 4、随机森林算法原理; 5、总结。 通过文本的介绍,希望大家可以掌握随机森林算法的使用与了解它的原理。

二 参考资料

1、监督学习-决策树; 2、scikit-learn 随机森林算法; 3、维基百科随机森林算法; 4、书籍《周志华-机器学习》。

三 集成学习-随机森林算法基础知识

1、集成学习的介绍

集成学习就是训练若干个个体学习器,通过一定的结合策略,最终形成一个强学习器,以达到博采众长的目的。

也就是说集成学习只关注两个问题:第一是如何得到若干个体学习器。第二是如何选择一种结合策略,将这些个体学习器集合成一个强学习器。

2、集成学习个体学习器

集成学习个体学习器组合的方法分为两类,一类是个体学习器的种类相同称为同质个体学习器,例如都是决策树个体学习器。另一类是异质个体学习器,例如采用逻辑回归个体学习器和朴素贝叶斯个体学习器来学习,再通过某种结合策略来确定最终的强学习器。 目前同质个体学习器的应用是最广泛的。目前我们常说的集成学习都是同质个体学习器。同质个体学习器从数据源来划分也有两类,第一个是个体学习器之间存在强依赖关系,个体学习器需要串行生成,代表算法是 Boosting 系列算法(这个下几期会讲到),第二个是个体学习器之间不存在强依赖关系,个体学习器可以并行生成,代表算法是 Bagging 和随机森林系列算法。 Boosting 算法的工作机制:

(1)从训练集用初始权重训练出一个弱学习器1;

(2)根据弱学习的学习结果,调整分错的训练样本的权重,使得分错的训练样本在后面的弱学习器2中得到更多的重视;

(3)基于调整权重后的训练集来训练弱学习器2;

(4)如此重复进行(2)、(3)步骤,直到弱学习器数达到事先指定的数目 T;

(5)最终将这 T 个弱学习器通过集合策略进行整合,得到最终的强学习器。 Bagging 算法的工作机制:

(1)通过 T 次放回式随机采样,可以得到T个采样集;

(2)对于这 T 个采样集,可以分别独立的训练出 T 个弱学习器;

(3)对这 T 个弱学习器通过集合策略来得到最终的强学习器。

3、结合策略

结合策略大致分为三类:平均法、投票法、学习法。 平均法主要针对回归算法对于若干个弱学习器的输出进行平均得到最终的预测输出。 投票法分为三类,第一是相对多数投票法,也就是少数服从多数;第二是绝对多数投票法,在相对多数投票法的基础上,不光要求获得最高票,还要求票过半数,否则会拒绝预测;第三是加权投票法,每个弱学习器的分类票数要乘以一个权重,最终将各个类别的加权票数求和,最大的值对应的类别为最终类别。 学习法,将训练集弱学习器的学习结果作为输入,将训练集的输出作为输出,重新训练一个学习器来得到最终结果。代表方法是stacking。

四 随机森林算法的介绍

随机森林属于集成学习 Bagging 的改进算法,它是非常强大的算法,尤其是它可以很方便的并行训练,在如今大数据大样本的时代有很大的优势。主要原理细节在原理小节会涉及到。

五 随机森林算法类库的介绍

在 scikit-learn 中,原始随机森林算法有两个类,RandomForestClassifier 类负责分类和 RandomForestRegressor 类负责回归。随机森林算法参数分为两部分,第一部分是 Bagging 框架的参数,第二部分是 CART 决策树的参数。

1、Bagging框架的参数

(1)nestimators:最大的弱学习器的个数,一般来说 nestimators 太小,容易欠拟合,nestimators 太大,计算量会太大。nestimators 到一定的数量后,再增大 nestimators 获得的模型提升会很小,所以一般选择一个适中的数值。默认是100;

(2)oobscore:是否采用袋外样本(参看原理小节)来评估模型的好坏,默认识 False,个人推荐设置为 True,因为袋外分数反应了一个模型拟合后的泛化能力;

(3)criterion:即 CART 决策树特征选择的标准,分类模型和回归模型的损失函数是不一样的。分类随机森林,即 CART 分类树,默认是基尼系数 gini;回归随机森林,即 CART 回归树,默认是均方差 mse。一般来说选择默认的标准就已经很好的。

2、CART决策树的参数

(1)maxfeatures:随机森林划分时考虑的最大特征数,可以使用很多种类型的值,默认是"auto",意味着划分时最多考虑根号 N 个特征,用默认的"auto"就可以;

(2)maxdepth:决策树最大深度,默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。如果样本量多,特征量多的情况下,推荐限制这个最大深度,取值10-100之间;

(3)minsamplessplit:内部节点再划分所需最小样本数,这个值限制了子树继续划分的条件,如果某节点的样本数少于 minsamplessplit,则不会继续再划分。默认是2。如果样本量数量级非常大,则推荐增大这个值;

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

六 随机森林算法实践示例

1、导入头文件

 
           
  1. #coding=utf-8

  2. import numpy as np

  3. import pandas as pd

  4. from sklearn import datasets

  5. from sklearn.ensemble import RandomForestClassifier

2、样本数据

 
           
  1. # 仍然使用自带的iris数据

  2. iris = datasets.load_iris()

  3. # 将数据加载到DataFrame中

  4. df = pd.DataFrame(iris.data, columns=iris.feature_names)

3、划分训练数据和测试数据

 
           
  1. # 随机标记75%的样本作为训练样本

  2. df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75

  3. # 将直接结果合并到df中

  4. df['species'] = iris.target

  5. # 得到训练集和测试集

  6. train, test = df[df['is_train']==True],

  7. df[df['is_train']==False]

  8. # 定义特征列

  9. features = df.columns[:4]

4、训练模型

 
           
  1. # 训练模型,限制树的最大深度5

  2. clf = RandomForestClassifier(max_depth=5, n_estimators=10, max_features=1)

  3. # 获得训练集中真实结果

  4. Y, _ = pd.factorize(train['species'])

  5. # 开始训练

  6. clf.fit(train[features], Y)

5、预测验证

 
           
  1. # 通过测试集进行预测

  2. preds = clf.predict(test[features])

6、获得结果

 
           
  1. print(preds)

  2. print (test['species'].values)

[0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 2 2 2 1 2]

[0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2]

7、计算准确率

 
           
  1. # 显示预测准确率

  2. diff = 0.0;

  3. for num in range(0,len(preds)):

  4.    if(preds[num] != test['species'].values[num]):

  5.        diff = diff + 1


  6. rate = (diff / len(preds));

  7. print 1 - rate

0.945945945946

七 随机森林算法原理

1、随机森林算法原理

随机森林算法会在训练集里面采集固定个数的样本,但是每采集一个样本后,都会将样本放回。也就是说,之前采集到的样本在放回后有可能继续被采集到。随机采集的个数和训练集样本个数相同。如果对训练集做 T 次的随机采样,则会得到 T 个各不相同采样集。 在含有 m 个样本的训练集中,样本被随机采样的概率是1/m。不被采样到的概率为1-1/m。m 次采样都没有被采样的概率是

当m -> ∞时,

也就是说,在随机森林的每轮随机采样中,训练集中大约有36.8%的数据没有被采样到。 对于这部分大约36.8%的没有被采样到的数据,被称为袋外数据。这些数据没有参与训练集模型的拟合,因此可以用来检测模型的能力。

 
           
  1. 随机森林的结合策略也比较简单,对于分类问题,会使用相对多数投票法得到最终的模型输出。对于回归问题,通常使用简单平均法,得到最终的模型输出。

2、随机森林算法流程

输入为样本集 D={(x,y1),(x,y2),...(xm,ym)},弱学习器算法, 弱分类器迭代次数 T。 输出为最终的强分类器 f(x)。 对于 t=1,2...,T:

(1)对训练集进行第 t 次随机采样,共采集 m 次,得到包含 m 个样本的采样集 Dt;

(2)用采样集 Dt 训练第 t 个弱学习器;

(3)如果是分类算法预测,则 T 个弱学习器投出最多票数的类别或者类别之一为最终类别。如果是回归算法,T 个弱学习器得到的回归结果进行算术平均得到的值为最终的模型输出。

八 总结

随机森林算法作为一个可以高度并行化的算法,在大数据时候大有可为。 现在对常规的随机森林算法的优缺点做一个总结。 优点: (1)训练可以高度并行化,对于大数据时代的大样本训练速度有优势; (2)在训练后,可以给出各个特征对于输出的重要性; (3)由于采用了随机采样,训练出的模型的方差小,泛化能力强; (4)对部分特征缺失不敏感。 缺点: (1)对于许多统计建模者来说,随机森林给人的感觉就像一个黑盒子,你无法控制模型内部的运行,只能在不同的参数和随机种子之间进行尝试; (2)可能有很多相似的决策树,掩盖了真实的结果; (3)对于小数据或者低维数据(特征较少的数据),可能不能产生很好的分类。(处理高维数据,处理特征遗失数据,处理不平衡数据是随机森林的长处)。

 
Qunar技术沙龙 更多文章 AIOps 助力航信运维百万级交易系统 0 宕机 机器学习之scikit-learn开发入门(6) 机器学习之scikit-learn开发入门(7) Flutter动画的架构设计 你不知道的Sass
猜您喜欢 成长的烦恼,说点建议吧 Android-基于ClassLoader原理的热修复插入字节码实现(Javassist) 希望你永远记住我 Swift 算法实战之路:基本语法与技巧 【科普】从三体人列计算机到神经网络