随机森林算法详解

随机森林(Random Forest)是一种集成学习算法,属于Bagging类型,用于分类和回归任务。

它通过构建多个决策树并通过投票或平均的方式来提高模型的准确性和鲁棒性。

随机森林的基本原理

随机森林的核心思想是通过构建多个弱分类器(即单棵决策树)并将它们组合成一个强分类器,从而减少过拟合,并提高模型的泛化能力。

随机森林通过以下步骤构建:

1.数据集的随机采样

对于给定的训练数据集,随机森林通过自助采样法(Bootstrap Sampling)从原始数据集中有放回地抽取多个子集,每个子集的大小与原始数据集相同。

每个子集将被用来训练一棵决策树。

2.随机特征选择

在每棵决策树的构建过程中,随机森林会在每个节点的特征分裂时,随机选择一部分特征来决定如何进行划分,而不是使用所有特征。

这种做法减少了模型的方差,提高了每棵树的多样性。

通常,选择的特征数目是训练集特征数的平方根或对数。

3.建立多棵决策树

通过上述两个步骤,随机森林会生成大量的决策树。

每棵树在训练时会对不同的数据子集和特征子集进行训练,因此每棵树的模型是不同的。

4.集成决策

当随机森林进行预测时,所有的决策树都会给出一个预测结果。

对于分类任务,通常使用投票机制,选择投票最多的类别作为最终的预测结果;

对于回归任务,随机森林会对每棵树的预测值进行平均,得到最终的预测值。

随机森林的数学公式

1. 训练过程
  • Bootstrap 采样

    从 D 中有放回地抽取 N 个样本,生成 共 M 个不同的训练子集,其中每个子集用于训练一个决策树。

  • 特征选择

    对于每个决策树的每个节点,在 m 个候选特征中选择最佳分裂特征(m<<d,d是特征总数)

2.决策树分裂标准

对于每个节点 t,我们选择一个特征 Xj和一个阈值 v来分裂数据集。

对于分类问题,常用的分裂标准有:

基尼指数

3. 随机森林的集成预测

训练完成后,随机森林将每棵决策树的输出结果进行汇总来生成最终的预测结果。

  • 对于分类问题,使用多数投票法:

对于回归问题,使用平均法:

随机森林的超参数

在使用随机森林时,通常需要调节以下几个超参数。

  • n_estimators

    决定森林中树的数量。树的数量越多,模型的表现通常会越好,但训练时间也会增加。

  • max_features

    在每个节点分裂时,考虑的最大特征数。选择较少的特征可以减少计算量,同时增加模型的随机性。

  • max_depth

    树的最大深度。控制树的生长深度,避免树过深导致过拟合。

  • min_samples_split

    内部节点再划分所需的最小样本数。该参数可以帮助控制过拟合。

  • min_samples_leaf

    叶子节点所需的最小样本数。较高的值可以防止过拟合。

随机森林的优缺点

优点
  1. 高准确性:通过集成多棵决策树,随机森林通常能提供较高的准确性。

  2. 抗过拟合:由于每棵树的训练数据和特征集不同,模型的泛化能力较强,能够有效避免单棵决策树容易出现的过拟合问题。

  3. 适应性强:随机森林适用于处理大量数据、缺失数据和高维数据。

  4. 并行性:每棵树的训练是独立的,因此随机森林可以并行计算,具有较高的效率。

  5. 特征重要性:随机森林可以评估各个特征的重要性,帮助分析和理解数据。

缺点:
  1. 模型复杂性:随着决策树的增加,模型变得更加复杂,计算和存储成本也更高。

  2. 训练时间:由于需要训练多棵决策树,训练时间较长,尤其是对于大规模数据集时,计算开销较大。

  3. 存储空间要求高:随着树的数量增多,模型占用的存储空间也会增加,这可能会成为在资源有限的情况下的一个问题。

案例分享

下面是一个使用随机森林算法对鸢尾花数据集进行分类的示例代码。

复制代码
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
import seaborn as sns

# 载入Iris数据集
data = load_iris()
X = data.data[:, :2]  # 只选择前两个特征(为了便于绘图)
y = data.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)

y_pred = rf.predict(X_test)

# 评估准确性
accuracy = accuracy_score(y_test, y_pred)
print(f'随机森林模型的准确性: {accuracy:.4f}')

绘制特征重要性

复制代码
plt.figure(figsize=(8, 6))
feat_importances = rf.feature_importances_
indices = np.argsort(feat_importances)[::-1]

plt.barh(range(X.shape[1]), feat_importances[indices], align="center")
plt.yticks(range(X.shape[1]), np.array(data.feature_names)[indices])
plt.title("Feature Importance (Random Forest)")
plt.show()

绘制决策边界

复制代码
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01),
                     np.arange(y_min, y_max, 0.01))

Z = rf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

# 绘制分类决策边界
plt.figure(figsize=(8, 6))
plt.contourf(xx, yy, Z, alpha=0.3)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolors='k', marker='o', s=100, cmap=plt.cm.RdYlBu)
plt.title('Random Forest Decision Boundary')
plt.xlabel(data.feature_names[0])
plt.ylabel(data.feature_names[1])
plt.show()
相关推荐
phltxy几秒前
ArrayList与顺序表
java·算法
Hcoco_me7 分钟前
具身智能 && 自动驾驶相关岗位的技术栈与能力地图
人工智能·机器学习·自动驾驶
yinyan131434 分钟前
一起学springAI系列一:初体验
java·人工智能·ai
一只鹿鹿鹿1 小时前
【网络安全】信息网络安全建设方案(WORD)
人工智能·安全·spring·web安全·低代码
小拇指~1 小时前
梯度下降的基本原理
人工智能·算法·计算机视觉
艾莉丝努力练剑1 小时前
【C/C++】类和对象(上):(一)类和结构体,命名规范——两大规范,新的作用域——类域
java·c语言·开发语言·c++·学习·算法
AndrewHZ1 小时前
【图像处理基石】如何对遥感图像进行实例分割?
图像处理·人工智能·python·大模型·实例分割·detectron2·遥感图像分割
TDengine (老段)2 小时前
TDengine 中 TDgp 中添加机器学习模型
大数据·数据库·算法·机器学习·数据分析·时序数据库·tdengine
CodeShare2 小时前
某中心将举办机器学习峰会
人工智能·机器学习·数据科学
天天找自己2 小时前
精通分类:解析Scikit-learn中的KNN、朴素贝叶斯与决策树(含随机森林)
python·决策树·机器学习·分类·scikit-learn