一 简介
随机森林是一种比较有名的集成学习方法,属于集成学习算法中弱学习器之间不存在依赖的一部分,其因为这个优点可以并行化运行,因此随机森林在一些大赛中往往是首要选择的模型。
随机森立中随机是核心,通过随机的选择样本和选择特征,降低了决策树之间的相关性,随机森立中的随机主要有两层意思,一是随机在原始训练数据中有放回的选取等量的数据作为训练样本,二是在建立决策树时,随机的选特征中选取一部分特征建立决策树。这两种随机使得各个决策树之间的相关性小,进一步提高模型的准确性。
二、算法介绍
假设训练集中n个样本,每个样本有d个特征,需要训练一个包含T棵数的随机森立,具体的算法流程如下所示:
1、对于T棵决策树,分别重复一下操作:
a 使用Bootstrap抽样,从训练集D获得大小为n的训练集D;
b 从d个特征中随机选取m(m
2 如果是回归问题,则最后的输出是 每个树输出的均值;
3 如果是分类问题,则根据投票原则,确定最终的类别。
每棵树的生成都是随机的,至于随机选取的特征数,如何决定随机选取的特征数的大小呢,主要有两种方法,一种是交叉验证,另外一种的经验性设置 m= log_2 d +1。
模型的性能评估
1、分类间隔:分类间隔是指森林中正确分类样本的决策树的比例减去错误分类的决策树的比例,通过平均每个样本的分类间隔得到随机森林的分类间隔。对于分类间隔,当然是越大越好,大的分类间隔说明模型的分类效果比较稳定,泛化效果好。
2、袋外误差:对于每棵树都有一部分样本而没有被抽取到,这样的样本就被称为袋外样本,随机森林对袋外样本的预测错误率被称为袋外误差(Out-Of-Bag Error,OOB)。计算方式如下所示:
(1)对于每个样本,计算把该样本作为袋外样本的分类情况;
(2)以投票的方式确定该样本的分类结果;
(3)将误分类样本个数占总数的比率作为随机森林的袋外误差。
3、变量重要程度刻画
其实变量重要程度刻画不能算是模型性能评估里面,因为有的实际应用中需要查看这么多的特征中到底那一部分特征是相对重要的特征,这个时候变量的重要程度的刻画就显得尤为重要了。其计算方式主要有一下两种方式:
(1)通过计算特征的平均信息增益大小得出;
(2)通过计算每个特征对模型准确率的影响,通过打乱样本中某一特征的特征值顺序,产生新样本,将新样本放入建立好的随机森林模型计算准确率。相对于不重要的特征,即使打乱了顺序也不会对结果产生很大的影响,对于重要的特征,会对结果产生很大的影响的。
三 Python实现
(一)分类问题
Python Code
1 | #RandomForest分类 |
RandomForestClassifier函数主要是执行随机森林分类任务的,其主要参数有:
1 框架参数:
n_estimators : 指定随机森林中的分类器的个数,默认为10。一般来说n_estimators 太小容易欠拟合,太大计算量大,故需要参数调优选择一个适中的数值;
oob_score: 是否采用袋外误差来评估模型,默认为 False;
criterion :及CART树划分对特征的评价标准,默认我基尼指数,还可以选择信息增益;
2决策树参数
max_features :建立决策树时选择的最大特征数目(从原始特征中选取多少特征进行建立决策树),默认为auto,意味着考虑sqrt(n_features)个特征;还可以为整数,即直接指定数目;浮点数,即指定百分比;sqrt与auto相同;log2即指定log2(n_features);如果是None,则为最大特征数n_features;
max_depth :决策树的最大深度,默认是不进行限制的,如果是模型样本量多,特征也多的情况,推荐限制修改这个,常用的可以取值为10-100之间;
min_samples_split :限制子树继续划分的条件,如果某节点的样本数目小于此值,则不会再继续划分,默认为2,样本量非常大的时候,应该增大这个值;
min_samples_leaf :叶子节点的最小样本数目,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝,默认为1,数据量大的时候可以增大这个值;
min_weight_fraction_leaf :叶子节点最小样本权重,这个值限制了叶子节点所有样本权重和最小值,如果小于最小值,则会和兄弟节点被剪枝。默认为0,就是不考虑权重。通常来说,若样本中存在较多的缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时就需要考虑这个值了。
max_leaf_nodes :最大叶子节点数,通过限制最大叶子节点数目来防止过拟合,默认为None,即 不进行限制,如果特征分成很多可以加以限制;
min_impurity_split :节点划分最小不纯度,这个值限制了决策树的增长,如果某节点的不纯度小于这个阈值,则该节点不在生成子节点,即为叶子节点,一般不推荐改动,默认值为1e-7;
min_impurity_decrease :若一个节点被分割,如果这个分割导致大于或等于该值。默认为0;
bootstrap :构建树时是否使用bootstrap采样,默认为True;
n_jobs :设置程序的并行作业数量,默认为1,如果为-1,则作业数目为核心数;
random_state :随机数的设置;
verbose :控制构建树过程中的详细程度。
(二) 回归问题
Python Code
1 | #RandomForestRegressor |
随机森林回归于随机森林分类问题基本类似,参数也基本相同,可以相互参考,本文只是单单的介绍了随机森立的参数,并没有系统的介绍如何进行参数的调优,参数调优在数据分析和挖掘中也占有一定的地位,学会好的调优方法能够达到事半功倍的效果,后面会有单独的一篇文件介绍参数调优的相关方法的,当然方法主要是基于现有的python库,尽请期待。
RandomForestRegressor 参数
sklearn.ensemble.RandomForestRegressor( n_estimators=10,
criterion='mse',
max_depth=None,
min_samples_split=2,
min_samples_leaf=1,
min_weight_fraction_leaf=0.0,
max_features='auto',
max_leaf_nodes=None,
min_impurity_split=1e-07,
bootstrap=True,
oob_score=False,
n_jobs=1,
random_state=None,
verbose=0,
warm_start=False)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
RandomForestRegressor 参数详解(官方英文版)
RandomForestRegressor 参数详解(中文版)
转自此处
其中关于决策树的参数:
-
criterion: “mse”来选择最合适的节点。
-
splitter: ”best” or “random”(default=”best”)随机选择属性还是选择不纯度最大的属性,建议用默认。
-
max_features: 选择最适属性时划分的特征不能超过此值。
当为整数时,即最大特征数;当为小数时,训练集特征数*小数;
if “auto”, then max_features=sqrt(n_features).
If “sqrt”, thenmax_features=sqrt(n_features).
If “log2”, thenmax_features=log2(n_features).
If None, then max_features=n_features. -
max_depth: (default=None)设置树的最大深度,默认为None,这样建树时,会使每一个叶节点只有一个类别,或是达到min_samples_split。
-
min_samples_split: 根据属性划分节点时,每个划分最少的样本数。
-
min_samples_leaf: 叶子节点最少的样本数。
-
max_leaf_nodes: (default=None)叶子树的最大样本数。
-
min_weight_fraction_leaf: (default=0) 叶子节点所需要的最小权值
-
verbose: (default=0) 是否显示任务进程
关于随机森林特有的参数:
-
n_estimators=10: 决策树的个数,越多越好,但是性能就会越差,至少100左右(具体数字忘记从哪里来的了)可以达到可接受的性能和误差率。
-
bootstrap=True: 是否有放回的采样。
-
oob_score=False: oob(out of band,带外)数据,即:在某次决策树训练中没有被bootstrap选中的数据。多单个模型的参数训练,我们知道可以用cross validation(cv)来进行,但是特别消耗时间,而且对于随机森林这种情况也没有大的必要,所以就用这个数据对决策树模型进行验证,算是一个简单的交叉验证。性能消耗小,但是效果不错。
-
n_jobs=1: 并行job个数。这个在ensemble算法中非常重要,尤其是bagging(而非boosting,因为boosting的每次迭代之间有影响,所以很难进行并行化),因为可以并行从而提高性能。1=不并行;n:n个并行;-1:CPU有多少core,就启动多少job
-
warm_start=False: 热启动,决定是否使用上次调用该类的结果然后增加新的。
-
class_weight=None: 各个label的权重。
进行预测可以有几种形式:
-
predict_proba(x): 给出带有概率值的结果。每个点在所有label的概率和为1.
-
predict(x): 直接给出预测结果。内部还是调用的predict_proba(),根据概率的结果看哪个类型的预测值最高就是哪个类型。
-
predict_log_proba(x): 和predict_proba基本上一样,只是把结果给做了log()处理。