机器学习-一篇入门

【模型】一篇入门之-随机森林集成算法

作者 : 老饼 发表日期 : 2022-06-26 03:37:26 更新日期 : 2024-11-20 17:13:31
本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com



随机森林是一种集成算法,它随机训练多棵弱决策树来进行集体决策,拥有比决策树更好的泛化能力

本文讲解随机森林的原理、模型结构以及随机森林的训练流程,并展示一个随机森林的具体使用例子

通过本文,可以快速了解什么是随机森林模型,如何评估随机森林模型,以及如何使用随机森林进行类别预测





    01. 什么是随机森林模型     




本节讲解随机森林模型的思想与模型表达式,快速了解随机森林是什么




       什么是随机森林模型        


随机森林(Random Forest)是bagging集成算法的一种实现,它集成多棵Cart决策树来共同决策
 随机森林模型 
 由于随机森是通过随机抽取不同样本、不同的变量来训练出多棵弱决策树的,所以称为随机森林
 随机森林的模型表达式为:
 
其中
                  :随机森林给出的各类别的预测概率                                      
                  : 第  棵决策树                                                                     
     :   第  棵树对的预测,输出为各个类别的预测概率(行向量)
                  : 森林规模数                                                                        
可以看到,随机森林就是将多个Cart决策的预测结果进行平均,作为模型的预测值








     02. 随机森林的训练与评估    




本节讲解随机森林是如何训练的,以及随机森林的obb_score是什么





       随机森林的具体训练流程      


随机森林是如何Bagging的
 Bagging注重如何训练出多个有效的弱模型
随机森林以CART决策树作为基模型,它以如下机制训练出多棵弱树:
👉1. 随机样本:使用boostrap抽样来使样本差异化,令每次训练的模型侧重点不一样            
 boostrap抽样指的是放回式抽样n次(n是整体样本个数)     
          例如整体样本有n个,然后每次都在整体样本中抽样,抽n次得到n个样本
 👉
2. 随机变量:每次只随机抽取部分变量来训练Cart决策树,削弱决策树的拟合能力               
     这样既可以使每棵树使用的变量不一样,同时又能限制树的深度
随机样本和随机变量都能使树模型差异化,同时预防过拟合,使得最终能训练出多棵不同的弱决策树   
随机森林的训练流程
  随机森林的具体训练流程如下:
 
随机森林算法流程
1. 样本抽取 : 放回式抽取n(样本个数)次样本                                            
2. 变量抽取:随机抽取m个变量,作为本次决策树的变量                        
3. 训练弱树 : 用抽取的样本、变量训练Cart决策树                                   
一直训练K棵树为止                  
 简单地说,就是生成k棵树,每棵树用的样本随机抽取,最后k棵树组合在一起就是森林
✍️ 随机森林进行bagging的目的
 
随机森林简单来说,就是训练多棵弱决策树来共同决策,它的目的是使模型泛化能力更加强
通俗理解随机森林,则是类似多人决策,它未必是最优的,但肯定是中肯的,能避免过激的决策
 由于Cart决策树只要深度足够深,就可以拟合出任意形态,所以Cart决策树是极易过拟合的模型 
随机森林将决策树进行bagging,主要目的不是为了让模型更加精准,而是怕决策树 "过于精准"
 因此随机森林中用的是弱决策树、不易过拟合的决策树,再通过集成决策来提升预测结果准确度  
使得最终的随机森林模型,既继承了弱决策树的泛化能力,又有足够的预测精度





    随机森林的模型评估-obb_score     


袋外得分obb(out-of-bag)-score是一个用来评估随机森林模型泛化能力的指标
 随机森林袋外得分obb-score
在解释袋外得分之前,不妨先介绍袋外样本和袋外预测的概念

袋外样本:随机森林在训练时使用boostrap进行抽样,所以每个模型实际上只用了部分样本
那些未参与训练的样本就称为该模型的袋外样本                                
袋外预测:袋外预测是指,每个样本只用该样本不参与训练的模型来对样本进行预测           
                      例如样本A在模型1、3、5中都参与了训练,那么袋外预测就是模型2、4对样本A的预测
 在了解袋外样本、袋外预测后,很容易就理解袋外得分了,
袋外得分obb_score就是指所有训练样本进行袋外预测时的准确率  
  即随机森林可以不需额外预留测试样本,因为它可以使用袋外得分来评估模型的泛化能力








    03. 如何训练一个随机森林模型    




本节展示如何在python中实现随机森林模型来预测样本类别





     随机森林-代码实现例子    


下面以iris数据为例,展示如何在python中训练一个随机森林模型进行类别预测
随机森林的具体代码示例如下
"""
本代表用于展示如何使用sklearn实现随机森林模型
代码来自:《老饼讲解-机器学习》 www.bbbdata.com
"""
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import numpy as np

np.random.seed(888)
#----------加载数据---------------                                          
iris = load_iris()                                                           # 加载iris数据
X    = iris.data                                                             # 样本的X
y    = iris.target                                                           # 样本的y

#------模型训练与预测---------------
clf = RandomForestClassifier(oob_score=True,max_features=2,n_estimators=100) # 初始化随机森林模型
clf.fit(X, y)                                                                # 训练随机森林模型
pred_prob = clf.predict_proba(X)                                             # 预测样本的概率
pred_c    = clf.predict(X)                                                   # 预测样本的类别
preds     = iris.target_names[pred_c]

#-------打印结果 ---------------
print("\n----前5个样本的真实类别:----") 
print(iris.target[0:5])
print("\n----前5个样本的预测结果:----") 
print(pred_c[0:5])
print("\n----袋外准确率oob_score:----") 
print(clf.oob_score_)
print("\n----特征得分:----") 
print(clf.feature_importances_)
运行结果如下:
 随机森林代码运行结果  
可以看到,模型的预测结果基本是准确的,
进一步地,从模型的袋外预测率为95.3%,可知道模型的泛化能力也不错
✍️ 随机森林训练时重要的超参数
1. 特征最大个数m                                                              
 特征最大个数m一般远小于总特征个数M,例如 ​     
2. 森林规模数K                                                                  
  森林规模数K就是树的棵数,K一般设为100              
 太小会导致模型准确度不够,太大又会导致模型过于复杂





     笔者语      


关于如何理解随机森林
 随机森林曾经火过一段时间,因为它大大提高了决策树的泛化能力
但由于后来出现了XGboost,现在随机森林也就用得少了
比起随机森林算法本身,它所用的
Bagging集成算法的思想贡献更加大
建议读者看完本文后,再看看Bagging算法,再回头理解随机森林就更加深刻了

关于如何自实现随机森林
由于本文主要用于入门快速了解随机森林,所以在本文中,使用了sklearn来实现随机森林
如果不想调用函数,而是自行实现随机森林算法,可参考《
课程:随机森林-原理与自实现
该课程是老饼看完sklearn的源码后,整理而成的课程内容
课程详细讲解如何自实现随机森林,并复现出sklearn的结果,看完就知道sklearn是如何实现随机森林模型的了






好了,以上就是随机森林集成算法的入门原理和使用了~









 End 





联系老饼