西瓜书 课后习题4.4 基尼指数 未剪枝 预剪枝 后剪枝

本文探讨了使用西瓜书中的2.0数据集,通过基尼指数来构建决策树。详细分析了未剪枝、预剪枝和后剪枝三种策略在决策树构建过程中的应用,并提供了相关数据集的下载链接和参考文章。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import operator
import csv
import numpy as np


def readDataset(filename):
    '''
    读取数据
    :param filename: 数据文件名,CSV格式
    :return:  以列表形式返回数据列表和特征列表
    '''
    with open(filename) as f:
        reader = csv.reader(f)
        header_row = next(reader)
        labels = header_row[1:7]
        dataset = []
        for line in reader:
            tempVect = line[1:]
            dataset.append(tempVect)

    trainIndex = [1, 2, 3, 6, 7, 10, 14, 15, 16, 17]
    trainDataset = []
    testDataset = []
    for i in range(1, 18):
        if (i in trainIndex):
            trainDataset.append(dataset[i - 1])
        else:
            testDataset.append(dataset[i - 1])
    trainDataset.append(dataset[3])  # 为保持和书中结果相同,训练集中增加第四条数据
    return dataset, labels, trainDataset, testDataset


def Gini(dataset):
    '''
    计算gini基尼值
    :param dataset:  输入数据集
    :return:  返回基尼值gini
    '''
    numdata = len(dataset)
    labels = {}
    for featVec in dataset:
        label = featVec[-1]
        if label not in labels.keys():
            labels[label] = 0
        labels[label] += 1
    gini = 1
    for lab in labels.keys():
        prop = float(labels[lab]) / numdata
        gini -= prop ** 2
    return gini


def splitDataset(dataset, axis, value):
    '''
    对某个特征进行划分后的数据集
    :param dataset: 数据集
    :param axis: 划分属性的下标
    :param value: 划分属性值
    :return: 返回剩余数据集
    '''
    restDataset = []
    for featVec in dataset:
        if featVec[axis] == value:
            restFeatVec = featVec[:axis]
            restFeatVec.extend(featVec[axis + 1:])
            restDataset.append(re
### 基尼指数决策树中的应用 基尼指数是一种衡量数据集合纯度的指标,在分类问题中被广泛应用于决策树算法。对于给定的一个数据集 \(D\),如果类别总数为 \(m\),则该数据集的基尼指数定义如下: \[ Gini(D) = 1 - \sum_{k=1}^{m} (p_k)^2 \] 其中,\(p_k\) 表示第 \(k\) 类样本所占的比例[^4]。 当使用基尼指数来评估某个特征划分的效果时,目标是最小化子节点加权后的总基尼指数。假设通过某特征 \(A\) 将数据集划分为多个子集,则总的基尼指数可以表示为: \[ Gini\_index(A) = \sum_{v=1}^{V} \frac{|D_v|}{|D|} Gini(D_v) \] 这里,\(D_v\) 是由特征 \(A\) 的第 \(v\) 种取值分割出来的子集,而 \(|D|\) 和 \(|D_v|\) 则分别代表原始数据集和子集中样本的数量[^5]。 #### 预剪枝基尼指数的关系 预剪枝的核心思想是在构建决策树的过程中提前停止某些分支的增长,从而防止过拟合现象的发生。具体来说,可以通过比较当前节点不继续分裂时的误差率(或基尼指数)以及进一步分裂后可能带来的改进程度来进行判断。如果发现后续分裂不会显著降低整体错误率或者提升模型性能,则可以选择终止这一路径上的扩展[^6]。 例如,在基于天气条件预测是否打高尔夫球的例子中,我们可以利用基尼指数计算各个属性(如 OUTLOOK、TEMPERATURE 等)对最终结果的影响大小,并据此决定哪些应该成为内部节点进行更深层次分析,哪些可以直接设为叶节点结束探索过程[^7]。 ```python def gini_index(subsets, classes): total_instances = sum([len(s) for s in subsets]) weighted_gini = 0.0 for subset in subsets: size = float(len(subset)) if size == 0: continue score = 0.0 # Calculate the proportion of each class within this subset. counts = {} for instance in subset: label = instance[-1] if label not in counts: counts[label] = 0 counts[label] += 1 probabilities = [counts[c]/size for c in classes] # Compute the Gini index for this particular split. score = 1 - sum(p ** 2 for p in probabilities) # Weight it by its relative contribution to all instances. weighted_gini += score * (size / total_instances) return weighted_gini ``` 上述代码片段展示了如何根据输入的不同子集及其对应的标签分布情况来求解总体的加权平均基尼指数。这一步骤通常会嵌套在整个递归建模流程之中,帮助动态调整最佳切分点的选择标准[^8]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值