机器学习——决策树2

一、剪枝处理

1、剪枝原因

  • 剪枝是决策树学习算法解决“过拟合”问题的主要手段。
  • 为什么会产生“过拟合”问题:在决策树的学习过程中,为了尽可能正确地分类训练样本,结点划分过程不断重复,有时会造成决策树分支过多,于是可能将训练样本学得太好,把训练集数据中一些特点当作所有数据都具有的一般特点了(以偏概全),导致测试集预测效果不好,这就是过拟合现象。
  • “过拟合”会让决策树模型学习到并不具备普遍意义的分类决策条件,从而导致模型的分类效率、泛化能力降低。

2、剪枝的基本策略

剪枝后的效果如何判断:将数据集一部分作为训练集,一部分作为验证集来检验剪枝后的效果。

1、预剪枝
  • 概念: 顾名思义,就是在树长好之前就预先剪掉分支,将即将长出的分支扼杀,不进行该分支划分。
  • 主要方法:

1.当决策树达到预设的高度时就停止决策树的生长
2.达到某个节点的实例具有相同的特征向量,即使这些实例不属于同一类,也可以停止决策树的生长。
3.定义一个阈值,当达到某个节点的实例个数小于阈值时就可以停止决策树的生长。
4.通过计算每次扩张对系统性能的增益,决定是否停止决策树的生长。
上述不足:阈值属于超参数,很难找到过拟合–欠拟合的trade-off

  • 三大准则
    (1)树的高度是否超过阈值(10-15最合适)。
    (2)结点的样本量是否小于阈值(太少容易过拟合)。
    (3)划分前后验证集的精度是否提高。

  • 预剪枝过程
    生成决策树的过程中,在每个结点划分之前先进行计算,比较划分该结点前后决策树泛化性能是否提升,如果提升则划分该结点,如果不能提升则停止划分并将当前结点记为叶结点,其类别标记为该结点对应训练样例数最多的类别(好瓜or坏瓜)。

在这里插入图片描述

例子:
在这里插入图片描述

计算过程:(根蒂)
(1)不划分:将其标记为叶结点,类别标识为训练样例中最多的类别,即好瓜。则验证集中{4,5,8}被分类正确,得到验证集精度为
3/7100%=42.9%
(2)划分:如果划分,如图所示将三个结点进行标记。此时,验证集中编号为{4,5,8,11}的样例被划分正确,验证集精度为4/7
100%=57.1%
在这里插入图片描述
(3)进行判断:划分前=42.9%<划分后=57.1%,所以预剪枝决策为:划分。

  • 优缺点

  • 优点

在这里插入图片描述

  • 缺点
    因为预剪枝和贪心算法相似,都是注重局部最优,所以并不能保证在剪枝掉的分支的基础上进行的后续划分对性能的提高没有帮助,而是直接在最开始就遏制分支的展开,带来了欠拟合风险
2、后剪枝
  • 概念: 与预剪枝对应,后剪枝是在决策树完全生成之后才进行的剪枝操作。
  • 后剪枝过程

先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行分析计算,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
· 注:不能剪叶子结点,毫无意义

例子

在这里插入图片描述

  • 优缺点

在这里插入图片描述
· 从精度上来说,后剪枝会比预剪枝好

二、连续值处理

1、原因

  • 连续属性取值数目非有限,不能像处理离散属性取值一样对结点直接进行划分,所以需要将连续属性离散化。

  • 与离散属性不同,若当前结点划分属性为连续属性,该属性还可作为其后代结点的划分属性

2、离散化方法(二分法)

常用的离散化方法是二分法

在这里插入图片描述
在这里插入图片描述
简单来说:
(1)将样本集中连续属性的取值从小到大排序
(2)找到候选划分点(一般是中位点),将取值分为小于等于划分点的和大于划分点的
(3)计算候选划分点的增益,选择增益最大的作为最终的划分点。

3、例子

在这里插入图片描述在这里插入图片描述
(1)先对属性“密度”的取值进行排序(从小到大)
{0.243,0.245,0.343,0.360,0.403,0.437,0.481,0.556,0.593,0.608,0.634,0.639,0.657,0.666,0.697,0.719,0.774}
(2)计算候选划分点(16个:每两个取值之间有一个划分点,共17个取值,所以会有16个划分点)
(3)一个个计算候选划分点的增益进行比较

三、代码实现

1、预剪枝

(1)预剪枝代码实现
# 创建预剪枝决策树
def createTreePrePruning(dataTrain, labelTrain, dataTest, labelTest, names, method='id3'):
    """
    预剪枝 需要使用测试数据对每次的划分进行评估
         策略说明:原本如果某节点划分前后的测试结果没有提升,将不进行划分(即执行剪枝),但考虑到这种策略容易造成欠拟合,
                   且不能排除后续划分有进一步提升的可能,因此,没有提升仍保留划分,即不剪枝
    """
    trainData = np.asarray(dataTrain)
    labelTrain = np.asarray(labelTrain)
    testData = np.asarray(dataTest)
    labelTest = np.asarray(labelTest)
    names = np.asarray(names)
    # 如果结果为单一结果
    if len(set(labelTrain)) == 1:
        return labelTrain[0]
        # 如果没有待分类特征
    elif trainData.size == 0:
        return voteLabel(labelTrain)
    # 其他情况则选取特征
    bestFeat, bestEnt = bestFeature(dataTrain, labelTrain, method=method)
    # 取特征名称
    bestFeatName = names[bestFeat]
    # 从特征名称列表删除已取得特征名称
    names = np.delete(names, [bestFeat])
    # 根据最优特征进行分割
    dataTrainSet, labelTrainSet = splitFeatureData(dataTrain
决策树算法是一种广泛应用于分类和回归的机器学习算法,它基于树形结构对样本进行分类或预测。决策树算法的主要思想是通过一系列的判断来对样本进行分类或预测。在决策树中,每个节点表示一个属性或特征,每个分支代表该属性或特征的一个取值,而每个叶子节点代表一个分类或预测结果。 决策树算法的训练过程主要包括以下步骤: 1. 特征选择:根据某种指标(如信息增益或基尼系数)选择最优的特征作为当前节点的分裂属性。 2. 决策树生成:根据选择的特征将数据集分成若干个子集,并递归地生成决策树。 3. 剪枝:通过剪枝操作来提高决策树的泛化性能。 决策树算法的优点包括易于理解和解释、计算复杂度较低、对缺失值不敏感等。但是,决策树算法也存在一些缺点,如容易出现过拟合、对离散数据敏感等。 下面是一个决策树算法的案例:假设我们要根据一个人的年龄、性别、教育程度和职业预测其收入水平(高于或低于50K)。首先,我们需要将这些特征进行编码,将其转换为数值型数据。然后,我们可以使用决策树算法对这些数据进行训练,并生成一个决策树模型。最后,我们可以使用该模型对新的数据进行分类或预测。例如,根据一个人的年龄、性别、教育程度和职业,我们可以使用决策树模型预测该人的收入水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值