一文理解决策树:原理、数学公式与全流程实战讲解

一、背景与来源

决策树(Decision Tree)是一种常见的机器学习算法,主要用于分类和回归问题。其概念来源于统计学和决策论,能够直观地模拟人类的决策过程。最早的决策树算法之一是 1963 年由 Hunt 等人提出的,该算法逐渐发展成为今天的多种改进版本,如 ID3、C4.5、CART 等。

决策树的核心思想是通过递归地将数据集划分为多个子集,形成树状结构。每个内部节点代表一个特征的决策,每个叶子节点则是决策结果(分类或回归值)。

二、数学原理

决策树的构建主要基于“信息增益”(Information Gain)或“基尼不纯度”(Gini Impurity)等指标。其核心思想是逐步选择最佳的特征来划分数据集,从而构建出能够最好地分类或回归的树。

  • 信息增益:表示某个特征对分类结果的不确定性的减少量,公式为:

    信息增益 = 熵 ( D ) − ∑ i ∣ D i ∣ ∣ D ∣ ⋅ 熵 ( D i ) \text{信息增益} = \text{熵}(D) - \sum_{i} \frac{|D_i|}{|D|} \cdot \text{熵}(D_i) 信息增益=(D)iDDi(Di)
    其中,熵(Entropy)是衡量数据集混乱程度的指标,定义为:

    熵 ( D ) = − ∑ i = 1 n p i log ⁡ 2 ( p i ) \text{熵}(D) = - \sum_{i=1}^n p_i \log_2(p_i) (D)=i=1npilog2(pi)
    p i p_i pi 表示类别 i i i 的概率。

  • 基尼不纯度:基尼不纯度用于衡量一个数据集在某特征下的不纯度,定义为:

    G ( D ) = 1 − ∑ i = 1 n p i 2 G(D) = 1 - \sum_{i=1}^{n} p_i^2 G(D)=1i=1npi2
    p i p_i pi 仍表示类别 i i i 的概率。基尼不纯度越低,数据集越“纯”。

三、 决策树的构建流程

决策树的构建过程可以分为四个主要步骤,按照递归的方式生成树的结构,直到满足终止条件。构建决策树的核心是基于数据集的特征,逐步选择最优特征来进行数据的划分,从而产生不同的子集,直至满足某个停止条件。

1. 选择最优特征

首先,决策树通过选择具有最高信息增益(或最小基尼不纯度)的特征来划分数据。信息增益越大,表示该特征越能有效减少不确定性,从而更好地划分数据。

2. 划分数据集

选择一个特征后,决策树会根据该特征的不同取值将数据集分成不同的子集。对于每一个子集,递归重复选择最优特征来划分数据。

3. 递归生成子树

在每一次划分后,决策树会对子集递归地继续进行相同的过程,直到满足某些停止条件为止:

  • 终止条件 1:当前节点的样本都属于同一个类别。此时,不再需要进一步划分。
  • 终止条件 2:属性集合为空,或样本在所有属性上取值都相同。此时,无法继续划分,将此节点设置为叶子节点,类别为当前子集中样本最多的类别。
  • 终止条件 3:样本集为空。此时,用父节点中最多的类别作为预测值。

4. 剪枝(可选)

为了防止决策树过拟合,有时需要进行剪枝操作。剪枝的过程是去除不必要的分支,保留重要的决策节点,从而提高模型的泛化能力。

剪枝的原因

决策树是一种贪心算法,倾向于不断细化树的每个分支,直到所有数据都被分开。尽管这种方法能够在训练集上取得较好的准确率,但它也容易导致模型过度复杂,从而难以在新的数据上做出准确的预测。这就是过拟合现象。

为了解决这个问题,剪枝通过去除那些对整体预测贡献较小的分支来简化决策树,从而提升模型在新数据上的表现。

剪枝的两种方式

剪枝可以分为两种类型:预剪枝和后剪枝。

(1) 预剪枝(Pre-pruning)

