随机森林+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通
常对分类任务使⽤简单投票法,对回归任务使⽤简单平均法。python生成1到100之间随机数
随机森林
随机森林在以决策树为基学习器构建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个得分取平均值就是模型的平均性能
del_selection import cross_val_score
#make_blobs会根据⽤户指定的特征数量、中⼼点数量、范围等来⽣成⼏类数据,这些数据可⽤于测试聚类算法的效果。
from sklearn.datasets import make_blobs
semble import RandomForestClassifier
#ExtRa Trees是Extremely Randomized Trees的缩写,意思就是极度随机树,extra trees⽐随机森林更随机。
semble import ExtraTreesClassifier
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)#结果中的五个值,代表五次交叉验证每次的结果
an())
# 随机森林,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)
an())
## 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)
an())
#性能对⽐:ExtraTree分类器集合 > 随机森林 > 决策树
from sklearn import datasets, svm
del_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'))
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论