各个决策树容易发生过拟合。 随机森林可以弥补决策树的缺点。
随机森林可以看作是许多决策树的组成。 随机森林多次随机选取数据和特征,多次进行决策树分析。 每个决策树都得到自己的分类结果,如果说决策树的分类结果中哪个分类结果最多,随机森林就会将其结果作为最终的结果。
传统的随机树系利用袋装法的规则,通过平均或少数服从多数来决定集聚的结果,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
这里调整之后,得分仍然不见升高,因此无论是调高还是调低复杂度,均不能改变模型,所以应该停止调参。