随机森林+python代码实现

集成学习

集成学习通过构建并结合多个分类器来完成学习任务。集成学习通过将多个学习器进行结合,常可获得比单一学习器更好的泛化性能。这对“弱分类器”尤为明显。

注:强弱分类器

一个分类器的分类准确率在60%-80%,即:比随机预测略好,但准确率却不太高,我们可以称之为“弱分类器”,比如CART(classification and regression tree分类与回归树)。反之,如果分类精度90%以上,则是强分类器。周志华的《机器学习》的解释为:弱学习器常指泛化性能略优于随即猜测的学习器(例如在二分类问题上精度略高于50%的分类器)

实例

考虑一个简单例子:在二分类任务中,假定三个分类器在三个测试样本上的表现如下图,其中√表示分类正确,×表示分类错误,集成学习的结果通过投票法产生,即“少数服从多数”。如下图,在(a)中,每个分类器都只有66.6%的精度,但集成学习却达到了100%;在(b)中,三个分类器没有差别,集成之后性能没有提高;在(c)中,每个分类器的精度都只有33.3%,集成学习的结果变得更糟。

 

(a)中三个分类器h1,h2,h3的关系为好而不同,集成后可以说互相弥补了自身的不足,集成后提升了性能。

(b)中三个分类器,虽然和(a)有着相同精度,但h1,h2,h3的性能却是相同的,三个分类器的分类效果一样,集成便得不到提升。

(c)中三个分类器虽然各不相同,但是每个分类器精度太低,集成起来反而起了反作用。

这个简单地例子显示出:要获得好的集成,个体学习器应“好而不同”,即个体学习器要有一定的“准确性”,即学习器不能太差,并且要有“多样性”,即学习器间具有差异。虽然这在现实任务中很难做到,但我们可以设法使基学习器尽可能具有较大的差异。

 

bagging和随机森林

根据个体学习器(个体学习器通常由一个现有的学习算法从训练数据中产生)的生成方式,目前的集成学习方法大致可分为两大类,即个体学习器之间存在强依赖关系,必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系,可同时生成的并行化方法;前者的代表是Boosting,后者的代表是Bagging和“随机森林”(Random Forest)。

随机森林是Bagging的一个扩展。

bagging策略

即自助采样法,给定包含m个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过m次随机操作,我们得到含m个样本的采样集,初始训练集中有的样本在采样集里多次出现,有的则从未出现。
按照这种方法,我们可以采样出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合,这就是Bagging的基本流程。在对预测输出进行结合时,Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法。

随机森林

随机森林在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择(即引入随机特征选择)。

传统决策树在选择划分属性时时在当前节点的属性集合(假定有d个属性)中选择一个最优属性;而在随机森林中,对基决策树的每个节点,先从该节点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里的参数k控制了随机性的引入程度:若令k=d,则基决策树的构建与传统决策树相同;若令k=1,则是随机选择一个属性进行划分。我们在选择特征的过程中,比如20个里面我只选择16个特征。那可能有的人就要问了,假设你没选的4个特征里面刚好有一个是最好的呢?这种情况是完全可能出现的,但是我们在下一次的分叉过程中,该特征是有可能被重新捡回来的,另外别的决策树当中也可能会出现那些在另一颗决策树中没有用到的特征。这样能使随机森林中的决策树都能彼此不同,提升系统多样性从而提升分类性能,随机森林也是为了解决决策树的过拟合问题。

随机森林的定义就出来了,利用bagging策略生成一群决策树的过程中,如果我们又满足了样本随机和特征随机,那么构建好的这一批决策树,我们就称为随机森林(Random Forest)。实际上,我们也可以使用SVM,逻辑回归等作为分类器,这些分类器组成的总分类器,我们习惯上依旧称为随机森林。决策树+bagging=随机森林,随机森林是一种比较新的机器学习模型(非线性基于树的模型)集成学习方法。

 

随机森林优缺点评价

随机森林在运算量没有显著提高前提下提高了预测精度,随机森林对多元共线性不敏感,结果对缺失数据和非平衡数据比较稳健,可以很好地预测多达几千个解释变量的作用,被誉为当前最好算法之一。

