欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

机器学习算法-随机森林(RF)

程序员文章站 2022-07-14 16:21:46
...

随着大数据和人工智能热潮的相继而来,促使机器学习近些年也火的一塌糊涂。机器学习方法已在生产、科研和生活中有着广泛应用,而集成学习则是机器学习的首要热门方向。集成学习是使用一系列学习器进行学习,并使用某种规则把各个学习结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习方法。集成学习有两个分支,一个是Boosting派系,另一个是Bagging流派,二者的区别主要如下:

Boosting–假定原始样本集中有n个训练样本,且服从均匀分布。基于此先训练一个模型,接下来通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样本的权值,误分的样本在后续将受到更多的关注。再不断基于新的分布训练新的弱分类器。最后再用加法模型将弱分类器进行线性组合,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。其代表算法为Adaboost。已在博客机器学习算法-Adaboost中介绍,感兴趣可以查阅。
Bagging–假定原始样本集中有n个训练样本,每轮从原始样本集中使用有放回重复抽样(Bootstraping)的方法抽取mm<n)个训练样本,共进行k轮抽取,得到k个相互独立的子训练集。然后每次使用一个训练集得到一个模型,k个训练集共得到k个模型。对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。

一、随机森林的基本思想

随机森林是Bagging的一个扩展变体,顾名思义其是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输 入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,对于分类算法,看看这个样本应该属于哪一类,然后看看哪一类被选择最多,就预测这个样本为那一类。对回归问题,计算k个模型的均值作为最后的结果。

机器学习算法-随机森林(RF)

二、随机森林的算法步骤

1:首先,通过Bootstrap方法在原始样本集S中抽取k个训练样本集,一般情况下每个训练集的样本容量与S一致;

2:其次,对k个训练集进行CART学习,以此生成k个决策树模型。在决策树生成过程中,假设共有M个特征向量,从M个特征向量中随机抽取m个,各个内部节点均是利用这m个特征变量上最优的分裂方式来分裂,且m值在随机森林模型的形成过程中为恒定常数;

3:最后,将k个决策树的结果进行组合,形成最终结果。针对分类问题,组合方法是简单多数投票法;针对回归问题,组合方法则是简单平均法。

机器学习算法-随机森林(RF)

三、随机森林的优缺点

随机森林的主要优点有:基于决策树模型,比较简单,易于实现,对特征缺失不敏感; 因针对不同的样本集训练弱分类器,因此训练可以高度并行化,对于大数据时代的大样本训练速度有优势;在样本特征量很大的时候,可以随机选择决策树节点划分特征,降低训练模型开销;并且采用了随机采样,训练出的模型的方差小,泛化能力强。主要缺点有:在某些噪音比较大的样本集上,随机森林模型容易陷入过拟合;取值划分比较多的特征容易对随机森林的决策产生更大的影响,从而影响拟合的模型的效果。

四、随机森林实战

在scikit-learn中,随机森林的分类函数是RandomForestClassifier,回归函数是RandomForestRegressor ,二者主要的参数为n_estimators–也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是100。max_depth–决策树最大深度,默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。max_features–划分时考虑的最大特征数,可以使用很多种类型的值,默认是”None”,意味着划分时考虑所有的特征数;如果是”log2”意味着划分时最多考虑log2N个特征;如果是”sqrt”或者”auto”意味着划分时最多考虑N个特征。如果是整数,如10、20、22,则代表考虑的特征绝对数。如果是0~1的浮点数,代表考虑特征百分比,即考虑(百分比×N)取整后的特征数。其中N为样本总特征数。其余参数介绍可参考参考资料4和5

# -*- coding: utf-8 -*-

from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import RandomForestRegressor
import numpy as np

iris = datasets.load_iris()

#利用随机森林进行分类训练
rfc = RandomForestClassifier(n_estimators=10,max_depth=3)
rfc.fit(iris.data, iris.target)

#利用随机森林进行回归训练
rfr = RandomForestRegressor(n_estimators=10,max_depth=3)
rfr.fit(iris.data, iris.target)

instance = np.array([[4.5,6.7,3.4,5.0]])
print "新样本:", instance
print '分类结果:', rfc.predict(instance)
print '回归结果:', rfr.predict(instance)

机器学习算法-随机森林(RF)

参考资料

  1. http://www.cnblogs.com/pinard/p/6156009.html Bagging与随机森林算法原理小结
  2. http://www.csdn.net/article/2015-10-08/2825851 使用scikit-learn解释随机森林算法
  3. http://www.cnblogs.com/dudumiaomiao/p/6361777.html 集成学习—boosting和bagging异同
  4. http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html 随机森林分类模型参数介绍
  5. http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html 随机森林回归模型参数介绍