机器学习——决策树

一、决策树

目录

一、决策树

1.1 决策树的概念

1.2决策树的步骤

1.3决策树的优缺点

二、如何构建决策树

2.1信息增益

2.2基尼指数

2、决策树建立方法

三、剪枝处理

四、基于信息熵的决策树实现

 五、总结


1.1 决策树的概念

        在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。它可以用来解决分类和回归问题。

1.2决策树的步骤

        1.特征选择:特征选择是指从训练数据中选择一个最优的特征,作为当前节点的划分依据。不同的特征选择准则会导致不同的决策树算法,常用的准则有信息增益、信息增益率、基尼指数等。

        2.决策树生成:决策树生成是指从根节点开始,递归地对每个节点进行特征选择,并根据特征的不同取值划分数据集,生成子节点。直到满足某些终止条件,如所有样本属于同一类别,或没有可用的特征,或达到最大深度等。

        3.剪枝:决策树剪枝是指为了防止过拟合,对生成的决策树进行简化,去掉一些不重要的分支,减少树的复杂度。常用的剪枝方法有预剪枝和后剪枝,前者是在生成决策树的过程中进行剪枝,后者是在生成决策树后进行剪枝。

1.3决策树的优缺点

优点:

·简单易懂,可以直观地展示决策过程和分类规则。

·计算复杂度不高,输出结果易理解,对中间值缺失不敏感,可以处理不相关特征数据。

缺点:容易过拟合,即对训练数据过于敏感,导致泛化能力差。

二、如何构建决策树

1.构建决策树的过程是一个自上而下,递归地划分数据集的过程。

2.划分的原则是选择一个最优的属性,使得划分后的数据集的纯度或者信息增益最大。

3.纯度或者信息增益的度量方式有多种,常用的有信息熵、基尼指数等。

4.划分的终止条件有多种,常用的有设定树的最大深度、最小节点样本数、最小信息增益等。

5.为了防止过拟合,可以对决策树进行剪枝,即删除一些不重要的分支,减少树的复杂度。

决策树示意图:

2.1信息增益

信息熵信息熵是一种度量信息的不确定性或复杂性的指标,它反映了信息源的平均信息量。信息熵的概念最早由香农在1948年提出,借鉴了热力学的熵的概念,将信息中排除了冗余后的平均信息量称为“信息熵”,并给出了计算信息熵的数学表达式。

                                             Ent(D)= - \sum_{k=1}^{k}p_{k} log_{2}p_{k}

        K表示类别的个数,pk​表示第k类样本所占的比例。

信息增益:信息增益是指划分前后数据集的信息熵的差值,信息熵是度量数据集纯度的一种指标,它反映了数据集中样本的类别分布情况。信息增益越大,说明划分后的数据集纯度越高,不确定性越低。

                                            Gain(D,a)=Ent(D)-\sum_{v=1}^{v}\frac{|D^{v}|}{|D|}Ent(D^{v})

         Ent(D)表示数据集D的信息熵,V表示属性的取值个数,Dv表示属性取值为v的子集,∣D∣表示数据集的样本数。K表示类别的个数,pk​表示第k类样本所占的比例。

决策树建立方法:

选择信息增益最大的属性作为划分属性。

2.2基尼指数

1.定义:

基尼值:

Gini(D)=1-\sum_{k=1}^{N}p_{k}^{2}

Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率,表示数据集整体的不确定性。

Gini(D)越小,数据集D的纯度越高,不确定性越小。

基尼指数:

Gini(D,a)=\sum_{v=1}^{V}\frac{|D^{v|}}{|D|}Gini(D^{v})

表示经a分割后数据集D的不确定性。

2、决策树建立方法

        在侯选属性集合中,选择那个是的划分后基尼指数最小的属性为最优划分属性。

三、剪枝处理

 1.剪枝:

        剪枝处理是一种优化决策树的方法,它可以防止过拟合,减少树的复杂度,提高泛化能力。剪枝处理有两种主要的方式:预剪枝和后剪枝。

        ·预剪枝是在生成决策树的过程中,对每个节点在划分前先进行估计,如果当前节点的划分不能带来决策树泛化性能的提升,则停止划分并将当前节点标记为叶节点。

        ·后剪枝是先从训练集生成一棵完整的决策树,然后自底向上地对非叶节点进行考察,如果将该节点对应的子树替换为叶节点能够提高决策树的泛化性能,则将该子树剪掉。

2.剪枝的常用方法

a.留出法

b.检查验证发

c.悲观剪枝法

四、基于信息熵的决策树实现

1.步骤

1.1定义数据集

