Scikit-Learn随机森林分类
- 1、随机森林分类
- 1.1、随机森林分类概述
- 1.2、随机森林分类的优缺点
- 2、Scikit-Learn随机森林分类
- 2.1、Scikit-Learn随机森林分类API
- 2.2、Scikit-Learn随机森林分类初体验(葡萄酒分类)
- 2.3、Scikit-Learn随机森林分类实践(鸢尾花分类)
- 2.4、参数调优与选择
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。由于使用了自助采样法,所以在生成一棵树的过程中会有袋外数据。因此,可以不划分训练集和测试集,而通过袋外数据评估树的准确度,所有树的准确度取平均 |