[机器学习+sklearn库包]随机森林模型训练(回归实战)

1,960 阅读6分钟

image.png

样本s是总的训练样本集,
s1,s2,s3...sn是每棵决策树的训练样本(从总样本中有放回的随机抽样出来的,相当于是s的子集,但是其中的样本数据是可以重复的)
每一个训练样本子集,去训练一棵决策树(基于一些算法,比如gini系数,信息增益比等划分的算法)

训练完之后,每棵决策树都是一位【专家】,他们都可以针对一个问题给出自己的答案。

分类问题:投票
回归问题:计算均值。

1/前言

随机森林可以应用在【分类】和】回归】问题上,这是众所周知的。

实现这一点,取决于随机森林中的每颗cart树是分类决策树还是回归决策树。
cart, class and regressor tree, 单从字面上理解,cart就是分类回归决策树。

<1>如果cart树是分类树,那么采用的节点划分原则就是gini指数。
   随机森林基于每棵树的分类结果,采用投票表决的手段进行分类。
    
   1)什么是gini指数?
      从样本集合中随机选择2条样本数据,计算它们不属于同一类别的概率。
      此概率越小,说明这2条样本属于同一类别的概率就越大,则划分的数据集合越纯,划分得越好。
      gini指数越小越好。
      
   2)cart分类树对于连续型特征和离散型特征处理的改进?
      对于连续型特征的处理问题,其思想和C4.5是相同的。
      唯一的区别在于在选择划分点时的度量方式不同,C4.5使用的是信息增益比,则CART分类树使用的是基尼系数。
      具体的思路如下,比如某个连续特征Am个取值,从小到大排序后为a1,a2,…,am,
      则cart算法取相邻两样本值的中位数,一共取得m-1个划分点,
      对于这m-1个点,分别计算以该点作为二元分类点时的基尼系数gini,
      选择基尼系数最小的点作为该连续特征的二元离散分类点。
      比如取到的基尼系数最小的点为at,则小于at的值划分到一个子节点,大于at的值划分到另一个子节点。
      这样我们就做到了连续特征的离散化。
      要注意的是,与离散特征不同的是,如果当前节点为连续型特征,则该特征后面还可以参与子节点的产生选择过程(也就是说该连续型特征可能会被再次用到)
      
      对于CART分类树离散值的处理问题,采用的思路是不停的二分离散特征。

<2>如果cart树是回归决策树,采用的节点划分原则是最小均方差msemean square error)。
   即对于任意特征A,对应其任意划分点s,把数据集D划分成数据集D1D2,
   求出使D1D2各自集合的均方差最小,同时D1D2的均方差之和最小所对应的特征和特征值划分点scart回归树的预测是根据叶子节点中训练样本数据的label均值,
   因此随机森林的预测是所有树的预测值再次计算均值。

2/随机森林用于回归的一个弊端

它只能给出训练数据集中标签值之间的预测。
也就是说,预测出来的值,不会超出叶子节点中【训练样本的最小值,训练样本的最大值】这个范围。

从这个意义上讲,它与KNN非常相似。
换句话说,在回归问题中,随机森林可以做出的预测范围受训练数据中最高和最低标签的约束。

3/实战案例

我们以在以前的文章中经常提到泰坦尼克号为例。 
让我们再次尝试同样的问题。 
这种情况下的目标是,了解调整随机森林参数而不是找到最好的特征。 
试试下面的代码来构建一个基本模型:
 from sklearn.ensemble import RandomForestRegressor
 from sklearn.metrics import roc_auc_score
 import pandas as pd
 
 x = pd.read_csv("train.csv")
 y = x.pop("Survived")
 
 # 初始化一个随机森林模型对象
 model =  RandomForestRegressor(n_estimator=100 , 
                                 oob_score=TRUE, 
                                 random_state=42)
 # 直接使用训练样本数据进行模型的训练
 model.fit(x(numeric_variable,y)
 print("AUC-ROC: ", roc_auc_score(y,model.oob_prediction)
 #结果
 #AUC-ROC:0.7386

 #这是一个非常简单没有参数设定的模型。现在让我们做一些参数调整。 
 #正如我们以前讨论过,我们有6个关键参数来调整。
 #我们有一些Python内置的的网格搜索算法,它可以自动调整所有参数。
 #在这里让我们自己动手来实现,以更好了解该机制

 #下面的代码将帮助您用不同的叶子大小来调整模型。

 from sklearn.ensemble import RandomForestRegressor
 from sklearn.metrics import roc_auc_score
 import pandas as pd
 
 x = pd.read_csv("train.csv")
 y = x.pop("Survived")
 
 # 改变min_samples_leaf参数的大小
 # 该参数是叶子节点中允许的最少的样本数据的量
 sample_leaf_options = [1,5,10,50,100,200,500]

 for i in sample_leaf_options: 
     model = RandomForestRegressor(n_estimator=200, 
                                   oob_score=TRUE, 
                                   n_jobs=-1,
                                   random_state=50,
                                   max_features="auto", 
                                   min_samples_leaf=i)

     model.fit(x(numeric_variable,y)
     print( "AUC-ROC: ", roc_auc_score(y,model.oob_prediction) )

RandomForestRegressor()的oob_score参数

`oob_score`是`RandomForestRegressor`(随机森林回归器)中的一个参数,
它表示是否使用袋外样本(out-of-bag samples)来评估模型的性能。

在随机森林的训练过程中,对于每一棵决策树,都会有放回地抽取样本进行训练。
而那些未被抽取到的样本,就称为袋外样本。

当`oob_score=True`时,模型训练结束后,可以使用这些袋外样本来对模型进行验证,相当于一种简单的交叉验证。
这种方法的优点是在不增加额外计算成本的情况下,可以对模型的泛化能力进行一个近似的评估。
通过查看`oob_score_`属性,可以得到模型在袋外数据上的预测精度。


默认为`oob_score=False`,即不使用袋外样本进行评估。

设置`oob_score=True`可以帮助了解模型在未见过的数据上的表现,从而更好地判断模型的泛化能力和可靠性。
但需要注意的是,袋外样本评估只是一种近似的估计,其结果可能不如使用独立的测试集进行评估准确,
但在一些情况下,它可以提供一个快速且相对可靠的模型性能指标。
在实际应用中,通常建议同时使用独立的测试集来更全面地评估模型的性能,也就是oob_score=False.