Scikit-Learn随机森林分类

本文深入探讨了Scikit-Learn中的随机森林分类算法,包括其原理、优缺点以及实际应用。随机森林是一种集成学习方法,通过构建多棵决策树并进行投票来提高分类准确性和泛化能力。在Scikit-Learn中,随机森林分类器有丰富的API供调用和参数调整。文章还通过葡萄酒和鸢尾花数据集展示了随机森林的分类效果和参数调优过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >





1、随机森林分类


随机森林是一种基于集成学习(Ensemble Learning)的机器学习算法。随机森林既可用于回归也可用于分类。随机森林分类在机器学习知识结构中的位置如下:

在这里插入图片描述

1.1、随机森林分类概述


在随机森林中,集成模型中的每棵树构建时的样本都是由训练集经过随机有放回抽样自助式采样法(Bootstrap Sampling)得来的

另外,在构建树的过程中进行节点划分时,选择的划分点是基于所有特征中的随机子集的最佳划分点

随机森林的随机性主要体现在两个方面:一是决策树训练样本的随机选取,二是决策树节点划分属性特征的随机选取

这两个随机性的目的是降低森林估计器的方差。事实上,单个决策树通常表现出很高的方差,并且往往会过拟合。在森林中注入随机性产生的决策树具有一定的解耦预测误差(Decoupled Prediction Errors)。通过取这些预测的平均值或投票,可以抵消掉一些误差

随机森林属于集成学习中的Bagging(Bootstrap Aggregating)中的方法。它们之间的关系如下

在这里插入图片描述
随机森林分类通过引入随机性来构建多个决策树,再通过对这多个决策树的预测结果进行投票以产生最终的分类结果

随机森林分类算法可以应用于各种需要进行分类或预测的问题,例如,垃圾邮件识别、信用卡欺诈检测等,它也可以与其他机器学习算法进行结合,以进一步提高预测准确率

随机森林算法的构造过程如下:

  • 从原始数据集中有放回的随机选择一部分样本,构成一个子样本集,每棵决策树都在不同子样本集上进行训练,增加模型的多样性
  • 对于每棵决策树的每个节点,随机选择一部分属性,然后选择最佳划分属性,每棵决策树的每个节点都基于随机选择的部分属性,提高模型的鲁棒性
  • 在每个子样本集上构建决策树,在决策树生长的过程中,每个节点都基于随机选择的部分属性选择最佳划分属性,直到不能分裂为止
  • 建立大量决策树,形成随机森林

在随机森林中,不同决策树之间没有关联。当我们进行分类任务时,新的输入样本进入,就让森林中的每一棵决策树分别进行判断和分类,每个决策树会得到一个自己的分类结果,决策树的分类结果中哪一个分类最多,那么随机森林就会把这个结果当做最终的结果

关于集成学习、随机森林的原理与随机森林回归的介绍详见文章:传送门

1.2、随机森林分类的优缺点


优点:

  • 抗过拟合能力强:采用随机选择样本数据和特征的方式,可以有效地避免过拟合问题
  • 泛化能力强:通过对多个决策树的结果进行投票,可以获得更好的泛化性能
  • 对数据特征的选取具有指导性:在构建决策树时会对特征进行自动选择,这可以为后续的特征选择提供指导
  • 适用于大规模数据集:可以有效地处理大规模数据集,并且训练速度相对较快

缺点:

  • 需要大量的内存和计算资源:由于需要构建多个决策树,因此需要更多的内存和计算资源
  • 需要调整参数:性能很大程度上取决于参数的设置,如树的数量、每个节点的最小样本数等,这些参数的设置需要一定的经验和实验
  • 对新样本的预测性能不稳定:由于是通过投票多个决策树的结果来进行预测,因此对新样本的预测性能可能会受到影响

2、Scikit-Learn随机森林分类

2.1、Scikit-Learn随机森林分类API


sklearn.ensemble.RandomForestClassifier是Scikit-Learn随机森林分类的API:

class sklearn.ensemble.RandomForestClassifier(n_estimators=100, *, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='sqrt', max_leaf_nodes=None, min_impurity_decrease=0.0, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None, ccp_alpha=0.0, max_samples=None, monotonic_cst=None)

官方对该API的描述为:

随机森林分类是一种元估计器,它对数据集的各个子样本拟合多个决策树分类器,并使用投票来提高预测准确性和控制过度拟合。森林中的树使用最佳分割策略。如果bootstrap=True(默认),则使用max_samples参数控制子样本的大小,否则将使用整个数据集来构建每棵树

