模式识别与机器学习(十二):随机森林

原理

随机森林(Random Forest, RF)是Bagging的一个扩展变体。RF在以决策树为基学习器构建Bagging集成的基础上,在决策树的训练过程中引入随机属性选择。训练每颗决策树时随机选出部分特征作为输入,所以该算法被称为随机森林算法。

在RF中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的子集(假定有d个属性),然后再从这个子集中选择一个最优属性用于划分。参数k控制了随机性的引入程度,一般情况下推荐 k = log ⁡ 2 d \mathrm{k}=\log_{2}\mathrm{d} k=log2d。随机森林的具体形式如下图:
在这里插入图片描述

假设训练集 T 的大小为 N ,特征数目为 M ,随机森林的大小为 K ,随机森林算法的具体步骤如下:

1.遍历随机森林的大小 K 次:

(1).从训练集 T 中有放回抽样的方式,取样N 次形成一个新子训练集 D

(2).随机选择 m 个特征,其中 m < M

(3).使用新的训练集 D 和 m 个特征,学习出一个完整的决策树

2.得到随机森林

实现

from sklearn.model_selection import KFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
import numpy as np

# 加载数据
iris = load_iris()
X = iris.data
y = iris.target

# 创建5折交叉验证器
kf = KFold(n_splits=5, random_state=42, shuffle=True)

# 创建随机森林分类器
clf = RandomForestClassifier(n_estimators=100, random_state=42)

# 存储每折的准确率
accuracies = []

# 进行5折交叉验证
for train_index, test_index in kf.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

    # 训练模型
    clf.fit(X_train, y_train)

    # 预测测试集
    y_pred = clf.predict(X_test)

    # 计算准确率
    accuracy = accuracy_score(y_test, y_pred)
    accuracies.append(accuracy)

# 计算平均准确率
average_accuracy = np.mean(accuracies)
print(f'Average accuracy: {average_accuracy}')

这段代码首先加载了鸢尾花数据集,并创建了一个5折交叉验证器和一个随机森林分类器。然后,对每一折的数据进行训练和测试,并计算了每一折的准确率。最后,计算了平均准确率。

### 关于模式识别中的随机森林算法行列随机化 #### 行列随机化的意义 在模式识别领域,随机森林通过两种主要方式引入随机性来增强模型的表现力和鲁棒性。一方面,在构建每一棵决策树时,会从原始数据集中抽取不同样本作为该树的训练集;另一方面,则是从所有可用特征中选取部分用于节点分裂的选择过程。 对于行(即样本)而言,每次创建新树之前都会采用自助采样法(Bootstrap Sampling),这意味着某些观测会被重复选入而另一些则可能完全未被抽到[^1]。这种做法不仅有助于打破个体树木间的相似度从而增加多样性,而且还能让那些未能参特定树生长的数据充当验证集的角色以便后续评估其表现情况。 至于列(也就是属性或变量),当面临高维空间下的复杂问题时尤为关键。具体来说,在每一个内部结点处只考虑一小批候选分割维度而非全部选项来进行最优切分点搜索操作——这一策略同样旨在促进成员间差异性的形成并有效缓解过拟合现象的发生几率[^3]。 #### Python实现示例 下面给出一段基于Scikit-Learn库实现上述特性的Python代码片段: ```python from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier # 创建模拟二元分类任务的数据集 X, y = make_classification( n_samples=500, n_features=20, n_informative=2, n_redundant=0, random_state=42) # 将数据划分为训练集测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3, stratify=y, random_state=42) # 定义RandomForestClassifier实例对象 rf_clf = RandomForestClassifier( n_estimators=100, # 构建多少颗树 max_features='sqrt', # 考虑的最大特征数量,默认为sqrt(n_features),适用于分类任务 bootstrap=True, # 是否启用bootstrap取样 oob_score=True, # 使用袋外估计计算泛化误差 n_jobs=-1, # 并行作业数设置成CPU核心总数 random_state=42 # 设定随机种子保证实验可重现性 ) # 训练模型 rf_clf.fit(X_train, y_train) print(f'OOB Score: {rf_clf.oob_score_:.3f}') ``` 这段程序展示了如何利用`max_features`参数控制每轮迭代所考察特性数目上限以及借助`bootstrap`标志位开启/关闭重置抽样的功能开关。此外还启用了袋外(OOB)评分机制以提供不依赖交叉验证手段之外的一种简便性能衡量方法[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从零开始的奋豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值