构建一个决策树

简介

决策树(Decision Tree)是一种分类和回归方法,是基于各种情况发生的所需条件构成决策树,以实现期望最大化的一种图解法。决策树的主要优点是易于理解和解释,它能够从数据中学习出规则,以一种类似树的结构呈现。本文介绍的是由信息增益进行运算的决策树。

我们为什么需要决策树

这是一个关于借贷情况的样本。

我们可以通过这个样本构建一个决策树,并使用这个决策树处理之后的新样本,这样就大大提升了我们处理事件的效率。

可以看到在这个样本里贷款结果被拒绝的概率p(拒绝)=\frac{3}{8},批准的概率p(批准)=\frac{5}{8}。如果我们用是否有工作来判断贷款结果的话,那么可以下一个简单的判断:有工作的被批准,没有工作的被拒绝。但显然不符合我们的样本结果。因此在这个样本中不能只使用一个标准来判定最终的结果。比如,我们选取工作和房子进行判断。

先由工作开始判断。

从图中我们可以得出结论:如果有工作,那么可以批准贷款,如果没有工作,再同是否有房子来决定是否批准贷款。
假设我们构建了一个这样规则的决策树,在判断一个新的样本,如下图。我们可以直接判断他的贷款结果为批准。

判定的标准

我们也可以由房子开始判断或者由信誉开始判断,同时顺序又会多种多样,那我们应该用什么标准来选择这个顺序呢。这个标准就是信息熵。

信息熵和信息增益

信息熵的计算公式如下:

H(X) = -\sum p_{i}\log_2 p_{i}

其中,X表示随机变量,在上面的例子中就为“批准”和“拒绝”,pi表示X为Xi时的概率。

引入标准进行划分后的信息熵就是条件熵,计算公式如下:

H_{b}(X) = \frac{S_{1}}{S_{1}+S_{2}}H(X_{1}) + \frac{S_{2}}{S_{1}+S_{2}}H(X_{2})

其中S1和S2为划分后的样本量,在上面的例子中S1=3,S2=5。

我们通过信息增益来选择决策树下一级的标准,信息增益的计算公式如下:

Gain(A) = H(X) - H_{b}(X)

信息增益的值越大,代表分类越精确。

决策树的构建

在上面例子中计算以工作为标准的信息增益

同理计算房子和信誉的信息增益,比较他们之间的大小,就能构建出最终的决策树了。

实例代码

import math
from collections import Counter, defaultdict

# 数据集
data = [
    ["否", "否", "一般", "拒绝"],
    ["否", "否", "好", "拒绝"],
    ["是", "否", "好", "批准"],
    ["是", "是", "一般", "批准"],
    ["否", "是", "好", "批准"],
    ["是", "否", "好", "批准"],
    ["否", "否", "一般", "拒绝"],
    ["否", "是", "好", "批准"]
]

# 属性列表
attributes = ["工作", "有房子", "信誉"]

# 计算熵
def entropy(data):
    labels = [row[-1] for row in data]
    label_counts = Counter(labels)
    total_count = len(labels)
    ent = 0.0
    for count in label_counts.values():
        prob = count / total_count
        ent -= prob * math.log2(prob)
    return ent

# 按属性值划分数据
def split_data(data, attr_index, attr_value):
    return [row for row in data if row[attr_index] == attr_value]

# 计算信息增益
def information_gain(data, attr_index):
    # 计算总体熵
    total_entropy = entropy(data)
    # 根据属性划分数据集
    attr_values = set(row[attr_index] for row in data)
    attr_entropy = 0.0
    total_count = len(data)
    for attr_value in attr_values:
        subset = split_data(data, attr_index, attr_value)
        prob = len(subset) / total_count
        attr_entropy += prob * entropy(subset)
    # 信息增益
    gain = total_entropy - attr_entropy
    return gain

# 选择最佳属性
def best_attribute(data, attributes):
    best_gain = -1
    best_attr = None
    for attr in attributes:
        attr_index = attributes.index(attr)
        gain = information_gain(data, attr_index)
        if gain > best_gain:
            best_gain = gain
            best_attr = attr
    return best_attr

# 构建决策树
def build_tree(data, attributes):
    labels = [row[-1] for row in data]
    # 如果样本中所有的标签相同,返回该标签
    if len(set(labels)) == 1:
        return labels[0]
    # 如果没有可用的属性,返回样本中最多的标签
    if len(attributes) == 0:
        return Counter(labels).most_common(1)[0][0]
    # 选择最佳属性
    best_attr = best_attribute(data, attributes)
    best_attr_index = attributes.index(best_attr)
    tree = {best_attr: {}}
    # 获取最佳属性的不同值
    attr_values = set(row[best_attr_index] for row in data)
    # 对每个值递归构建子树
    for attr_value in attr_values:
        subset = split_data(data, best_attr_index, attr_value)
        sub_attributes = attributes[:]
        sub_attributes.remove(best_attr)
        subtree = build_tree(subset, sub_attributes)
        tree[best_attr][attr_value] = subtree
    return tree

# 构建决策树
decision_tree = build_tree(data, attributes)

# 打印决策树
import pprint
pprint.pprint(decision_tree)
运行结果

结果分析

下图为该样本构建的最终决策树的可视化版本

总结

决策树是一种简单且易于理解的机器学习模型。通过递归地划分数据并选择最佳特征,决策树可以对数据进行分类或预测。希望本文通过介绍决策树的基本原理和实例代码,帮助你更好地理解和应用决策树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值