机器学习-决策树

目录

一、决策树概述

二、 决策树的原理

三、决策树的流程

 四、决策树的实现算法

4.1 信息熵(Information Entropy)和条件熵(conditional entropy)

4.2 信息增益(Gain)

4.3 信息增益率(Gain Ratio)

4.4 基尼指数(Gini Index )

五、剪枝处理 

5.1 预剪枝

5.2 后剪枝 

六、实现决策树 (信息增益和信息熵实现)

 6.1 代码的结果:

6.2 决策树的生成结果: 

一、决策树概述

      决策树(Decision Tree)是一种直观的决策分析方法,也是一种常用的分类方法。它利用树形图的形式,基于已知的各种情况发生概率,来求取净现值的期望值大于等于零的概率,进而评价项目的风险,并判断其可行性。

二、 决策树的原理

     决策树的原理主要基于归纳推理。归纳推理是一种从特殊到一般的过程,即从一组具体的事实、观察或数据中提炼出一般性规律或结论的方法。在决策树中,归纳推理体现在从训练数据集中学习并提取决策规则,这些规则能够用于对新数据进行分类或预测。

三、决策树的流程

     决策树的一般流程主要包括以下几个步骤:

  1. 数据收集:首先需要收集数据,这些数据将用于训练决策树模型。
  2. 数据准备:对数据进行预处理,包括数值型数据的离散化,因为树构造算法只适用于标称型数据。
  3. 分析数据:在构建树之前,可以通过各种方法对数据进行分析,以确保数据的质量和适用性。
  4. 选择最佳节点:在每个节点上,选择最佳的属性进行分割。这个选择基于某种标准,如信息增益或基尼不纯度,以使得分割后的数据尽可能纯净。
  5. 递归划分:从根节点开始,根据选定的属性对数据进行分割,生成子节点,并对每个子节点重复进行上述过程,直到满足停止条件。
  6. 剪枝处理:为了防止过拟合,决策树算法通常会采用剪枝策略,包括预剪枝和后剪枝。预剪枝是在构建过程中提前停止树的增长,而后剪枝则是在树完全生长后再去除部分子树。
  7. 类别预测:最终的类别预测是通过从根节点出发,根据每个内部节点的判断条件,沿着树走到叶节点得到的。每个叶节点代表了一个最终的分类结果。

 四、决策树的实现算法

4.1 信息熵(Information Entropy)和条件熵(conditional entropy)

        信息熵:这是衡量数据集纯度的一个标准,如果一个数据集包含多个类别的样本,其信息熵可以通过以下公式计算:

Ent(D) = -\sum_{k=1}^{|y|} p_k log_2 p_k

pk指的是第 k 类样本在数据集中所占的比例。

       条件熵:这表示在已知特征 ( X ) 的情况下数据集的熵。它衡量了在特征 ( X ) 的条件下,数据集的不确定性。计算条件熵需要首先根据特征 ( X ) 的不同取值将数据集划分为子集,然后对每个子集计算熵,并加权求和。

4.2 信息增益(Gain)

信息增益是决策树算法中用于特征选择的一个重要指标。它通过量化一个特征为分类系统带来的信息量来评估该特征的重要性。具体来说,信息增益反映了在划分数据集前后信息熵的变化。一个特征如果能使得信息熵大幅度减小,即带来较高的信息增益,那么这个特征在构建决策树时会被优先考虑。计算公式为:

[ \text{Gain} (Y, X) = H (Y) - H (Y|X) ]

