随机森林
随机森林(Random Forest,简称RF),通过集成学习的思想将多棵决策树集成的一种算法,它的基本单元是决策树。从直观角度来解释,每棵决策树都是一个分类器(假设现在针对的是分类问题),那么对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定为最终的输出。
随机森林构建
随机采样
首先是两个随机采样的过程,random forest 对输入的数据要进行行、列的采样。
对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为 N 个,那么采样的样本也为 N 个,这选择好了的 N 个样本用来训练一个决策树,作为决策树根节点处的样本,同时使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现 over-fitting。
对于列采样,从 M 个 feature 中,选择 m 个 (m << M),即:当每个样本有M个属性时,在决策树的每个节点需要分裂时,随机从这 M 个属性中选取出 m 个属性,满足条件 m << M。
完全分裂
对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。分裂的办法是:采用上面说的列采样的过程从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的分裂属性。
决策树形成过程中每个节点都要按完全分裂的方式来分裂,一直到不能够再分裂为止(如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。
随机森林的优点
- 比较适合做多分类问题,训练和预测速度快,在数据集上表现良好;
- 对训练数据的容错能力强,是一种有效地估计缺失数据的一种方法,当数据集中有大比例的数据缺失时仍然可以保持精度不变和能够有效地处理大的数据集;
- 能够处理很高维度的数据,并且不用做特征选择,即:可以处理没有删减的成千上万的变量;
- 能够在分类的过程中可以生成一个泛化误差的内部无偏估计;
- 能够在训练过程中检测到特征之间的相互影响以及特征的重要性程度;
- 不会出现过度拟合;
- 实现简单并且容易实现并行化。
例子
假设有一组相亲网站提供的数据,抽取特征后发现是否相亲有四个因素组成: 年龄,是否有房,收入,是否公务员
age, house, income, governor, go_date 30, 1, 80, 1, 1 28, 0, 30, 0, 0 29, 0, 80, 1, 1 32, 1, 40, 1, 1 32, 0, 100, 1, 1 40, 1, 30, 1, 0 28, 1, 40, 1, 1 57, 0, 80, 1, 0 45, 0, 78, 0, 0 34, 0, 70, 1, 0 …
那么假如有一个新的会员注册后,填写了信息如下,
年龄: 33 是否有房: 无 收入: 80 是否公务员: 是
那么请问这位会员是否能得到相亲的机会?
代码语言:javascript复制from numpy import genfromtxt
from sklearn.ensemble import RandomForestClassifier
# 加载数据
dataset = genfromtxt('data.csv', delimiter=",")
x = dataset[1:, 0:4]
y = dataset[1:, 4]
clf = RandomForestClassifier(n_jobs=2, oob_score=True)
clf = clf.fit(x, y)
# 预测
print(clf.predict_proba([[33, 0, 80, 1]]))
代码地址
参考文献
- [Machine Learning & Algorithm] 随机森林(Random Forest)
- sklearn中随机森林的参数