首页 > 编程知识 正文

随机森林适用范围(随机森林介绍)

时间:2023-05-06 14:07:45 阅读:90219 作者:2130

各个决策树容易发生过拟合。 随机森林可以弥补决策树的缺点。

随机森林可以看作是许多决策树的组成。 随机森林多次随机选取数据和特征,多次进行决策树分析。 每个决策树都得到自己的分类结果,如果说决策树的分类结果中哪个分类结果最多,随机森林就会将其结果作为最终的结果。

传统的随机树系利用袋装法的规则,通过平均或少数服从多数来决定集聚的结果,sklearn的随机树系将每个样本对应的概率平均后得到平均概率,从而决定测试样本的分类。

与决策树相比,随机森林只有三个属性和一个接口。

关于决策树的属性,请看这里

白字决策树-概念和原理

白字决策树-实践

白话决策树-调参

白字决策树-减少树枝

白话决策树——修枝

1 .属性:

(1) n_estimators

决策树数量多为决策树,模型更准确,执行时间长。

一般取100的值。

)2) bootstrap:Ture,每次进行决策树后,返回样本

3 ) obb_score )选择未选择的样本进行测试。 如果bootstrap=Ture,则有几个示例未被使用。

使用随机森林中未使用的数据进行测试

2 .接口:

. estimators :看随机森林中所有的树

建造随机森林很容易

1 .库的调整

froms klearn.Ensembleimportrandomforestclassifier

来自骨骼.模型_选择端口得分

2 .建模

(1)模型规则

RFC=randomforestclassifier (n _ estimators=100,random_state=30 ) )。

)2)进行交叉检查,求出平均值

核心=核心(RFC,数据,数据目标,cv=10 ) .主要) )

交叉验证是指将所有数据分为cv,保留一份作为测试数据,剩下的cv-1份作为训练数据。 由此,可以对模型进行cv次训练。 可以求出平均值作为该模型算法的得分。

接下来是建立随机森林和协调参与的完整过程。

调库

#导入数据

froms klearn.datasetsimportload _ breast _ cancer

引入# # #随机森林的模型

froms klearn.Ensembleimportrandomforestclassifier

# #导入交叉检查

来自骨骼.模型_选择端口得分

# # #导入网格搜索,以便程序选择最佳参数

froms klearn.model _ selectionimportgridsearchcv

# #绘图工具

导入映射程序

# #数据处理常用的2个库

导入手册as PD

正在创建importnumpyasnp

导入数据

数据=load _ breast _ cancer (

建立模型

)模型,并尝试验证模型的效果

RFC=randomforestclassifier (n _ estimators=100,random_state=30 ) )。

核心树=核心(RFC,数据,数据目标,cv=10 ) .主要) )

print(scoretry )我们得到了以下结果:0.9543546365914788

首先调整n_estimators

#首先制作容器,接受结果

得分=[ ]

相对于#n_estimators从0遍历到200,通过10个步骤,计算n_estimators的大致范围

财富(0,200,10 ) :

# #实例化

RFC=随机干扰分类器(n _ Estimators=i1

n_jobs=1

、random_state=22 )

求出# # #交叉检查平均值

核心=核心(RFC,数据,数据目标,cv=10 ) .主要) )

# #将结果放入第一步的容器

scorel.append (得分) )。

输出# # #最高得分和与其对应的索引

打印(最大(刻度),)刻度.索引(最大)刻度) *10 ) )

制作20*5的画布

PLT.figure (fig size=[ 20,5 ]

在# # # 1到201之间,

以10为间隔,画出scorel plt.plot(range(1,201,10),scorel) #展现图 plt.show()

结果如下:

最高得分

0.9666353383458647

最高得分时对应的n_estimators

21

由于我们这一步的n_estimators是以10为步长计算,得出了21。由此可见,最佳n_estimators应该在15-25之间。

在确定n_estimators的大体范围之后,进一步细化,求具体值。

#与上一段代码类似,只是调正了n_estimators的取值范围 scorel = [] for i in range(15,25,1): rfc = RandomForestClassifier(n_estimators= i ,n_jobs = 1 ,random_state=22) score = cross_val_score(rfc,data.data,data.target,cv=10).mean() scorel.append(score) print(max(scorel),[*range(15,25)][scorel.index(max(scorel))]) plt.figure(figsize=[20,5]) plt.plot(range(15,25),scorel) plt.show()

结果如下

0.9683897243107769

23

由此可见,当n_estimators为23时,得分最高,为0.9683897243107769

调整max_depth

在确定n_estimators后,调整max_depth。

在这我们用到了网格搜索——GridSearchCV。

GridSearchCV必须包括三部分:

第一部分是实例化后的规则;

第二部分是需要调整的参数;

第三部分是交叉验证的次数 。

#设置实例化的规则 rfc = RandomForestClassifier(n_estimators =21 ,random_state = 22) #设置参数的范围 param_grid = {'max_depth':np.arange(1,50,1)} #设置交叉验证的规则 GS = GridSearchCV(rfc,param_grid,cv=10) #进行交叉验证 GS.fit(data.data,data.target) #打印交叉验证的最佳参数 print(GS.best_params_) #打印交叉验证的最佳数值 print(GS.best_score_)

结果如下

{'max_depth': 9}

0.9666353383458647

增加了max_depth参数后,模型变得简约,分数下降。因此我们可以得到这样一个结果,即添加了n_estimators后,模型需要更加精细,而不是向简约方向变化。对此,我们需要调整max_features函数,让模型考虑更多的因素。

max_features的默认值是特征值数开平方,因此应该从根号n开始调到最高。

我们通过函数

data.data.shape[1]

可以查看,有30个特征。30^(1/2)=5.4,因此应该把max_features由5调整至30。

#该部分与上一部分结构相似,只是把调整对象改为了max_features函数 param_grid = {'max_features':np.arange(5,30,1)} rfc = RandomForestClassifier(n_estimators = 21 ,random_state = 22) GS = GridSearchCV(rfc,param_grid,cv=10) GS.fit(data.data,data.target) print(GS.best_params_) print(GS.best_score_)

结果如下

{'max_features': 5}

0.9666353383458647

这里调整之后,得分仍然不见升高,因此无论是调高还是调低复杂度,均不能改变模型,所以应该停止调参。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。