随机森林(Random Forest)原理和构建流程
随机森林是集成学习中的一种算法,通过构建多棵决策树并将它们的结果综合起来以提高预测准确性和稳定性。它结合了Bagging算法的思想和决策树的灵活性,是解决分类和回归问题的有效方法。
原理概念
-
基本思想:
- 随机森林通过构建多棵决策树并将它们的预测结果进行整合(多数投票或平均)来提高整体模型的准确性。
- 每棵树独立构建,通过随机选择样本和特征来增加多样性,减少模型的方差。
-
关键特点:
- Bagging(自助聚合):随机森林中的每棵树都在原始数据集的一个随机子集(Bootstrap样本)上进行训练,这种抽样方式是有放回的,意味着同一样本可能在多个树的训练集中出现。
- 特征随机性:在每个分割点,算法不是检查所有特征,而是随机选择一部分特征,这增加了树之间的多样性,有助于减少过拟合。
构建流程
-
初始化森林:
- 确定森林中决策树的数量
n_estimators
。通常,更多的树意味着更好的性能和稳定性,但计算成本也更高。
- 确定森林中决策树的数量
-
构建每棵决策树:
- 对于森林中的每一棵树,随机抽取训练数据的一个子集(Bootstrap抽样),用作该树的训练数据。
- 在构建树的过程中,每次需要选择最佳分割点时,不是从所有特征中选择,而是从随机选择的一个特征子集中选择。
-
训练每棵树:
- 每棵树独立地在其抽样的数据集上进行训练。树可以生长到最大深度,除非设置了
max_depth
。
- 每棵树独立地在其抽样的数据集上进行训练。树可以生长到最大深度,除非设置了
-
综合所有树的预测结果:
- 对分类问题,使用多数投票法确定最终预测。即每棵树的预测结果中最多的类别成为随机森林的预测结果。
- 对回归问题,计算所有树预测结果的平均值作为最终预测。
优点
- 减少过拟合:通过在多棵树上平均预测,随机森林通常能够避免单棵决策树容易出现的过拟合问题。
- 高度灵活:可以处理分类和回归任务,能够处理缺失数据,无需标准化输入数据。
缺点
- 模型复杂性:随机森林模型通常包含数百甚至数千棵树,导致模型很大,需要更多的内存和计算时间。
- 结果解释性:虽然单棵决策树非常直观,但随机森林中成百上千的树使得模型的解释变得复杂。
随机森林因其出色的准确性、鲁棒性和易用性,在实际应用中非常受欢迎,尤其是在竞赛和工业界中。
基于鸢尾花分类案例的随机森林代码示例
随机森林是通过构建多棵决策树并将它们的预测结果综合起来的集成学习方法。它旨在减少单棵决策树的过拟合风险,并提高模型的泛化能力。
构造函数 __init__
def __init__(self, n_estimators=100, max_depth=None):
self.n_estimators = n_estimators # 决策树的数量
self.max_depth = max_depth # 树的最大深度
self.estimators = [] # 存储所有决策树的列表
- n_estimators: 表示随机森林中决策树的数量。较多的树可以提高模型的稳定性和准确性,但同时也会增加计算成本。
- max_depth: 控制每棵树的最大深度,有助于防止过拟合。
- estimators: 用于存储所有的决策树实例。
拟合方法 fit
def fit(self, X, y):
for _ in range(self.n_estimators):
# 循环遍历决策树
tree = DecisionTree(max_depth=self.max_depth)
indices = np.random.choice(len(X), len(X), replace=True) # 随机选取样本,随机选取样本数量,有放回
X_bootstrap = X[indices] #x存储的数据信息
y_bootstrap = y[indices] #y存储的标签索引
tree.fit(X_bootstrap, y_bootstrap)
self.estimators.append(tree)
- 功能: 训练随机森林模型。对于指定数量的决策树,每棵树都在数据的一个随机子集(bootstrap样本)上进行训练。
- 过程:
- 使用
np.random.choice
从原始数据集中随机抽取样本,形成 bootstrap 样本。这种抽样是有放回的,意味着同一样本可能被多次选中。 - 每棵树都独立地在其对应的 bootstrap 样本上进行训练。
- 训练完成后,每棵树被添加到
estimators
列表中。
- 使用
预测方法 predict
def predict(self, X):
y_pred = np.array([tree.predict(X) for tree in self.estimators])
return np.mean(y_pred, axis=0).astype(int)
- 功能: 使用随机森林模型对新数据进行预测。
- 过程:
- 对每棵树使用
predict
方法得到预测结果。 - 将所有树的预测结果求平均(对于回归问题)或者用多数投票(对于分类问题)来决定最终的预测输出。
- 对每棵树使用