API官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

中文官方文档:https://scikit-learn.org.cn/view/633.html

API参数及说明如下:

参数 说明
n_estimators 森林中的树木(决策树)数量,默认为100。一般来说,n_estimators越小越容易过拟合,越大模型效果越好,但达到一定程度时,再增大n_estimators所提升的性能非常小,并且需要注意,n_estimators越大模型的计算量越大
criterion 用于衡量节点(分支)划分质量的指标,默认为gini(基尼系数)。其他取值还有entropy(信息熵),这种指标使用父节点的信息熵与子节点的信息熵之差(信息增益);log_loss(逻辑损失)
max_depth 决策树的最大深度,默认为None,表示将节点展开,直到所有叶子都是纯净的,或者直到所有叶子都包含少于min_samples_split个样本,即没有限制
min_samples_split 拆分内部节点所需的最少样本数,默认为2,表示每个节点至少需要2个样本才能进行划分。如果是float类型,表示每个拆分的最小样本数是总样本数的比例
min_samples_leaf 在叶节点处需要的最小样本数,默认为1,表示每个叶子节点至少需要1个样本才能停止划分,较小的值会导致过拟合。如果是float类型,表示每个节点所需的最小样本数是总样本数的比例
min_weight_fraction_leaf 在所有叶节点处(所有输入样本)的权重总和中的最小加权分数,默认为0.0。能成为叶子节点的条件是该节点对应的实例数和总样本数的比值,至少大于该值。如果未提供sample_weight,则样本的权重相等
max_features 寻找最佳划分时要考虑的特征数量,默认为None或1.0,使用全部特征。其他取值还有sqrt(sqrt(n_features));log2(log2(n_features));也可使用int类型直接指定
max_leaf_nodes 最大叶子节点数,用于控制决策树最多有多少个叶子节点,默认为None,叶子节点的数量不受限制
min_impurity_decrease 用于控制每个节点最少需要减少多少不纯度才能进行划分,默认值为0.0,表示每个节点至少需要减少0个不纯度才能进行划分。如果一个节点的杂质(不纯度)大于等于该值,则该节点将被分裂;如果比这个值低,就会成为一个叶子节点
bootstrap 是否使用自助采样法构建决策树,默认为True。如果为False,将使用整个数据集来构建每棵树
oob_score 是否使用袋外样本估计泛化精度,默认为False。由于使用了自助采样法,所以在生成一棵树的过程中会有袋外数据。因此,可以不划分训练集和测试集,而通过袋外数据评估树的准确度,所有树的准确度取平均值就是该随机森林的性能
n_jobs 要并行运行作业的核数量,默认为None,即-1,表示使用所有处理器
random_state 用于控制估算器的随机性,设置随机数生成器的种子
verbose 控制拟合和预测时的输出详细程度
### 随机森林分类器在Scikit-Learn中的应用 随机森林是一种强大的机器学习算法,适用于解决分类和回归问题。该算法通过构建多个决策树并汇总它们的结果来进行预测[^1]。 为了使用Scikit-Learn实现随机森林分类器,首先需要确保已安装Scikit-Learn库。可以通过运行`pip install -U scikit-learn`完成安装或更新操作[^3]。 下面是一个简单的例子,展示如何加载数据集、训练模型以及评估其性能: #### 加载必要的Python包 ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score, classification_report ``` #### 数据准备阶段 这里以鸢尾花(Iris)数据集为例说明基本流程;对于其他特定的数据集(如蘑菇数据集),可以根据实际情况调整路径或者下载链接[^4]。 ```python # 导入样本数据 data = load_iris() X, y = data.data, data.target # 将数据分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` #### 构建与训练随机森林模型 创建RandomForestClassifier实例,并调用fit()函数传入训练数据进行拟合。 ```python clf = RandomForestClassifier(n_estimators=100, max_depth=2,random_state=0) # 训练模型 clf.fit(X_train, y_train) ``` #### 测试与评价 利用之前划分出来的测试集合对已经训练好的模型做验证,计算准确率等指标。 ```python y_pred = clf.predict(X_test) print(f'Accuracy: {accuracy_score(y_test, y_pred)}') print(classification_report(y_test, y_pred)) ``` 上述过程展示了如何快速上手Scikit-Learn中的随机森林分类器。值得注意的是,在实际项目中可能还需要进一步优化参数设置,比如调整n_estimators的数量或是max_features的比例等等[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值