细讲sklearn决策树后剪枝(带例子)

《老饼讲解机器学习》icon-default.png?t=N7T8https://www.bbbdata.com/text/38


目录

一.CCP后剪枝简介

二.剪枝操作过程

(1) 查看CCP路径

(2)根据CCP路径剪树


为预防模型过拟合,我们可以采用预剪枝和后剪枝方法
1. 预剪枝:树构建过程,达到一定条件就停止生长
2. 后剪枝是等树完全构建后,再剪掉一些节点。

本文讲述后剪枝,预剪枝请参考《sklearn决策树预剪枝

一.CCP后剪枝简介

后剪枝一般指的是CCP代价复杂度剪枝法(Cost Complexity Pruning),
即在树构建完成后,对树进行剪枝简化,使以下损失函数最小化:

  L=\displaystyle \sum \limits _{i=1}^{T} \frac{N_i}{N} L_i +\alpha T

T  :叶子节点个数
N :所有样本个数
N_{i} :第 i 个叶子节点上的样本数 
L_{i} :第i个叶子节点的损失函数
α   :待定系数,用于惩罚节点个数,引导模型用更少的节点。

损失函数既考虑了代价,又考虑了树的复杂度,所以叫代价复杂度剪枝法,实质就是在树的复杂度与准确性之间取得一个平衡点。

备注:在sklearn中,如果criterion设为GINI,则是L_i​每个叶子节点的GINI系数,如果设为entropy,则是熵。

二.剪枝操作过程

具体操作过程如下:

(1) 查看CCP路径

计算CCP路径,查看alpha与树质量的关系:
构建好树后,我们可以通过clf.cost_complexity_pruning_path(X, y) 查看树的CCP路径:

# -*- coding: utf-8 -*-
from sklearn.datasets import load_iris
from sklearn import tree
import numpy as np
#----------------数据准备----------------------------
iris = load_iris()                          # 加载数据
X = iris.data
y = iris.target
#---------------模型训练---------------------------------
clf = tree.DecisionTreeClassifier(min_samples_split=10,ccp_alpha=0)        
clf = clf.fit(X, y)     
#-------计算ccp路径-----------------------
pruning_path = clf.cost_complexity_pruning_path(X, y)
#-------打印结果---------------------------    
print("\n====CCP路径=================")
print("ccp_alphas:",pruning_path['ccp_alphas'])
print("impurities:",pruning_path['impurities'])

运行结果:

====sklearn的CCP路径=================
ccp_alphas: [0.      0.00415459 0.01305556 0.02966049 0.25979603 0.33333333]
impurities: [0.02666667 0.03082126 0.04387681 0.07353731 0.33333333 0.66666667]

它的意思是:
0<\alphaα <0.00415时,树的不纯度为 0.02666,
0.00415<\alphaα <0.01305时,树的不纯度为 0.03082,
0.01305<\alphaα <0.02966时,树的不纯度为 0.04387,
........
小贴士:ccp_path只提供树的不纯度,如果还需要alpha对应的其它信息,则可以将alpha代入模型中训练,从训练好的模型中获取。

备注:树的不纯度指的是损失函数的前部分L=\displaystyle \sum \limits _{i=1}^{T} \frac{N_i}{N} L_i, 也即所有叶子的不纯度(gini或者熵)加权和。

(2)根据CCP路径剪树

根据树的质量,选定alpha进行剪树
我们选择一个可以接受的树不纯度,找到对应的alpha,例如,我们可接受的树不纯度为0.0735,则alpha可设为0.1(在0.02966与0.25979之间)
对模型重新以参数ccp_alpha=0.1进行训练,即可得到剪枝后的决策树。

完整代码如下:

 # -*- coding: utf-8 -*-
from sklearn.datasets import load_iris
from sklearn import tree
import numpy as np

#--------数据准备-----------------------------------
iris = load_iris()                          # 加载数据
X = iris.data
y = iris.target
#-------模型训练---------------------------------
clf = tree.DecisionTreeClassifier(min_samples_split=10,random_state=0,ccp_alpha=0)        
clf = clf.fit(X, y)     
#-------计算ccp路径------------------------------
pruning_path = clf.cost_complexity_pruning_path(X, y)

#-------打印结果---------------------------------   
print("\n====CCP路径=================")
print("ccp_alphas:",pruning_path['ccp_alphas'])
print("impurities:",pruning_path['impurities'])    

#------设置alpha对树后剪枝-----------------------
clf = tree.DecisionTreeClassifier(min_samples_split=10,random_state=0,ccp_alpha=0.1)        
clf = clf.fit(X, y) 
#------自行计算树纯度以验证-----------------------
is_leaf =clf.tree_.children_left ==-1
tree_impurities = (clf.tree_.impurity[is_leaf]* clf.tree_.n_node_samples[is_leaf]/len(y)).sum()
#-------打印结果--------------------------- 
print("\n==设置alpha=0.1剪枝后的树纯度:=========\n",tree_impurities)

运行结果:

====CCP路径=================
ccp_alphas: [0.      0.00415459 0.01305556 0.02966049 0.25979603 0.33333333]
impurities: [0.02666667 0.03082126 0.04387681 0.07353731 0.33333333 0.66666667]

==设置alpha=0.1剪枝后的树纯度:=========
 0.0735373054213634

对于CCP路径的计算过程,可参考:

1.《决策树后剪枝原理:CCP剪枝法

相关文章

一个简单的决策树分类例子

sklearn决策树结果可视化

sklearn决策树参数详解

  • 6
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
决策树是一种常用的机器学习算法,用于分类和回归任务。预剪枝和后剪枝决策树中用于防止过拟合的技术。 1. 决策树剪枝决策树剪枝是在构建决策树的过程中,在每个节点进行划分之前,通过一些条件来判断是否进行划分。常见的预剪枝条件有以下几种: - 最大深度限制:限制决策树的最大深度,防止过拟合。 - 叶子节点样本数限制:限制叶子节点的最小样本数,防止过拟合。 - 信息增益阈值:限制信息增益的最小值,当信息增益小于阈值时停止划分。 以下是一个决策树剪枝的示例代码: ```python from sklearn.tree import DecisionTreeClassifier # 创建决策树分类器对象 clf = DecisionTreeClassifier(max_depth=5, min_samples_leaf=10, min_impurity_decrease=0.01) # 使用训练数据拟合分类器模型 clf.fit(X_train, y_train) # 使用测试数据进行预测 y_pred = clf.predict(X_test) ``` 2. 决策树剪枝决策树剪枝是在构建完整的决策树之后,通过剪枝操作来减小决策树的复杂度,防止过拟合。常见的后剪枝方法有以下几种: - 代价复杂度剪枝:通过引入一个参数来平衡模型的复杂度和准确性,选择代价最小的子树作为最终的决策树。 - 错误率剪枝:通过计算剪枝前后的错误率,选择错误率最小的子树作为最终的决策树。 以下是一个决策树剪枝的示例代码: ```python from sklearn.tree import DecisionTreeClassifier from sklearn.tree import export_text # 创建决策树分类器对象 clf = DecisionTreeClassifier() # 使用训练数据拟合分类器模型 clf.fit(X_train, y_train) # 导出决策树的文本表示 tree_rules = export_text(clf, feature_names=feature_names) # 打印决策树的文本表示 print(tree_rules) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值