预剪枝是在构建决策树的过程中进行剪枝。具体做法是在划分节点时,提前判断是否需要继续分裂。只有当进一步的分裂能够显著提升模型性能时,才会进行划分,否则将终止划分。这种方法可以减少树的高度,防止生成过于复杂的决策树。

  • 预剪枝的判断标准:
    • 信息增益阈值:如果节点划分带来的信息增益低于某个设定的阈值,则停止划分。
    • 样本数量:当某个节点中的样本数少于某个设定的最小样本数时,停止进一步划分。
    • 树的深度:限制树的最大深度,防止树过深导致过拟合。

优点:预剪枝可以有效减少训练时间,因为它避免了生成过于复杂的树。
缺点:预剪枝有时会过早停止分裂,导致模型的表现不如预期。

(2) 后剪枝(Post-pruning)

后剪枝是在生成完整的决策树之后再进行剪枝。该方法首先构建出一棵完整的决策树,然后从底部开始回溯,判断是否需要将某些子树替换为叶节点,从而简化模型。

  • 后剪枝的过程:
    1. 从树的叶节点开始回溯,计算每个非叶节点的误差率。
    2. 如果将一个子树替换为叶节点后的误差率降低或变化不大,则进行剪枝。
    3. 重复这一过程,直到不能进一步剪枝。

优点:后剪枝在生成了完全拟合数据的决策树后再进行简化,因此能够避免预剪枝过早停止分裂的问题。
缺点:由于要先构建出一棵完整的决策树,后剪枝的计算成本较高。

剪枝的具体方法

剪枝的目的是减少不必要的分支,通常有几种常见的剪枝技术:

(1) 基于误差的剪枝

在这种方法中,使用 交叉验证 或独立的验证集来评估决策树中每个子树的表现。

具体来说,剪枝的过程是先考虑将一个子树替换为叶节点,计算这种简化后的误差。如果这个替换操作不会显著增加决策树在验证集上的预测误差,那么就进行剪枝操作,否则保留子树。

这种方法的优势在于它通过 独立数据集 的验证,确保剪枝不会过度简化模型。

(2) 最小误差剪枝(Minimal Error Pruning)

最小误差剪枝的核心思想是对比子树和替换为叶节点后的误差率。如果将某个子树替换为叶节点能够减少整体误差率,那么这个子树就可以被剪掉。

误差的衡量标准可以使用均方误差(MSE)或其他相关的损失函数。这种剪枝方法注重减少每一步操作的误差,以提高模型的性能。

(3) 代价复杂度剪枝(Cost Complexity Pruning)

代价复杂度剪枝是CART算法中常用的一种剪枝方法。它通过引入一个代价函数来平衡决策树的复杂度与其对数据拟合的效果。代价复杂度剪枝的目标是最小化以下函数:
R α ( T ) = R ( T ) + α × ∣ T ∣ R_{\alpha}(T) = R(T) + \alpha \times |T| Rα(T)=R(T)+α×T
其中:

  • R ( T ) R(T) R(T) 是子树 T T T 在训练集上的误差;
  • ∣ T ∣ |T| T 是树的叶节点数(即树的复杂度);
  • α \alpha α 是惩罚参数,用于控制误差和复杂度之间的平衡。

通过调节参数 α \alpha α,可以找到最佳的剪枝程度,即在保证模型预测能力的前提下,尽可能地减少树的复杂度。较大的 α \alpha α 会倾向于生成较小的树,而较小的 α \alpha α 则允许生成更复杂的树。

这种方法有效防止了决策树在训练集上过拟合,同时保留了重要的结构信息。


实例分析:使用 ID3 算法构建决策树

我们将通过一个实际的例子来解释决策树的构建过程。

数据集

假设我们有如下数据集,包含了天气相关的信息以及是否适合进行户外活动的判断(“Yes” or “No”)。数据集有以下 4 个特征:

  1. 天气(Outlook):有 3 种取值:Sunny、Overcast、Rainy
  2. 温度(Temperature):有 3 种取值:Hot、Mild、Cool
  3. 湿度(Humidity):有 2 种取值:High、Normal
  4. 风速(Wind):有 2 种取值:Weak、Strong

数据表

IndexOutlookTemperatureHumidityWindPlay Tennis
1SunnyHotHighWeakNo
2SunnyHotHighStrongNo
3OvercastHotHighWeakYes
4RainyMildHighWeakYes
5RainyCoolNormalWeakYes
6RainyCoolNormalStrongNo
7OvercastCoolNormalStrongYes
8SunnyMildHighWeakNo
9SunnyCoolNormalWeakYes
10RainyMildNormalWeakYes
11SunnyMildNormalStrongYes
12OvercastMildHighStrongYes
13OvercastHotNormalWeakYes
14RainyMildHighStrongNo