watermelon_data = [
    {'颜色': '青绿', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '清晰', '成熟': '成熟'},
    {'颜色': '乌黑', '根蒂': '蜷缩', '敲声': '沉闷', '纹理': '清晰', '成熟': '成熟'},
    {'颜色': '浅白', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '清晰', '成熟': '成熟'},
    {'颜色': '青绿', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '清晰', '成熟': '成熟'},
    {'颜色': '乌黑', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '稍糊', '成熟': '成熟'},
    {'颜色': '浅白', '根蒂': '稍蜷', '敲声': '沉闷', '纹理': '稍糊', '成熟': '成熟'},
    {'颜色': '青绿', '根蒂': '硬挺', '敲声': '清脆', '纹理': '清晰', '成熟': '不成熟'},
    {'颜色': '浅白', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '模糊', '成熟': '不成熟'},
    {'颜色': '乌黑', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '模糊', '成熟': '不成熟'},
    {'颜色': '浅白', '根蒂': '硬挺', '敲声': '清脆', '纹理': '模糊', '成熟': '不成熟'},
]

1.2 计算信息熵

def calculate_entropy(data):
    total_samples = len(data)
    if total_samples == 0:
        return 0

    label_counts = {}
    for entry in data:
        label = entry['成熟']
        if label not in label_counts:
            label_counts[label] = 0
        label_counts[label] += 1

    entropy = 0
    for label in label_counts:
        probability = label_counts[label] / total_samples
        entropy -= probability * math.log2(probability)

    return entropy

1.3  选择最佳特征进行分割

def find_best_split(data):
    features = list(data[0].keys())[:-1]  # 排除 '成熟' 特征
    base_entropy = calculate_entropy(data)
    best_info_gain = 0
    best_feature = None

    for feature in features:
        unique_values = set(d[feature] for d in data)
        new_entropy = 0

        for value in unique_values:
            sub_data = [d for d in data if d[feature] == value]
            weight = len(sub_data) / len(data)
            new_entropy += weight * calculate_entropy(sub_data)

        info_gain = base_entropy - new_entropy

        if info_gain > best_info_gain:
            best_info_gain = info_gain
            best_feature = feature

    return best_feature

1.4   构建决策树并显示

def build_decision_tree(data):
    # 如果所有数据都属于同一类别,返回该类别
    if len(set(d['成熟'] for d in data)) == 1:
        return data[0]['成熟']

    # 如果没有特征可供分割,返回占多数的类别
    if len(list(data[0].keys())[:-1]) == 0:
        label_counts = {}
        for entry in data:
            label = entry['成熟']
            if label not in label_counts:
                label_counts[label] = 0
            label_counts[label] += 1
        majority_label = max(label_counts, key=label_counts.get)
        return majority_label

    best_feature = find_best_split(data)
    tree = {best_feature: {}}

    unique_values = set(d[best_feature] for d in data)
    for value in unique_values:
        sub_data = [d for d in data if d[best_feature] == value]
        tree[best_feature][value] = build_decision_tree(sub_data)

    return tree

# 构建决策树并显示
decision_tree = build_decision_tree(watermelon_data)
print(decision_tree)

2.结果

 

 五、总结

        决策树,在这次实验中。了解了一些关于决策树的知识,如决策树的各种划分标准,决策树的优缺点以及怎样去构建一个决策树等等。对于新东西的接受消化还是要花很大力气的,虽然效果并不是那么好,可视化还没有实现成功。

六、参考

【精选】机器学习 —— 决策树_决策树流程-CSDN博客

【机器学习实战】3、决策树_机器学习实战决策树-CSDN博客

决策树_百度百科 (baidu.com)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
决策树算法是一种广泛应用于分类和回归的机器学习算法,它基于树形结构对样本进行分类或预测。决策树算法的主要思想是通过一系列的判断来对样本进行分类或预测。在决策树中,每个节点表示一个属性或特征,每个分支代表该属性或特征的一个取值,而每个叶子节点代表一个分类或预测结果。 决策树算法的训练过程主要包括以下步骤: 1. 特征选择:根据某种指标(如信息增益或基尼系数)选择最优的特征作为当前节点的分裂属性。 2. 决策树生成:根据选择的特征将数据集分成若干个子集,并递归地生成决策树。 3. 剪枝:通过剪枝操作来提高决策树的泛化性能。 决策树算法的优点包括易于理解和解释、计算复杂度较低、对缺失值不敏感等。但是,决策树算法也存在一些缺点,如容易出现过拟合、对离散数据敏感等。 下面是一个决策树算法的案例:假设我们要根据一个人的年龄、性别、教育程度和职业预测其收入水平(高于或低于50K)。首先,我们需要将这些特征进行编码,将其转换为数值型数据。然后,我们可以使用决策树算法对这些数据进行训练,并生成一个决策树模型。最后,我们可以使用该模型对新的数据进行分类或预测。例如,根据一个人的年龄、性别、教育程度和职业,我们可以使用决策树模型预测该人的收入水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值