Python Data Science: Decision Tree

Algorithm in decision tree

Posted by Mengran on January 10, 2022

Decision Tree

Decision Tree: It will go through two stages: Constructing(构造) and Pruning(剪枝).

Constructing 构造

构造就是生成一棵完整的决策树。 构造的过程就是选择什么属性作为节点的过程。

在构造过程中,会存在三种节点:

  • 根节点:就是树的最顶端,最开始的那个节点。在上图中,“天气”就是一个根节点
  • 内部节点:就是树中间的那些节点,比如说“温度”、“湿度”、“刮风”
  • 叶节点:就是树最底部的节点,也就是决策结果(RESULT)

PARENTING: 节点之间存在父子关系。比如根节点会有子节点,子节点会有子子节点,但是到了叶节点就停止了,叶节点不存在子节点

While constructing a decision tree, you need to consider:

  • 选择哪个属性作为根节点
  • 选择哪些属性作为子节点
  • 什么时候停止并得到目标状态,即叶节点

Pruning 剪枝

Pruning: 剪枝就是给决策树瘦身,这一步想实现的目标就是,不需要太多的判断,同样可以得到不错的结果。这是为了防止“过拟合”(Overfitting)现象。

Overfitting: 模型的训练结果“太好了”,以至于在实际应用的过程中,会存在“死板”的情况,导致分类错误。

Why overfitting happened? 训练集中样本量较小!

  • 如果决策树选择的属性过多,构造出来的决策树一定能够“完美”地把训练集中的样本分类
  • 但是这会把训练集中一些数据的特点当成所有数据的特点,但这个特点不一定是全部数据的特点
  • 这就使得这个决策树在真实的数据分类中出现错误,也就是模型的“泛化能力”差。

泛化能力: 分类器是通过训练集抽象出来的分类能力,即举一反三的能力。 如果我们太依赖于训练集的数据,那么得到的决策树容错率就会比较低,泛化能力差。 因为训练集只是全部数据的抽样,并不能体现全部数据的特点。

df['age'].fillna(df['age'].mean(), inplace=True)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pandas as pd
from pandas import DataFrame
import numpy as np

df = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'age': [23, 19, np.nan, 25, 44]})

df['age'].fillna(df['age'].mean(), inplace=True)

print(df)

>>>
       name    age
0  ZhangFei  23.00
1    GuanYu  19.00
2         a  27.75
3         b  25.00
4         c  44.00