4.3 信息增益率(Gain Ratio

信息增益率的引入是为了解决信息增益偏向于选择特征值较多的特征的问题。在决策树的构建过程中,特征选择是一个关键步骤,它直接影响到决策树的结构和预测性能。信息增益率通过考虑特征的信息熵来调整信息增益,从而避免对特征值数量的偏见。

信息增益率的计算公式可以表示为:

 信息增益率(Y,X)=text信息增益(Y,X)​/条件的信息熵(Y∣X)

4.4 基尼指数(Gini Index

基尼指数通过计算数据集中不同类别的样本分布情况来度量数据的纯度,是决策树进行特征选择的一个重要指标。

[ Gini(p) = 1 - \sum_{i=1}^{n} p_i^2 ]

其中,pi​ 表示第 i 类样本在数据集中所占的比例,n 是类别的总数。

五、剪枝处理 

5.1 预剪枝

预剪枝是在决策树生成过程中,提前结束树的分支生长。它的核心思想是在每次对结点进行进一步划分之前,先采用验证集的数据来验证划分是否能提高划分的准确性。如果不能提高准确性,就把结点标记为叶结点并停止进一步划分;如果可以,就继续递归生成节点。

优点:

可以有效降低过拟合现象,显著减少训练时间和测试时间,效率比后剪枝高。但缺点是预剪枝通过限制一些建树的条件来实现,这种方式容易导致欠拟合现象,即模型训练的不够好。

5.2 后剪枝 

后剪枝则是在决策树建立完成后再进行剪枝。它的过程是对拥有同样父节点的一组节点进行检查,判断如果将其合并,熵的增加量是否小于某一阈值。如果确实小于阈值,则这一组节点可以合并为一个节点,其中包含了所有可能的结果。后剪枝是目前最普遍的做法,它通过删除一些子树,然后用其叶子节点代替,这些叶子节点所标识的类别通过大多数原则(majority class criterion)确定。优点:

可以避免欠拟合,缺点是可能产生过拟合,并且需要更多的计算资源。 

六、实现决策树 (信息增益和信息熵实现)

import numpy as np
from collections import Counter

# 计算信息熵
def entropy(y):
    hist = np.bincount(y)
    ps = hist / len(y)
    return -np.sum([p * np.log2(p) for p in ps if p > 0])

# 计算信息增益
def information_gain(X, y, feature_index):
    original_entropy = entropy(y)
    values, counts = np.unique(X[:, feature_index], return_counts=True)
    weighted_entropy = np.sum([(counts[i] / len(y)) * entropy(y[X[:, feature_index] == values[i]]) for i in range(len(values))])
    return original_entropy - weighted_entropy

# 选择最优特征进行分割
def select_feature(X, y):
    best_feature_index = None
    best_information_gain = -1
    for feature_index in range(X.shape[1]):
        ig = information_gain(X, y, feature_index)
        if ig > best_information_gain:
            best_information_gain = ig
            best_feature_index = feature_index
    return best_feature_index

# 构建决策树
def build_tree(X, y, depth=0, max_depth=None):
    # 如果所有样本属于同一类别,则返回该类别
    if len(set(y)) == 1:
        return {'class': y[0]}
    # 如果达到最大深度,则返回出现次数最多的类别
    if max_depth is not None and depth >= max_depth:
        return {'class': Counter(y).most_common(1)[0][0]}
    # 选择最优特征进行分割
    feature_index = select_feature(X, y)
    # 创建节点
    node = {'feature_index': feature_index, 'children': {}}
    # 递归构建子树
    for value in np.unique(X[:, feature_index]):
        sub_X = X[X[:, feature_index] == value]
        sub_y = y[X[:, feature_index] == value]
        node['children'][value] = build_tree(sub_X, sub_y, depth + 1, max_depth)
    return node

# 预测函数
def predict(tree, x):
    if 'class' in tree:
        return tree['class']
    feature_index = tree['feature_index']
    value = x[feature_index]
    if value not in tree['children']:
        return None
    return predict(tree['children'][value], x)

# 加载数据集
X = np.array([[1, 1], [1, 0], [0, 1], [0, 0]])
y = np.array([0, 1, 1, 0])

# 构建决策树
tree = build_tree(X, y, max_depth=3)
print(tree)

# 预测新样本
x = np.array([1, 1])
print(predict(tree, x)) # 输出:0
 6.1 代码的结果:
6.2 决策树的生成结果: 

 

   

  • 29
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值