目标是根据特征预测是否适合 “Play Tennis”(即 “Yes” 或 “No”)。


决策树构建步骤

Step 1:计算熵(Entropy)

首先,我们需要计算 整个数据集 的熵。熵是衡量数据集混乱程度的一个指标。它的公式如下:

熵 ( D ) = − ∑ i = 1 n p i log ⁡ 2 ( p i ) \text{熵}(D) = -\sum_{i=1}^n p_i \log_2(p_i) (D)=i=1npilog2(pi)

其中, p i p_i pi 表示数据集中每一类的概率。

在这个例子中,数据集中有 9 个 “Yes” 和 5 个 “No”,因此:

p Yes = 9 14 , p No = 5 14 p_{\text{Yes}} = \frac{9}{14}, \quad p_{\text{No}} = \frac{5}{14} pYes=149,pNo=145

H ( D ) H(D) H(D) 为:

H ( D ) = − ( 9 14 log ⁡ 2 9 14 + 5 14 log ⁡ 2 5 14 ) = − ( 0.643 × log ⁡ 2 0.643 + 0.357 × log ⁡ 2 0.357 ) = 0.940 H(D) = -\left( \frac{9}{14} \log_2 \frac{9}{14} + \frac{5}{14} \log_2 \frac{5}{14} \right) = - \left( 0.643 \times \log_2 0.643 + 0.357 \times \log_2 0.357 \right) = 0.940 H(D)=(149log2149+145log2145)=(0.643×log20.643+0.357×log20.357)=0.940

Step 2:计算每个特征的信息增益
1. 天气(Outlook)

有三种可能的取值:Sunny、Overcast、Rainy。我们将根据这些取值划分数据集,然后计算每个子集的熵,并求出信息增益。

  • Sunny

    • 类别:3 个 “No”,2 个 “Yes”
    • 熵: H ( S u n n y ) = − ( 3 5 log ⁡ 2 3 5 + 2 5 log ⁡ 2 2 5 ) = 0.971 H(Sunny) = -\left( \frac{3}{5} \log_2 \frac{3}{5} + \frac{2}{5} \log_2 \frac{2}{5} \right) = 0.971 H(Sunny)=(53log253+52log252)=0.971
  • Overcast

    • 类别:4 个全是 “Yes”
    • 熵: H ( O v e r c a s t ) = 0 (纯数据集) H(Overcast) = 0 \quad (纯数据集) H(Overcast)=0(纯数据集)
  • Rainy

    • 类别:3 个 “Yes”,2 个 “No”
    • 熵: H ( R a i n y ) = − ( 3 5 log ⁡ 2 3 5 + 2 5 log ⁡ 2 2 5 ) = 0.971 H(Rainy) = -\left( \frac{3}{5} \log_2 \frac{3}{5} + \frac{2}{5} \log_2 \frac{2}{5} \right) = 0.971 H(Rainy)=(53log253+52log252)=0.971

加权平均熵

H ( Outlook ) = 5 14 × 0.971 + 4 14 × 0 + 5 14 × 0.971 = 0.693 H(\text{Outlook}) = \frac{5}{14} \times 0.971 + \frac{4}{14} \times 0 + \frac{5}{14} \times 0.971 = 0.693 H(Outlook)=145×0.971+144×0+145×0.971=0.693

信息增益

信息增益 ( O u t l o o k ) = H ( D ) − H ( O u t l o o k ) = 0.940 − 0.693 = 0.247 \text{信息增益}(Outlook) = H(D) - H(Outlook) = 0.940 - 0.693 = 0.247 信息增益(Outlook)=H(D)H(Outlook)=0.9400.693=0.247

2. 温度(Temperature)

