做淘宝还是做网站,昆明房产网站建设,安徽建设信息网官网,做网站办什么营业执照文章目录一、CART 决策树的分类流程1. CART 树的基本生长过程1.1 规则评估指标选取与设置1.2 决策树备选规则创建方法1.3 挑选最佳分类规则划分数据集1.4 决策树的生长过程2. CART 树的剪枝二、CART 分类树的 Scikit-Learn 快速实现方法与评估器参数详解1. CART 分类树的 sklea…
文章目录一、CART 决策树的分类流程1. CART 树的基本生长过程1.1 规则评估指标选取与设置1.2 决策树备选规则创建方法1.3 挑选最佳分类规则划分数据集1.4 决策树的生长过程2. CART 树的剪枝二、CART 分类树的 Scikit-Learn 快速实现方法与评估器参数详解1. CART 分类树的 sklearn 快速实现2. CART 分类树评估器的参数详解根据上一小节的介绍我们知道CART 树是目前机器学习领域内最通用的决策树并且 CART 树能够同时解决分类问题和回归问题。本节我们将首先介绍关于 CART 树在进行分类问题建模时的基本流程同时详细讲解 sklearn 中相关评估器的参数情况与使用方法。
# 科学计算模块
import numpy as np
import pandas as pd
# 绘图模块
import matplotlib as mpl
import matplotlib.pyplot as plt
# 自定义模块
from ML_basic_function import *
# Scikit-Learn相关模块
# 评估器类
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import GridSearchCV
# 实用函数
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 数据准备
from sklearn.datasets import load_iris一、CART 决策树的分类流程
从基本原理来说决策是一种非常通用的模型在模型训练时可以带入分类变量、也可以带入连续变量同时在进行预测时既能解决分类问题也能解决回归问题。在介绍 CART 树的原理时我们先从简单入手先考虑自变量都是离散变量的分类预测问题再逐步拓展连续变量的处理方法和回归类问题的预测方法。
1. CART 树的基本生长过程
首先我们来看在特征都为分类变量时、围绕分类问题构建 CART 的基本过程。
1.1 规则评估指标选取与设置
1 划分规则评估指标概念在引言部分中我们曾简单构建了一个决策树我们曾强调决策树的建模过程实际上就是挖掘有效分类规律的过程而这里的分类规律是否有效其实是需要有一个评估标准的。此前我们是在逻辑回归的模型结论的基础上寻找分类规律可以看成是根据分类结果的准确率来寻找分类规则此时准确率就是评估分类条件好坏的评估指标。例如在决策树开始生长的第一层我们选取 petal length (cm) 2.5 作为分类条件将原始数据集一分为二分出来的两个数据集其中一个 100% 是一类数据另一个则全是二、三类数据。此时如果我们根据准确率来判断该分类规则是否能够很好的区分一类和二、三类数据的话那此时的准确率就是 100%此时的分类误差就是 0。 2 划分规则评估指标构建的核心思路当然这种定义分类评估指标的方法并不通用并且在多分类问题时容易引发混乱。例如如果是四分类问题1 条件能够 100% 区分 A 类和 BCD 类2 条件能够 100% 区分 AB 类和 CD 类此时如何还按照准确率来进行判别分类条件好坏的判别一句则选择哪个条件就成了问题。因此一般来说树模型挑选分类规则的评估指标并不是看每个类别划分后的准确率而是父节点划分子节点后子节点数据集标签的纯度。注意此处纯度是一个非常重要的概念一般来说如果一个数据集标签都比较倾向于取得同一个值不管是都取 0 还是都取 1则我们就说这个数据集的标签纯度高反之则说这个这个数据集标签纯度不高。而决策树的划分规则的评估标准其实都是根据纯度来进行构建的。其实决策树生长的方向也就是令每个划分出来的子集纯度越来越高的方向。3 单独一个数据集的标签纯度衡量指标首先我们先来讨论对于一个单独的数据集来说可以通过哪些指标来衡量该数据集标签的纯度。一般来说用于衡量数据集标签纯度的数值指标一般有三种分别是分类误差、信息熵和基尼系数对于每个单独数据集来说其基本计算公式如下a 分类误差Classification errorClassificationerror(t)1−max1≤i≤c[p(i∣t)]Classification\ error(t) 1-\max_{1\leq i\leq c}[p(i|t)]Classification error(t)1−1≤i≤cmax[p(i∣t)]其中 i 表示第 i 类当前数据集总共有 c 类p(i∣t)p(i|t)p(i∣t) 代表第 i 类数据占当前数据集中总数据的比例。而所谓的分类误差其实就是用 1 减去多数类的占比。例如某个包含 10 条数据的数据集有 6 条 0 类数据、4 条 1 类数据此时该数据集分类误差就是 1-6/10 0.4。分类误差在 [0, 0.5] 范围内取值分类误差越小说明数据集标签纯度越高。此外由于决策树中每一个数据集实际上就代表一系列分类规则因此分类误差的另一种理解方法是如果需要根据少数服从多数原则对当前数据集选取一个唯一的标签此前一系列分类规则输出一个最终结果则只能将所有少数类的标签改成多数类的标签此时误差对应的分类规则的误差就是所有少数类的数据占比。分类误差实际上就是贪心算法所使用的决策树划分规则评估指标b 信息熵EntropyEntropy(t)−∑i1cp(i∣t)log2p(i∣t)Entropy(t) -\sum_{i1}^c p(i|t)log_2p(i|t)Entropy(t)−i1∑cp(i∣t)log2p(i∣t)当然我们此前所介绍的用于衡量数据混乱程度的信息熵也可以用于衡量数据集标签纯度而信息熵的计算过程也正如此前介绍的一样每个类别的数据占比乘以以 2 为底的对数处理结果然后再进行不同类别的累加最后进行负值处理。例如还是针对一个包含了 6 个 0 类、4 个 1 类的数据集信息熵计算结果为
- 4/10 * np.log2(4/10) - 6/10 * np.log2(6/10)
#0.9709505944546686当然回顾此前内容信息熵也是在 [0,1] 之间取值并且信息熵越小则说明数据集纯度越高。信息熵的相关详细介绍参见 Lesson 4.2。ID3、C4.5、C5.0 算法主要使用信息熵进行划分规则的挑选c 基尼系数GiniGini(t)1−∑i1cp(i∣t)2Gini(t) 1-\sum_{i1}^c p(i|t)^2Gini(t)1−i1∑cp(i∣t)2此外还有一个和信息熵的计算过程比较类似的评估指标——基尼系数。基尼系数通过计算 1 减去每个类别占比的平方和来作为纯度衡量指标例如还是针对一个包含了 6 个 0 类、4 个 1 类的数据集基尼系数的计算结果为
1 - np.power([4/10, 6/10], 2).sum()
#0.48而和信息熵不同的是基尼系数在 [0, 0.5] 范围内取值并且基尼系数越小表示数据集标签纯度越高。
p_l np.arange(0, 1, 0.01)gini_l []
for p in p_l:gini_l.append(1 - np.power([p, 1-p], 2).sum())plt.plot(p_l, gini_l)在默认情况下CART 树默认选择 Gini 系数作为评估指标。在随后的建模试验中我们也默认采用基尼系数作为评估指标。当然我们也可以简单对比在二分类情况下三个评估指标伴随某类样本所占比例 p 值变化而变化的情况
np.max([1, 2])
#2ce_l []
gini_l []
en_l []
for p in p_l:ce_l.append(1-np.max([p, 1-p]))gini_l.append(1 - np.power([p, 1-p], 2).sum())en_l.append(entropy(p))plt.plot(ce_l, b-, gini_l, r-, en_l, r--)4 多个数据集的平均指标在很多时候我们不仅需要衡量单独数据集标签的纯度我们还需要衡量多个数据集作为一个整体时的标签的纯度例如一个父节点在划分成两个子节点时两个子节点整体的评估指标。此处我们举例说明我们简化一组后续建模会用到的客户数据简化后的数据集 A 共有两个特征、一个标签并且标签只有 0-1 两个类别数据集特征分别是收入income和信用评级credit_rating同样也都用有两个分类水平的离散变量表示。 此时我们首先可以计算该数据集整体的基尼系数
p 3/8
gini_A 1 - np.power([p, 1-p], 2).sum()
gini_A
#0.46875然后我们随意设置一个分类条件。例如我们设置分类条件为 income 1.5则可以将上述数据集进一步划分成两个子数据集 B1、B2 p 2/5
gini_B1 1 - np.power([p, 1-p], 2).sum()
gini_B1
#0.48而 B2 数据集只包含一个标签因此 B2 的基尼系数为 0。
gini_B2 0而此时如果要计算 B1、B2 整体的基尼系数则需要在 gini_B1、gini_B2 的基础上进行各自数据集样本数量占整体数据集比例的加权求和即根据如下方式进行计算Gini(B)∣B1∣∣A∣Gini(B1)∣B2∣∣A∣Gini(B2)Gini(B) \frac{|B_1|}{|A|}Gini(B_1)\frac{|B_2|}{|A|}Gini(B_2)Gini(B)∣A∣∣B1∣Gini(B1)∣A∣∣B2∣Gini(B2)其中∣Bi∣∣A∣\frac{|B_i|}{|A|}∣A∣∣Bi∣为子数据集BiB_iBi数据个数占父类数据集A中数据个数的比例。因此上述B1B_1B1、B2B_2B2整体基尼系数为
gini_B gini_B1 * 5/8 gini_B2 * 3/8
gini_B
#0.3至此我们就构建了一个用于描述数据集划分完后两个子集的整体纯度的方法而我们知道子集整体纯度越高其实也就说明对应分类规则越有效。接下来我们将详细讨论如何构建分类规则以及如何对这些分类规则进行评估。
1.2 决策树备选规则创建方法
正如此前所说决策树模型的建模过程实际上就是在挑选有效分类规则的过程而要挑选有效分类规则首先就必须明确如何创建哪些备选规则其实对于很多树模型特征是离散型变量还是连续性变量会直接影响备选规则的创建。但对于 CART 树以及 sklearn 中集成的方法来说是将两种情况合二为一来进行看待也就是根据如下方式来进行备选规则的创建对于任何特征矩阵首先需要逐列对其进行数值排序例如上述数据集 A我们可以单独提取 income 和 credit_rating 两列来进行降序排序排序结果如下 据此我们通过寻找这些特征不同取值之间的中间点作为切点来构造备选规则。例如 income 有两个取值 1、2因此只有一个切点就是 1.5那么我们就能创造一个 income 1.5 的规则来对数据集进行划分如此我们就能把 income 取值为 1 的数据划归一个子集、income 取值为 2 的数据集划归另一个子集实际上上面在介绍多数据集基尼系数计算过程时就是采用该规则。需要知道的是在所构造的条件中不等号的方向实际上没有任何影响。当然incom e只有两个取值只能找到一个切点只能构造一个规则而 credit_rating 特征也有两个取值因此也能找到一个切点构造一个备选规则即我们其实也可以根据 credit_rating 1.5 来切分出两个子集。而其实如果特征是三个取值的特征则可以找到两个切点、找到两种划分数据集的方式。更进一步的如果该数据中某特征是连续变量每条不同的数据取值都不同例如 则此时可以将其看成是拥有 8 个分类水平的分类变量仍然还是寻找相邻取值水平的中间值作为切点来构造划分规则此时由于 age 特征有 8 个不同的取值因此可以构造 7 个备选的划分数据集的方法例如 age 36、age 34.5 等等。也就是说对于任何一个特征无论是连续型变量还是分类变量只要有 N 个取值就可以创造 N-1 个划分条件将原数据集划分成两份。正是因为可以用一种方法就能同时处理连续变量和离散变量因此在决策树建模的过程中我们无需特别区分两种类型特征的区别。此外需要注意的是CART 树用这种方法同时处理离散变量和连续变量而 C4.5 只用这种方式处理连续变量离散变量采用另一种方法因此这里我们可以理解成是 CART 树将离散变量连续化也就是将离散变量看成是连续变量。这也就是为何 sklearn 在说明文档中强调sklearn 的树模型无法处理分类变量的原因原文scikit-learn implementation does not support categorical variables for now。此处所谓的无法处理分类变量并不是不能带入分类变量进行建模而是不支持类似 C4.5 的方法从离散特征中提取备选划分规则而是会将离散变量也看成是连续变量采用 C4.5 处理连续变量的方法处理离散变量。
1.3 挑选最佳分类规则划分数据集
当然对于上述 A 数据集总共有两个特征每个特征有一个备选划分规则因此在对根结点划分时其实是有两种数据集的划分方法我们已经简单查看采用 income 1.5 进行分类的结果 而如果我们采用 credit_rating 1.5 来对数据集进行划分则将出现下述结果 从结果上来看这两个划分条件都能切分出一个只包含一类标签的数据集结果区分不是很大那么到底应该选用哪个分类规则对数据集进行第一次切分、让决策树完成第一步的生长呢这个时候就要用到此前我们介绍的关于评价分类规则是否有效的评估指标了一般来说对于多个规则我们首先会计算父节点的基尼系数Gini(A)然后计算划分出的两个子节点整体基尼系数Gini(B)然后通过对比哪种划分方式能够让二者差值更大即能够让子节点的基尼系数下降更快我们就选用哪个规则。例如对上述例子我们知道在以 income 1.5 为规则划分数据集时基尼系数下降结果为
gini_A - gini_B
#0.16875而如果采用第二个划分规则来进行数据集切分则此时基尼系数下降结果为
p 3/4
gini_B2 1 - np.power([p, 1-p], 2).sum()
gini_B2
#0.375gini_B1 0gini_B gini_B1 * 1/2 gini_B2 * 1/2
gini_B
#0.1875gini_A - gini_B
#0.28125很明显第二个规则能够让父节点的基尼系数下降更快因此第二个规则、即 credit_rating 1.5 划分规则是一个更好的规则在第一次数据集划分时我们应该采用该规则。注如果是 ID3 或者 C4.5此处则是以信息熵计算结果为准。
1.4 决策树的生长过程
当完成一次规则筛选与树生长后接下来需要考虑的问题是面对当前划分出的数据集 B1、B2是否还需要进一步寻找分类规则对其进行划分。 首先对于数据集 B1 来说由于其基尼系数已经为 0无需再进行计算而 B2 数据集基尼系数为 0.375还可以进一步提取有效分类规则对其进行分类以降低其基尼系数。此时我们又可以完全重复数据集 A 的划分过程首先围绕数据集 B2 进行备选规则的提取对于 B2 来说备选规则只有 income 1.5 一条因此我们就以该规则划分数据集 能够看出最终划分出来的 C1 和 C2 基尼系数都是 0因此 C 的两个数据集整体基尼系数也是 0当然我们也无需进一步划分数据集到此为止决策树也停止生长。决策树生长与迭代运算此前我们说到决策树的生长过程本质上也是在进行迭代运算我们根据上一轮的到的结论数据集划分情况作为基础条件来寻找子数据集的最佳分类规则然后来进行数据集划分以此往复。既然是迭代运算那就必然需要讨论所有迭代运算都需要考虑的两个问题其一是每一轮的迭代目标、其二是迭代收敛条件。首先是每一轮迭代计算的目标在梯度下降的计算过程中每一轮迭代其实都是为了能够更大程度上降低损失函数值在 K-Means 快速聚类中每一轮迭代其实都是为了能够尽快降低组内误差平方和SSE。而在决策树的建模过程中每一轮迭代实际上是为了更快速的降低基尼系数也就是希望这一轮划分出来的子数据集纯度尽可能高从而说明该规则会对分类更加有效。因此如果我们可以将每一轮迭代过程中父类的基尼系数看成是损失函数值树的迭代生长过程就是为了能够更快速的降低父类的基尼系数值。其次就是迭代计算的收敛条件。对于此前我们所介绍的收敛条件其实也同样适用于决策树模型例如当两轮迭代损失函数的差值小于某个值、或者直接限制最大迭代次数其实都是可以用于决策树模型的。此时所谓两轮迭代的损失值小于某个值就停止迭代其实就等价于如果进一步的划分数据集、但基尼系数的减少少于某个值就暂时不做划分而最大迭代次数其实就相当于树模型的最高生长层数。
2. CART 树的剪枝
和逻辑回归不同决策树在不进行特征衍生时就是一个分类效力更强的模型因此其本身就是一个更容易过拟合的模型。并且通过观察我们不难发现决策树生长的层数越多就表示树模型越复杂此时模型结构风险就越高、模型越容易过拟合。因此很多时候如果我们不对树的生长进行任何约束即如果设置的收敛条件较为严格例如要求最终基尼系数全为 0并且最大迭代次数不进行限制则很有可能容易过拟合。因此在决策树的建模流程当中有非常重要的一个环节就是需要讨论限制决策树模型过拟合倾向的方法。当然不同决策树算法的剪枝策略也各有不同总的来说树模型的剪枝分为两种其一在模型生长前就限制模型生长这种方法也被称为预剪枝或者盆栽法而另外一种方法则是先让树模型尽可能的生长然后再进行剪枝这种方法也被称为后剪枝或者修建法。从算法的原生原理来讲目前主流的 C4.5 和 CART 树都采用的是后剪枝的方法其中 C4.5 是通过计算叶节点的期望错误率一种区间估计的方法来进行剪枝而 CART 树则是通过类似正则化的方法在损失函数基尼系数计算函数中加入结构复杂度的惩罚因子来进行剪枝。不过无论采用何种方式来进行剪枝最终的结果都是通过控制树的结构复杂度来抑制过拟合倾向而树模型的结构复杂度其实完全可以用树的层数、每一层分叉的节点数来表示即内部节点和叶节点的数量来表示。因此我们也完全可以不采用这些树模型原生原理的方式来进行剪枝而是直接将这些决定树模型的复杂度的因素视作超参数然后通过网格搜索的方式来直接确定泛化能力最强的树模型结构。当然这也是 sklearn 中进行决策树剪枝的一般策略。
二、CART 分类树的 Scikit-Learn 快速实现方法与评估器参数详解
1. CART 分类树的 sklearn 快速实现
接下来我们尝试在 Scikit-Learn 中构建分类树模型。在 sklearn 中回归树和分类树是两个不同的评估器都在 sklearn.tree 模块内我们可以通过如下方式进行导入
from sklearn.tree import DecisionTreeClassifier,DecisionTreeRegressor然后尝试围绕上述简单例子进行快速建模试验
# 准备数据集
X np.array([[1, 1], [2, 2], [2, 1], [1, 2], [1, 1], [1, 2], [1, 2], [2, 1]])
y np.array([0, 0, 0, 1, 0, 1, 1, 0])# 调用决策树评估器并进行训练
clf DecisionTreeClassifier().fit(X, y)clf.score(X, y)
#1.0当然对于树模型来说我们不仅需要查看模型最终结果的评估指标很多时候我们还希望能够观察到树模型分类过程的树状图即类似于此前我们手动绘制的树状图。根据 sklearn 说明文档中的介绍此处我们可以借助 sklearn.tree 模块下的 plot_tree 函数直接输入训练好的评估器即可进行绘制plot_tree 绘制树状图
# 首先导入tree模块
from sklearn import tree# 然后调用plot_tree函数进行绘制
plt.figure(figsize(6, 2), dpi150)
tree.plot_tree(clf)#[Text(279.0, 188.75, X[1] 1.5\ngini 0.469\nsamples 8\nvalue [5, 3]),
# Text(139.5, 113.25, gini 0.0\nsamples 4\nvalue [4, 0]),
# Text(418.5, 113.25, X[0] 1.5\ngini 0.375\nsamples 4\nvalue [1, 3]),
# Text(279.0, 37.75, gini 0.0\nsamples 3\nvalue [0, 3]),
# Text(558.0, 37.75, gini 0.0\nsamples 1\nvalue [1, 0])]由于 plot_tree 是 sklearn 中已经集成好的函数因此调用过程非常简单我们只需要输入训练好的分类树评估器即可。同时根据输出的结果可知sklearn 中分类树的建模过程和此前我们手动哦实现的过程是一样的先根据第一个特征的不同取值进行数据集划分然后在根据第二个特征的不同取值进行数据集划分最终形成一个三个叶节点、两层的决策树模型。当然sklearn 中的评估器使用过程基本一致决策树模型评估器的简单使用也非常类似于逻辑回归评估器。此外由于 sklearn 中优秀的参数默认值设置使得很多时候我们直接使用其默认值就能完成不错的建模结果。接下来我们详细讨论决策树评估器中的相关参数借此讨论关于 sklearn 中的决策树剪枝方法。
2. CART 分类树评估器的参数详解
实际上 DecisionTreeClassifier 评估器参数众多并且大多和决策树的模型结构相关
DecisionTreeClassifier?NameDescriptioncriterion规则评估指标或损失函数默认基尼系数可选信息熵splitter树模型生长方式默认以损失函数取值减少最快方式生长可选随机根据某条件进行划分max_depth树的最大生长深度类似max_iter即总共迭代几次min_samples_split内部节点再划分所需最小样本数min_samples_leaf叶节点包含最少样本数min_weight_fraction_leaf叶节点所需最小权重和max_features在进行切分时候最多带入多少个特征进行划分规则挑选random_state随机数种子max_leaf_nodes叶节点最大个数min_impurity_decrease数据集再划分至少需要降低的损失值min_impurity_split数据集再划分所需最低不纯度将在0.25版本中移除class_weight各类样本权重presort已在0.24版本中移除ccp_alpha在执行CART树原生原理中的剪枝流程时结构复杂度惩罚因子的系数默认情况下不使用该方法进行剪枝
接下来围绕一些重点参数进行详细讲解1 criterion不纯度衡量指标首先我们发现尽管 sklearn 的树模型在默认情况下是 CART 树但同样支持使用信息熵来衡量不纯度。不过需要注意的是哪怕我们在 criterion 参数中选择信息熵实际树模型的建模过程也不是按照 ID3 或者 C4.5 的流程执行此时的树模型只能算是一种混合模型。而关于到底应该选择哪个指标来衡量数据集的不纯度其实大多数情况下选择哪个指标并不会实质影响树模型的结构但相比信息熵基尼系数复杂度更低、计算速度更快一般情况下推荐使用基尼系数。而如果一定要寻找二者在使用上的不同一般认为在有些情况下基尼不纯度更倾向于在数据集中分割出多数类而信息熵则更倾向于生成出更加平衡的树。2 ccp_alpha结构风险权重ccp 是复杂度剪枝Cost-Complexity Pruning的简称这是一个在 sklearn 的 0.22 版本中才加入的参数这也是唯一一个为实现 CART 原生原理中的剪枝过程所设置的参数。此处首先需要知道的是在 sklearn 中并不一定要通过该方法进行剪枝因此该参数其实也并不是一个必选参数。其次带有 ccp 项的剪枝也被称为最小复杂度剪枝其原理是在决策树的损失函数上加上一个结构风险项类似于正则化项在线性方程的损失函数中作用相同。我们可以设 T 为某决策树R(T)R(T)R(T) 为决策树在训练集上整体不纯度即代表模型的经验风险令 α∣T~∣\alpha|\widetilde{T}|α∣T∣ 表示模型结构风险其中 α\alphaα 为参数∣T~∣|\widetilde{T}|∣T∣ 为树的叶节点数量则我们可以修改模型损失函数如下Rα(T)R(T)α∣T~∣R_\alpha(T) R(T) \alpha|\widetilde{T}|Rα(T)R(T)α∣T∣其中 Rα(T)R_\alpha(T)Rα(T) 就是加入风险结构项后的损失函数而 α\alphaα 则是风险结构项的系数。由此可知α\alphaα 取值越大、对模型的结构风险惩罚力度就越大、模型结构就越简单、过拟合就能够被更好的抑制反之亦反。控制树结构的参数类接下来就是关于控制树模型结构的相关参数同时这也是最多的一类参数。这类参数可以进一步细分成两类其一是限制模型整体结构主要包括限制树深度的 max_depth 参数和限制叶节点数量的 max_leaf_nodes 参数。此外第二类就是限制树生长的参数包括从节点样本数量限制树生长的参数包括 min_samples_split、min_samples_leaf 两个参数当然也有从损失值降低角度出发限制树生长的参数包括 min_impurity_split和min_impurity_decrease 参数。通过这些参数的共同作用可以从各角度有效限制树的生长。注意所谓树的最大深度指的是树的最多生长几层或者除了根节点外总共有几层并不是树的总共的层数。此处需要重点说明的是对于树模型来说叶节点太多、单独叶节点所包含的样本数量太少、内部节点再划分降低的基尼系数较少都是可能是过拟合的表现在建模时尤其需要注意。并且需要知道的是sklearn 中在计算父节点和子节点的基尼系数或信息熵的差值时会在计算结果的前面乘以一个父节点占根节点数据量比例的系数作为最终 impurity_decrease 的结果 而这会导致样本比较少的某节点哪怕再划分时子节点纯度提升更高但由于当前节点样本较少因此 impurity_decrease 数值较低。这其实也是一种为了防止过拟合而采取的措施。控制迭代随机过程的参数类最后还有一类参数值得注意那就是关于控制建模过程中随机性的一些参数主要包含两个其一是 splitter 参数当该参数取值为 random 时其实是随机挑选分类规则对当前数据集进行划分其二是 max_features该参数可以任意设置最多带入几个特征进行备选规律挖掘只要该参数的设置不是带入全部特征进行建模就相当于是给备选特征随机划个范围也相当于是给树模型的训练增加了一定的随机性。