优点:

  1. 在数据集上表现良好,两个随机性的引入使随机森林不容易陷入过拟合
  2. 在当前很多数据集上,相对其他算法有很大优势,两个随机性的引入使得随机森林具有很好的抗噪声能力
  3. 能处理高维度(feature很多)数据,且不用做特征选择,对数据集适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化
  4. 可生成一个Proximities=pij矩阵,用于度量样本间相似性: pij=aij/N, aij表示样本i和j出现在随机森林中同一个叶结点的次数,N随机森林树的颗数
  5. 创建随机森林时,对generlization error使用的是无偏估计
  6. 训练速度快,可得到变量重要性排序
  7. 在训练过程中,能够检测到feature间的互相影响
  8. 容易做成并行化方法,针对大样本训练速度有优势
  9. 实现比较简单

缺点:
1.在某些噪音比较大的样本集上,RF模型容易陷入过拟合
2.取值划分比较多的特征容易对RF决策产生更大的影响,从而影响拟合模型效果

随机森林的应用

随机森林主要应用于回归和分类。回归结果用简单平均法来得到最终结果,假设随机森林有三棵子决策树,三棵树的结果分别是3.8,4,4.5,那么随机森林的回归结果就是(3.8+4+4.5)/3=4.1;分类结果用简单投票法得到最终分类,假设2棵子树分类结果是A类,1棵子树分类结果是B类,那么随机森林的分类结果就是A类。

简单来说,随机森林就是对决策树的集成,但有两点不同:(1)采样的差异性:从含m个样本的数据集中有放回的采样,得到含m个样本的采样集,用于训练。这样能保证每个决策树的训练样本不完全一样。(2)特征选取的差异性:每个决策树的k个分类特征是在所有特征中随机选择的(k是一个需要我们自己调整的参数)
随机森林需要调整的参数有:
(1)决策树的个数
(2)特征属性的个数
(3递归次数(即决策树的深度)

代码实现流程:(1)导入文件并将所有特征转换为float形式
(2)将数据集分成n份,方便交叉验证
(3)构造数据子集(随机采样),并在指定特征个数(假设d个,手动调参)下选取最优特征
(4)构造决策树
(5)创建随机森林(多个决策树的结合)
(6)输入测试集并进行测试,输出预测结果

#cross_val_score:得到K折验证中每一折的得分,K个得分取平均值就是模型的平均性能
from sklearn.model_selection import cross_val_score

#make_blobs会根据用户指定的特征数量、中心点数量、范围等来生成几类数据,这些数据可用于测试聚类算法的效果。
from sklearn.datasets import make_blobs

from sklearn.ensemble import RandomForestClassifier

#ExtRa Trees是Extremely Randomized Trees的缩写,意思就是极度随机树,extra trees比随机森林更随机。
from sklearn.ensemble import ExtraTreesClassifier

from sklearn.tree import DecisionTreeClassifier



#创建100个类共10000个样本,每个样本10个特征
#添加random_state,固定random_state的值,每次可以分割得到同样训练集和测试集。方便调参
X, y = make_blobs(n_samples=10000, n_features=10, centers=100,random_state=0)

# 决策树,None,表示树的深度不限,2指定了分裂一个内部节点(非叶子节点)需要的最小样本数,0为指定了随机数生成器的种子,保证每次产生的树一致
clf1 = DecisionTreeClassifier(max_depth=None, min_samples_split=2,random_state=0)
scores1 = cross_val_score(clf1, X, y)
print(scores1)#结果中的五个值,代表五次交叉验证每次的结果
print(scores1.mean())

# 随机森林,10为决策树的个数
clf2 = RandomForestClassifier(n_estimators=10, max_depth=None,min_samples_split=2, random_state=0)
scores2 = cross_val_score(clf2, X, y)
print(scores2)
print(scores2.mean())

## ExtraTree分类器集合
clf3 = ExtraTreesClassifier(n_estimators=10, max_depth=None,min_samples_split=2, random_state=0)
scores3 = cross_val_score(clf3, X, y)
print(scores3)
print(scores3.mean())
#性能对比:ExtraTree分类器集合 > 随机森林 > 决策树
from sklearn import datasets, svm
from sklearn.model_selection import cross_val_score
iris = datasets.load_iris()#鸢尾花数据集
X = iris.data#训练样本集
y = iris.target#标签
SVC = svm.SVC()
print(cross_val_score(SVC, X, y, cv=5, scoring='accuracy'))

 

 

 

  • 0
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭小跳呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值