Bagging和随机森林:机器学习中的集成学习方法
Bagging和随机森林:机器学习中的集成学习方法
Bagging和随机森林是机器学习中常用的集成学习方法,它们通过组合多个弱学习器来提高模型的泛化能力。本文将详细介绍这两种方法的原理、实现过程以及应用场景。
Bagging集成原理
Bagging(Bootstrap Aggregating)是一种集成学习方法,其核心思想是通过Bootstrap采样生成多个数据集,然后在每个数据集上训练一个基学习器,最后通过投票或平均的方式组合这些基学习器的预测结果。
具体实现过程如下:
- 从原始数据集中有放回地随机采样生成多个数据集
- 在每个采样数据集上训练一个基学习器
- 对所有基学习器的预测结果进行平权投票(分类任务)或平均(回归任务),得到最终的预测结果
Bagging的主要优点是能够降低模型的方差,提高预测的稳定性。通过引入数据扰动,Bagging可以有效地减少过拟合的风险。
随机森林构造过程
随机森林(Random Forest)是一种基于决策树的Bagging集成方法。它在Bagging的基础上引入了特征随机化,即在每个节点的分裂过程中,只考虑随机选择的一部分特征。这种额外的随机化进一步提高了模型的多样性,从而增强了模型的泛化能力。
随机森林的构造过程可以总结为以下步骤:
- 从原始数据集中有放回地随机采样生成多个数据集
- 在每个采样数据集上训练一棵决策树,但在每个节点的分裂过程中,只考虑随机选择的一部分特征
- 对所有决策树的预测结果进行平权投票(分类任务)或平均(回归任务),得到最终的预测结果
随机森林的关键参数包括:
- 树的数量(n_estimators)
- 每棵树的最大深度(max_depth)
- 每个节点分裂时考虑的特征数量(max_features)
- 是否使用放回抽样(bootstrap)
包外估计
在随机森林的构造过程中,由于使用了有放回的抽样,每次采样都会有一部分样本没有被选中,这部分样本被称为包外数据(Out-of-Bag,OOB)。包外数据可以用于评估模型的性能,这种评估方法称为包外估计。
包外估计的主要优点是:
- 无需额外的测试集,可以利用训练数据进行评估
- 是对集成分类器泛化误差的无偏估计
- 可以用于计算特征的重要性
随机森林API介绍
在Python的scikit-learn库中,随机森林的实现类为RandomForestClassifier
(分类任务)和RandomForestRegressor
(回归任务)。以下是RandomForestClassifier
的主要参数:
n_estimators
:森林中的树的数量,默认为10criterion
:用于衡量分裂质量的标准,默认为"gini"max_depth
:树的最大深度,默认为Nonebootstrap
:是否在构建树时使用放回抽样,默认为Truemax_features
:每个决策树的最大特征数量,默认为"auto"random_state
:随机数种子,用于控制随机性min_samples_split
:内部节点再划分所需最小样本数,默认为2
随机森林预测案例
下面通过一个泰坦尼克号生存预测的案例来说明随机森林的应用:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report
# 读取数据
df = pd.read_csv("泰坦尼克号数据.csv")
# 数据预处理
x = df[['Pclass', 'Age', 'Sex']]
y = df['Survived']
x.loc[:, ['Age']] = x.loc[:, ['Age']].fillna(x.loc[:, ['Age']].mean())
x = pd.get_dummies(x) # 进行One-Hot编码
# 划分训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=22)
# 决策树模型
dtc = DecisionTreeClassifier()
dtc.fit(x_train, y_train)
dtc_pred = dtc.predict(x_test)
print("决策树准确率:", dtc.score(x_test, y_test))
print("决策树分类报告:")
print(classification_report(dtc_pred, y_test))
# 随机森林模型
rfc = RandomForestClassifier(max_depth=6, random_state=9)
rfc.fit(x_train, y_train)
rfc_pred = rfc.predict(x_test)
print("随机森林准确率:", rfc.score(x_test, y_test))
print("随机森林分类报告:")
print(classification_report(rfc_pred, y_test))
# 超参数调优
rf = RandomForestClassifier()
param = {"n_estimators": [80, 100, 200], "max_depth": [2, 4, 6, 8, 10, 12], "random_state": [9]}
gc = GridSearchCV(rf, param_grid=param, cv=2)
gc.fit(x_train, y_train)
print("最佳参数:", gc.best_params_)
print("随机森林预测的准确率为:", gc.score(x_test, y_test))
Bagging集成优点
Bagging集成方法具有以下优点:
- 可以在原有算法上提高约2%左右的泛化正确率
- 实现简单,使用方便,具有很好的通用性
Bagging可以与多种基学习器结合使用,如决策树、线性回归、逻辑回归、深度学习等,形成不同的Bagging集成学习方法。
总结
Bagging集成过程:
- 采样 — 从所有样本里面,采样一部分
- 学习 — 训练弱学习器
- 集成 — 使用平权投票
随机森林介绍:
随机森林定义:随机森林 = Bagging + 决策树
流程:
- 随机选取m条数据
- 随机选取k个特征
- 训练决策树
- 重复1-3
- 对上面的若决策树进行平权投票
注意:
- 随机选取样本,且是有放回的抽取
- 选取特征的时候吗,选择m< M(M是所有的特征数)
包外估计:如果进行有放回的对数据集抽样,会发现,总是有一部分样本选不到
API:
sklearn.ensemble.RandomForestClassifier()
Bagging + 决策树/线性回归/逻辑回归/深度学习… = bagging集成学习方法
bagging的优点:
- 均可在原有算法上提高约2%左右的泛化正确率
- 简单, 方便, 通用