【解决】决策树过拟合怎么办

目录

一、决策树简介

1.1 决策树模型介绍

1.2 决策树例子

二、决策树过拟合时的解决方案

2.1 决策树过拟合的解决方案概述

三、关于决策树剪枝

3.1  决策树的预剪枝

3.2 决策树的后剪枝



决策树是一种容易过拟合的模型,在使用决策树时,往往会发生过拟合,这时候,就需要采取相关策略解决决策树的过拟合问题。本文讲解决策树过拟合时,可以采取的策略。

一、决策树简介

1.1 决策树模型介绍

决策树模型是一种非参数的有监督学习方法,它通过树形结构(可以是二叉树或非二叉树)表示决策过程。在决策树中,每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。决策树模型可以用于分类和回归问题。

下面是一个决策树模型示例:

1.2 决策树例子

在python中可以通过sklearn来构建一个决策树

from sklearn.datasets import load_iris
from sklearn import tree

#----------------数据准备----------------------------
iris = load_iris()                          # 加载数据

#---------------模型训练----------------------------------
clf = tree.DecisionTreeClassifier()         # sk-learn的决策树模型
clf = clf.fit(iris.data, iris.target)        # 用数据训练树模型构建()
r = tree.export_text(clf, feature_names=iris['feature_names'])

#---------------模型预测结果------------------------
text_x = iris.data[[0,1,50,51,100,101], :]
pred_target_prob = clf.predict_proba(text_x)        # 预测类别概率
pred_target = clf.predict(text_x)              # 预测类别

#---------------打印结果---------------------------
print("\n===模型======")
print(r)
print("\n===测试数据:=====")
print(text_x)
print("\n===预测所属类别概率:=====")
print(pred_target_prob)
print("\n===预测所属类别:======")
print(pred_target)

运行后显示如下结果:

如果需要将决策树可视化,可参考文章:

怎么画出决策树-两种决策树的可视化方法-CSDN博客

如果不想通过sklearn软件包,而自己构建一个决策树,可参考

老饼讲解|决策树建模完整代码

二、决策树过拟合时的解决方案

2.1 决策树过拟合的解决方案概述

决策树过拟合的解决方法有以下几种:

剪枝:剪枝是一种常用的解决决策树过拟合问题的方法。它通过去掉一些不必要的节点来降低模型复杂度,从而避免过拟合。具体来说,剪枝分为预剪枝和后剪枝两种方式。

预剪枝是在构建决策树时,在每个节点处判断是否应该继续分裂。如果当前节点无法提高模型性能,则停止分裂,将当前节点标记为叶子节点。这样可以有效地减少模型复杂度,避免过拟合。

后剪枝则是在构建完整个决策树之后,对树进行修剪。具体来说,它通过递归地考虑每个非叶子节点是否可以被替换成叶子节点来达到降低模型复杂度、避免过拟合的目的。
增加样本量:过拟合通常是由于训练数据量太少导致的。因此,增加样本量可以有效地缓解过拟合问题。在实际应用中,可以通过收集更多的数据来增加样本量。


减少特征维度:过拟合可能是因为模型学习了太多的无关特征,因此可以考虑减少特征的维度,从而降低模型的复杂度。


综上所述,解决决策树过拟合问题可以从剪枝、增加样本量、减少特征维度等方面入手。

三、关于决策树剪枝

3.1  决策树的预剪枝

决策树的预剪枝是在构建决策树的过程中,对每个结点在划分前进行估计,如果当前结点的划分不能带来决策树模型泛化性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点。这种方法是为了简化决策树模型,避免过拟合。预剪枝的方法包括设定阈值和到达某个结点的实例个数小于某个阈值时停止树的生长。

常用的预剪枝有如下:

1.设定每个叶子节点的最小样本数,以避免某个特征类别只适用于极少数的样本。
2.设定每个节点的最小样本数,从根节点开始避免过度拟合。
3.设定树的最大深度,避免无限往下划分。
4.设定叶子节点的最大数量,避免出现无限多次划分类别。
5.设定评估分割数据是的最大特征数量,避免每次都考虑所有特征为求“最佳”,而采取随机选择的方式避免过度拟合。


预剪枝是树构建过程,达到一定条件就停止生长,在sklearn中,实际就是调参,通过设置树的生长参数,来达到预剪枝的效果。

在skelarn中,与预剪枝相关的参数有:

min_samples_leaf           :叶子节点最小样本数       
min_samples_split          :节点分枝最小样本个数     
max_depth                  :树分枝的最大深度            
min_weight_fraction_leaf   :叶子节点最小权重和         
min_impurity_decrease      :节点分枝最小纯度增长量   
max_leaf_nodes             :最大叶子节点数        

3.2 决策树的后剪枝

决策树的剪枝,除了预剪枝,还有后剪枝。后剪枝是在决策树生长完成之后,对树进行剪枝,得到简化版的决策树。后剪枝通过对拥有同样父节点的一组节点进行检查,判断如果将其合并,熵的增加量是否小于某一阈值。如果确实小,则这一组节点可以合并一个节点,其中包含了所有可能的结果。后剪枝一般采用的是CCP后剪枝。

CCP的后剪枝公式如下:

在sklearn中,就是通过设置alpha参数来达到后剪枝的效果。

后剪枝的具体例子可以参考《老饼讲解|sklearn决策树后剪枝


写文不易,点赞收藏吧~!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值