前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >随机森林算法

随机森林算法

作者头像
@小森
发布2024-03-15 11:56:22
540
发布2024-03-15 11:56:22
举报
文章被收录于专栏:xiaosenxiaosen

Bagging 框架

Bagging框架,即 Bootstrap Aggregating,是一个用于提高机器学习算法稳定性和准确性的方法。Bagging 算法通过对原始数据集进行有放回的抽样,生成多个不同的数据子集,然后分别在这些子集上训练模型。最后,通过对这些模型的预测结果进行投票(分类问题)或求平均(回归问题),得到最终的预测。Bagging 方法可以有效减少模型的方差,防止过拟合,并提高模型的泛化能力。

假设我们有一个数据集,包含100个样本,每个样本有5个特征。我们的任务是对一个新的样本进行分类。

  1. 首先,我们从原始数据集中随机抽取(有放回)100个样本,形成一个新的数据集。这个过程称为Bootstrap抽样。
  2. 然后,我们使用这个新的数据集训练一个基分类器,例如决策树。
  3. 接下来,我们重复步骤1和2,创建更多的数据集,并训练更多的基分类器。假设我们训练了10个基分类器。
  4. 当我们需要对新的样本进行分类时,我们将这个样本分别送入这10个基分类器进行预测。每个基分类器都会给出一个预测结果。
  5. 最后,我们根据这10个基分类器的预测结果进行投票,得到最终的分类结果。如果有超过一半的基分类器将样本分为类别A,那么最终的预测结果就是类别A。

通过这种方式,Bagging框架可以有效地减少模型的方差,提高模型的稳定性和准确性。 

Bagging算法首先采用M轮自助采样法,获得M个包含N个训练样本的采样集。然后,基于这些采样集训练出一个基学习器。最后将这M个基学习器进行组合。

  • 分类任务采用简单投票法:每个学习器一票。
  • 回归问题使用简单平均法:每个学习器的预测值取平均值。

 随机森林

 随机森林是基于 Bagging 思想实现的一种集成学习算法,它采用决策树模型作为每一个基学习器。其构造过程:

  1. 抽取训练样本:从原始的训练集中通过有放回的抽样方式抽取相同数量的样本,用于训练每一棵决策树。
  2. 选择特征:在每个决策树的节点分裂时,从所有的特征中随机选择一部分特征,用这部分特征来评估最佳的分裂方式。
  3. 构建决策树:使用所选的特征和样本来训练决策树。每棵树都独立地生长,不进行剪枝操作。
  4. 集成多棵树:重复以上步骤,构建大量的决策树,形成一个“森林”。
  5. 预测与投票:当需要对新样本进行预测时,让森林中的每棵树都对该样本进行预测,然后通过投票机制(分类问题)或平均机制(回归问题)来得到最终的预测结果。

>>  集成学习通过构建多个学习器来提高整体模型的性能,主要通过降低方差和偏差来实现 。

以下是集成学习采用不同模型分别随机采样的原因:(每个模型随机采样数据)

  1. 降低过拟合风险:使用多个模型对应所有数据集可能会导致模型过于复杂,从而增加过拟合的风险。通过随机采样训练不同的模型,每个模型可以专注于数据的不同部分,从而减少过拟合的可能性。
  2. 增强模型泛化能力:随机采样可以增加模型的多样性,而多样性是集成学习提高泛化能力的关键因素。不同的模型可能在不同的数据子集上表现更好,通过结合这些模型的预测结果,可以获得更准确和稳健的预测。
  3. 关注不同的误差来源:集成学习中的不同方法,如Boosting和Bagging,分别关注于降低偏差和方差。通过随机采样,这些方法可以从不同的误差来源中学习,从而提高整体模型的性能。
  4. 避免模型同质性:如果所有模型都使用相同的数据集,可能会导致模型之间的同质性,即它们犯相同的错误。通过随机采样,可以确保每个模型有不同的视角和错误模式,从而在集成时能够互相补充和纠正。
  5. 并行化与效率:在集成学习中,基学习器之间通常不存在依赖关系,这意味着它们可以并行生成和训练。这种方法(如Bagging)可以提高计算效率,因为不同的模型可以同时在不同的数据子集上进行训练。

首先,对样本数据进行有放回的抽样,得到多个样本集。具体来讲就是每次从原来的N个训练样本中有放回地随机抽取m个样本(包括可能重复样本)。

然后,从候选的特征中随机抽取k个特征,作为当前节点下决策的备选特征,从这些特征中选择最好地划分训练样本的特征。用每个样本集作为训练样本构造决策树。单个决策树在产生样本集和确定特征后,使用CART算法计算,不剪枝。

随机森林中有两个可控制参数:森林中树的数量、抽取的属性值m的大小。

随机森林API

sklearn.ensemble.RandomForestClassifier()

  • n_estimators:决策树数量,(default = 10)
  • Criterion:entropy、或者 gini, (default = gini)
  • max_depth:指定树的最大深度,(default = None )
  • max_features="auto”, 决策树构建时使用的最大特征数量
  • min_samples_split: 结点分裂所需最小样本数
  • min_samples_leaf: 叶子节点的最小样本数(default = 1)
  • min_impurity_split: 节点划分最小不纯度

此外,还有其他库如XGBoost和LightGBM等也提供了随机森林的实现,它们在计算效率和内存使用上可能有所不同。

 demo案例

代码语言:javascript
复制
import pandas as pd
titanic=pd.read_csv("泰坦尼克.csv")
# 选择特征pclass,age,sex
X=titanic[['pclass','Age','Sex']]
y=titanic['Survived']

#数据的填补
X['Age'].fillna(X['Age'].mean(),inplace=True)
X = pd.get_dummies(X)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test =train_test_split(X,y,test_size=0.25,random_state=22)

from sklearn.ensemble import RandomForestClassifier
rfc=RandomForestClassifier(max_depth=6,random_state=9)
rfc.fit(X_train,y_train)
rfc_y_pred=rfc.predict(X_test)
rfc.score(X_test,y_test)

#6.性能评估
from sklearn.metrics import classification_report

print("rfc_report:",classification_report(rfc_y_pred,y_test))

可以通过交叉验证配合GridsearchCV寻找最佳参数:

代码语言:javascript
复制
rf = RandomForestClassifier()

param={"n_estimators":[80,100,200], "max_depth": [2,4,6,8,10,12],"random_state":[9]}

# 3 使用GridSearchCV进行网格搜索
from sklearn.model_selection import GridSearchCV
gc = GridSearchCV(rf, param_grid=param, cv=2)
gc.fit(X_train, y_train)
print("随机森林预测准确率:", gc.score(X_test, y_test))

随机森林通过自助法、特征采样方法训练学习器,最后采用投票方式决定未知样本的最后预测。

随机森林的总结:

  • 随机森林由多个决策树组成,每个决策树都是一个独立的分类或回归模型。 
  • 随机森林利用多个决策树的预测结果进行投票(分类)或平均(回归),从而得到比单个决策树更准确和稳定的预测。
  • 在训练过程中引入两个层次的随机性,一是通过Bootstrap抽样形成不同的训练数据集,二是在每个节点分裂时随机选择特征子集。
  • 由于每棵树都是在略有不同的数据集上训练的,并且考虑不同的特征,因此树之间具有多样性,这有助于减少过拟合。
  • 随机森林适用于各种类型的数据,包括数值型和类别型特征,并且可以处理缺失值和异常值。
  • 随机森林算法在多个机器学习库中都有实现,包括scikit-learn、XGBoost、LightGBM等。 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档