随机森林算法

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张图片 


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

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

  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案例

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寻找最佳参数:

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等。 

你可能感兴趣的:(机器学习算法,算法,随机森林,机器学习)