取值有:Hot、Mild、Cool。我们对每个子集计算熵。

  • Hot

    • 类别:2 个 “No”,1 个 “Yes”
    • 熵: H ( H o t ) = − ( 2 3 log ⁡ 2 2 3 + 1 3 log ⁡ 2 1 3 ) = 0.918 H(Hot) = -\left( \frac{2}{3} \log_2 \frac{2}{3} + \frac{1}{3} \log_2 \frac{1}{3} \right) = 0.918 H(Hot)=(32log232+31log231)=0.918
  • Mild

    • 类别:2 个 “No”,4 个 “Yes”
    • 熵: H ( M i l d ) = − ( 2 6 log ⁡ 2 2 6 + 4 6 log ⁡ 2 4 6 ) = 0.918 H(Mild) = -\left( \frac{2}{6} \log_2 \frac{2}{6} + \frac{4}{6} \log_2 \frac{4}{6} \right) = 0.918 H(Mild)=(62log262+64log264)=0.918
  • Cool

    • 类别:1 个 “No”,3 个 “Yes”
    • 熵: H ( C o o l ) = − ( 1 4 log ⁡ 2 1 4 + 3 4 log ⁡ 2 3 4 ) = 0.811 H(Cool) = -\left( \frac{1}{4} \log_2 \frac{1}{4} + \frac{3}{4} \log_2 \frac{3}{4} \right) = 0.811 H(Cool)=(41log241+43log243)=0.811

加权平均熵:

H ( Temperature ) = 3 14 × 0.918 + 6 14 × 0.918 + 4 14 × 0.811 = 0.889 H(\text{Temperature}) = \frac{3}{14} \times 0.918 + \frac{6}{14} \times 0.918 + \frac{4}{14} \times 0.811 = 0.889 H(Temperature)=143×0.918+146×0.918+144×0.811=0.889

信息增益

信息增益 ( Temperature ) = 0.940 − 0.889 = 0.051 \text{信息增益}(\text{Temperature}) = 0.940 - 0.889 = 0.051 信息增益(Temperature)=0.9400.889=0.051

3. 湿度(Humidity)

取值有:High、Normal。

  • High
    • 类别:4 个 “No”,2 个 “Yes”
    • 熵:$$
      H(High) = -\left( \frac{4}{6} \log_2 \frac{4}{6

} + \frac{2}{6} \log_2 \frac{2}{6} \right) = 0.918
$$

  • Normal
    • 类别:1 个 “No”,6 个 “Yes”
    • 熵: H ( N o r m a l ) = − ( 1 7 log ⁡ 2 1 7 + 6 7 log ⁡ 2 6 7 ) = 0.592 H(Normal) = -\left( \frac{1}{7} \log_2 \frac{1}{7} + \frac{6}{7} \log_2 \frac{6}{7} \right) = 0.592 H(Normal)=(71log271+76log276)=0.592

加权平均熵:

H ( Humidity ) = 6 14 × 0.918 + 7 14 × 0.592 = 0.788 H(\text{Humidity}) = \frac{6}{14} \times 0.918 + \frac{7}{14} \times 0.592 = 0.788 H(Humidity)=146×0.918+147×0.592=0.788

信息增益

信息增益 ( Humidity ) = 0.940 − 0.788 = 0.152 \text{信息增益}(\text{Humidity}) = 0.940 - 0.788 = 0.152 信息增益(Humidity)=0.9400.788=0.152

4. 风速(Wind)

取值有:Weak、Strong。

  • Weak

    • 类别:2 个 “No”,6 个 “Yes”
    • 熵: H ( W e a k ) = − ( 2 8 log ⁡ 2 2 8 + 6 8 log ⁡ 2 6 8 ) = 0.811 H(Weak) = -\left( \frac{2}{8} \log_2 \frac{2}{8} + \frac{6}{8} \log_2 \frac{6}{8} \right) = 0.811 H(Weak)=(82log282+86log286)=0.811
  • Strong

    • 类别:3 个 “No”,3 个 “Yes”
    • 熵: H ( S t r o n g ) = − ( 3 6 log ⁡ 2 3 6 + 3 6 log ⁡ 2 3 6 ) = 1.000 H(Strong) = -\left( \frac{3}{6} \log_2 \frac{3}{6} + \frac{3}{6} \log_2 \frac{3}{6} \right) = 1.000 H(Strong)=(63log263+63log263)=1.000

加权平均熵:

H ( Wind ) = 8 14 × 0.811 + 6 14 × 1.000 = 0.892 H(\text{Wind}) = \frac{8}{14} \times 0.811 + \frac{6}{14} \times 1.000 = 0.892 H(Wind)=148×0.811+146×1.000=0.892

信息增益

信息增益 ( Wind ) = 0.940 − 0.892 = 0.048 \text{信息增益}(\text{Wind}) = 0.940 - 0.892 = 0.048 信息增益(Wind)=0.9400.892=0.048

Step 3:选择最优特征

通过计算每个特征的信息增益,我们得到:

  • Outlook 的信息增益:0.247
  • Temperature 的信息增益:0.051
  • Humidity 的信息增益:0.152
  • Wind 的信息增益:0.048

最优特征是 Outlook,因为它具有最高的信息增益(0.247)。因此,我们将 Outlook 作为根节点进行划分。

第一轮划分(根节点:Outlook

我们已经根据 Outlook 将数据集分为三个子集:

  • Sunny 子集:

    IndexOutlookTemperatureHumidityWindPlay Tennis
    1SunnyHotHighWeakNo
    2SunnyHotHighStrongNo
    8SunnyMildHighWeakNo
    9SunnyCoolNormalWeakYes
    11SunnyMildNormalStrongYes
  • Overcast 子集:

    IndexOutlookTemperatureHumidityWindPlay Tennis
    3OvercastHotHighWeakYes
    7OvercastCoolNormalStrongYes
    12OvercastMildHighStrongYes
    13OvercastHotNormalWeakYes
  • Rainy 子集:

    IndexOutlookTemperatureHumidityWindPlay Tennis
    4RainyMildHighWeakYes
    5RainyCoolNormalWeakYes
    6RainyCoolNormalStrongNo
    10RainyMildNormalWeakYes
    14RainyMildHighStrongNo
Sunny 子集递归划分

对于 Sunny 子集,我们需要重新计算剩余特征(TemperatureHumidityWind)的信息增益,选择最优特征进行下一步划分。

  • Sunny 子集熵
    • 类别:3 个 “No”,2 个 “Yes”
    • 总熵: H ( S u n n y ) = − ( 3 5 log ⁡ 2 3 5 + 2 5 log ⁡ 2 2 5 ) = 0.971 H(Sunny) = -\left( \frac{3}{5} \log_2 \frac{3}{5} + \frac{2}{5} \log_2 \frac{2}{5} \right) = 0.971 H(Sunny)=(53log253+52log252)=0.971
1. 计算 Temperature 的信息增益

Sunny 子集中,Temperature 有三个取值:Hot、Mild、Cool。

  • Hot:2 个 “No”
    • 熵: H ( H o t ) = − ( 2 2 log ⁡ 2 2 2 ) = 0 H(Hot) = -\left( \frac{2}{2} \log_2 \frac{2}{2} \right) = 0 H(Hot)=(22log222)=0
  • Mild:1 个 “No”,1 个 “Yes”
    • 熵: H ( M i l d ) = − ( 1 2 log ⁡ 2 1 2 + 1 2 log ⁡ 2 1 2 ) = 1 H(Mild) = -\left( \frac{1}{2} \log_2 \frac{1}{2} + \frac{1}{2} \log_2 \frac{1}{2} \right) = 1 H(Mild)=(21log221+21log221)=1
  • Cool:1 个 “Yes”
    • 熵: H ( C o o l ) = − ( 1 1 log ⁡ 2 1 1 ) = 0 H(Cool) = -\left( \frac{1}{1} \log_2 \frac{1}{1} \right) = 0 H(Cool)=(11log211)=0

加权平均熵:

H ( Temperature ) = 2 5 × 0 + 2 5 × 1 + 1 5 × 0 = 0.4 H(\text{Temperature}) = \frac{2}{5} \times 0 + \frac{2}{5} \times 1 + \frac{1}{5} \times 0 = 0.4 H(Temperature)=52×0+52×1+51×0=0.4

信息增益

信息增益 ( Temperature ) = 0.971 − 0.4 = 0.571 \text{信息增益}(\text{Temperature}) = 0.971 - 0.4 = 0.571 信息增益(Temperature)=0.9710.4=0.571

2. 计算 Humidity 的信息增益

Humidity 有两个取值:High 和 Normal。

  • High:3 个 “No”
    • 熵: H ( H i g h ) = − ( 3 3 log ⁡ 2 3 3 ) = 0 H(High) = -\left( \frac{3}{3} \log_2 \frac{3}{3} \right) = 0 H(High)=(33log233)=0
  • Normal:2 个 “Yes”
    • 熵: H ( N o r m a l ) = − ( 2 2 log ⁡ 2 2 2 ) = 0 H(Normal) = -\left( \frac{2}{2} \log_2 \frac{2}{2} \right) = 0 H(Normal)=(22log222)=0

加权平均熵:

H ( Humidity ) = 3 5 × 0 + 2 5 × 0 = 0 H(\text{Humidity}) = \frac{3}{5} \times 0 + \frac{2}{5} \times 0 = 0 H(Humidity)=53×0+52×0=0

信息增益

信息增益 ( Humidity ) = 0.971 − 0 = 0.971 \text{信息增益}(\text{Humidity}) = 0.971 - 0 = 0.971 信息增益(Humidity)=0.9710=0.971

3. 计算 Wind 的信息增益

Wind 有两个取值:Weak 和 Strong。

  • Weak:2 个 “No”,1 个 “Yes”
    • 熵: H ( W e a k ) = − ( 2 3 log ⁡ 2 2 3 + 1 3 log ⁡ 2 1 3 ) = 0.918 H(Weak) = -\left( \frac{2}{3} \log_2 \frac{2}{3} + \frac{1}{3} \log_2 \frac{1}{3} \right) = 0.918 H(Weak)=(32log232+31log231)=0.918
  • Strong:1 个 “No”,1 个 “Yes”
    • 熵: H ( S t r o n g ) = − ( 1 2 log ⁡ 2 1 2 + 1 2 log ⁡ 2 1 2 ) = 1 H(Strong) = -\left( \frac{1}{2} \log_2 \frac{1}{2} + \frac{1}{2} \log_2 \frac{1}{2} \right) = 1 H(Strong)=(21log221+21log221)=1

加权平均熵:

H ( Wind ) = 3 5 × 0.918 + 2 5 × 1 = 0.951 H(\text{Wind}) = \frac{3}{5} \times 0.918 + \frac{2}{5} \times 1 = 0.951 H(Wind)=53×0.918+52×1=0.951

信息增益

信息增益 ( Wind ) = 0.971 − 0.951 = 0.020 \text{信息增益}(\text{Wind}) = 0.971 - 0.951= 0.020 信息增益(Wind)=0.9710.951=0.020

选择最优特征

通过比较 Sunny 子集中各特征的信息增益,Humidity 拥有最高的信息增益(0.971),因此选择 Humidity 作为划分标准。将 Sunny 子集按照 Humidity 划分成两个子集。

  • High 子集:全部为 “No”,直接作为叶节点,标记为 “No”。
  • Normal 子集:全部为 “Yes”,直接作为叶节点,标记为 “Yes”。

此时,Sunny 子集的递归过程结束,节点结构如下:

Outlook = Sunny
    -> Humidity = High: No
    -> Humidity = Normal: Yes
Overcast 子集递归划分

对于 Overcast 子集:

IndexOutlookTemperatureHumidityWindPlay Tennis
3OvercastHotHighWeakYes
7OvercastCoolNormalStrongYes
12OvercastMildHighStrongYes
13OvercastHotNormalWeakYes

该子集中全部样本类别为 “Yes”,因此直接返回 “Yes” 作为该节点的叶节点。

Rainy 子集递归划分

对于 Rainy 子集,类似于对 Sunny 子集的划分,依次计算剩余特征的熵和信息增益,选择最优特征进行划分。最终的结构可能类似如下:

Outlook = Rainy
    -> Wind = Weak: Yes
    -> Wind = Strong: No

递归终止条件

递归过程需要满足一定的条件来停止继续划分。当满足以下任何一个条件时,递归过程会停止,当前节点会被标记为叶节点

终止条件 1:同一类别

如果某个子集中的所有样本都属于同一个类别,则无需继续划分,该节点直接标记为该类别的叶节点。例如,所有样本的类别都是 “Yes”,则该节点为 “Yes” 类别的叶节点。

终止条件 2:属性为空或样本在所有属性上的取值相同

如果子集中的样本在所有剩余属性上的取值相同,无法进一步划分。此时无法区分不同类别,直接返回该节点中多数类别作为该节点的预测类别。

举例说明:

  • 假设划分后的一个子集中,所有样本在 TemperatureHumidityWind 属性上取值完全相同,但类别不同。这种情况下,因为没有其他属性可以进一步区分样本,返回多数类别作为预测结果。
终止条件 3:样本集合为空

如果划分过程中某一分支没有样本(即子集为空),则无法继续划分。此时应返回父节点中的多数类别作为该分支的预测结果

最终决策树结构

根据递归划分过程,最终构建的决策树结构如下:

Outlook
├── Sunny
│   ├── Humidity = High: No
│   └── Humidity = Normal: Yes
├── Overcast: Yes
└── Rainy
    ├── Wind = Weak: Yes
    └── Wind = Strong: No
  • 根节点:Outlook:决策树首先根据 Outlook(天气)这个特征将数据集分成三个子集:
    • 如果 Outlook = Sunny,则进一步根据 Humidity 划分:
      • Humidity = High 时,预测为 “No”。
      • Humidity = Normal 时,预测为 “Yes”。
    • 如果 Outlook = Overcast,预测为 “Yes”。因为所有样本都是 “Yes”。
    • 如果 Outlook = Rainy,则进一步根据 Wind 划分:
      • Wind = Weak 时,预测为 “Yes”。
      • Wind = Strong 时,预测为 “No”。

总结

通过递归划分特征,决策树将复杂的分类问题逐步分解为简单的条件判断。我们使用信息增益选择最优特征,直到满足停止条件。最终生成的决策树结构直观、易解释,能够根据特征的不同取值来预测是否适合打网球。

决策树的构建过程清晰体现了数据集划分的逐步细化,通过特征选择、子集划分与递归处理,生成了一棵结构化的树来进行分类任务。这一模型不仅简洁直观,也为实际应用中的分类问题提供了强有力的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/901629.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 部署 mysql

Linux(四)- Ubuntu安装Mysql_mysql-community-server-core depends on libaio1 (>-CSDN博客 #创建用户 打开终端。 登录到MySQL服务器: mysql -u root -p 创建新用户。替换new_user为您想要的用户名,password为新用户的密码&am…

python异常监测-ARIMA(自回归积分滑动平均模型)

系列文章目录 Python异常检测- Isolation Forest(孤立森林) python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS) python异常检测-局部异常因子(LOF)算法 Python异常检测- DBSCAN Python异常检测- 单类支持向量机(…

python之数据结构与算法(数据结构篇)-- 元组

一、元组的概念 其实,所谓的“元组”就是一组不能改变的特殊数组(一般情况下),这里我们去创建一个“小羊元组”,大家就能更加明白其中的意思了。 二、元组实现思路 1.我们去定义一个“羊村小羊”的元组 # 创建一个"羊村小羊"的元…

SystemC学习(2)— APB_SRAM的建模与测试

SystemC学习(2)— APB_SRAM的建模与测试 一、前言 二、APB_SRAM建模 编写APB_SRAM模型文件apb_sram.h文件如下所示: #ifndef __APB_SRAM_H #define __APB_SRAM_H#include "systemc.h"const int ADDR_SIZE 32; const int DATA_…

【专题】计算机网络之数据链路层

数据链路层的地位:网络中的主机、路由器等都必须实现数据链路层。 数据链路层信道类型: 点对点信道。 使用一对一的点对点通信方式。 广播信道。 使用一对多的广播通信方式。 必须使用专用的共享信道协议来协调这些主机的数据发送。 1. 使用点对点信道…

三次握手与四次挥手

1.三次握手 1.1状态机 客户端 SYN_SENT:客户端发送SYN报文段请求建立连接 ESTABLISHED:在收到服务端发来的SYN请求报文以及确认报文后就建立客户端到服务端的连接 服务端 LISTEN:一开始时LISTEN状态,等待客户端的SYN请求 SY…

群晖系统基本命令

切换超级管理员 sudo -i 查询系统 运行的所有服务 synoservicecfg --list 启动服务命令(该命令需要使用超级管理员) #老版本群晖使用synoservice命令 synoservice --start 服务名称#新版本群晖使用systemctl命令 systemctl start 服务名称 synoservice所管理的服务配置文…

MySql数据库中数据类型

本篇将介绍在 MySql 中的所有数据类型,其中主要分为四类:数值类型、文本和二进制类型、时间日期、String 类型。如下(图片来源:MySQL数据库): 目录如下: 目录 数值类型 1. 整数类型 2. …

【网站项目】SpringBoot397学校财务管理系统

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

【论文阅读】SRGAN

学习资料 论文题目:基于生成对抗网络的照片级单幅图像超分辨率(Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network)论文地址:https://arxiv.org/abs/1609.04802 代码:GitHub - x…

【Python爬虫实战】Selenium自动化网页操作入门指南

#1024程序员节|征文# 🌈个人主页:易辰君-CSDN博客 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、准备工作 (一)安装 Selenium 库 &#xff0…

SpringBoot项目里怎么简单高效使用Redis?我选择使用Lock4j

文章目录 前言正文1、Lock4j的代码仓库2、pine-manage-common-redis的项目结构3、pine-manage-common-redis 的完整代码3.1 maven依赖:pom.xml3.2 redis连接参数:application.yaml3.3 RedisCache.java3.4 CacheConfig.java3.5 RedissonClientUtil.java3.…

Python | Leetcode Python题解之第509题斐波那契数

题目&#xff1a; 题解&#xff1a; class Solution:def fib(self, n: int) -> int:if n < 2:return nq [[1, 1], [1, 0]]res self.matrix_pow(q, n - 1)return res[0][0]def matrix_pow(self, a: List[List[int]], n: int) -> List[List[int]]:ret [[1, 0], [0, …

Redisson(三)应用场景及demo

一、基本的存储与查询 分布式环境下&#xff0c;为了方便多个进程之间的数据共享&#xff0c;可以使用RedissonClient的分布式集合类型&#xff0c;如List、Set、SortedSet等。 1、demo <parent><groupId>org.springframework.boot</groupId><artifact…

spygalss cdc 检测的bug(二)

当allow_qualifier_merge设置为strict的时候&#xff0c;sg是要检查门的极性的。 如果qualifier和src经过与门汇聚&#xff0c;在同另一个src1信号或门汇聚&#xff0c;sg是报unsync的。 假设当qualifier为0时&#xff0c;0&&src||src1src1&#xff0c;src1无法被gat…

Mysql入门3——多表操作、事务、索引

Mysql入门3——多表操作、事务、索引 一、多表设计 ​ 在项目开发中&#xff0c;在进行数据库表的结构设计时&#xff0c;会根据业务需求及业务模块之前的关系&#xff0c;分析并设计表的结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表之间也存在着各种关系&am…

基于SSM的智慧篮球馆预约系统

前言 近些年&#xff0c;随着中国经济发展&#xff0c;人民的生活质量逐渐提高&#xff0c;对网络的依赖性越来越高&#xff0c;通过网络处理的事务越来越多。随着智慧篮球馆预约的常态化&#xff0c;如果依然采用传统的管理方式&#xff0c;将会为工作人员带来庞大的工作量&a…

css设置滚动条样式

效果图&#xff1a; // 滚动条样式 div::-webkit-scrollbar {width: 4px; } /* 滚动条滑块&#xff08;里面小方块&#xff09; */ div::-webkit-scrollbar-thumb {border-radius: 10px;-webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);opacity: 0.2;background-color…

【面试经典150】day 8

#1024程序员节 | 征文# 作为一个未来的程序员&#xff0c;现在我要继续刷题了。 力扣时刻。 目录 1.接雨水 2.罗马数字转整数 3.最后一个单词的长度 4.最长公共前缀 5.反转字符串中的单词 1.接雨水 好好好好好好&#xff0c;一开始就接雨水。我记得接了n次了。。。 痛苦战…

【读书笔记·VLSI电路设计方法解密】问题25:为什么时钟如此重要

时钟是一种在高电平和低电平之间振荡的电信号。它通常是一个具有预定周期(频率)的方波,如图3.6所示。在同步数字电路中,时钟信号协调芯片上所有电路元件的动作。电路在时钟信号的上升沿、下降沿或两者的边缘处变为活动状态以实现同步。时钟信号相关问题是任何VLSI芯片设计中…