sklearn决策树预剪枝

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


目录

一.预剪枝即调参 

二.调参方法 

(1) 默认值预观察生长的树 

(2) 参数限制节点过分生长


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

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

一.预剪枝即调参 

预剪枝是树构建过程,达到一定条件就停止生长,

在sklearn中,实际就是调整以下几个训练参数:
min_samples_leaf             :叶子节点最小样本数。
min_samples_split            :节点分枝最小样本个数
max_depth                         :树分枝的最大深度
min_weight_fraction_leaf :叶子节点最小权重和
min_impurity_decrease    :节点分枝最小纯度增长量
max_leaf_nodes                :最大叶子节点数

一般来说,只调这三个        :max_depth,min_samples_leaf,min_samples_split    

二.调参方法 

先用默认值,让树完整生长,再参考完全生长的决策树的信息,通过参数,对过分生长的节点作出限制。


例子
(1) 默认值预观察生长的树 

from sklearn.datasets import load_iris
from sklearn import tree
import numpy as np
import pandas as pd
#--------数据加载-----------------------------------
iris = load_iris()                          # 加载数据
X = iris.data
y = iris.target
#-------用最优参数训练模型------------------
clf = tree.DecisionTreeClassifier(random_state=0)
clf = clf.fit(X, y)  
depth = clf.get_depth()
leaf_node = clf.apply(X)
#-----观察各个叶子节点上的样本个数---------
df  = pd.DataFrame({"leaf_node":leaf_node,"num":np.ones(len(leaf_node)).astype(int)})
df  = df.groupby(["leaf_node"]).sum().reset_index(drop=False)
df  = df.sort_values(by='num').reset_index(drop=True)
print("\n==== 树深度:",depth," ============")
print("==各个叶子节点上的样本个数:==")
print(df)

运行结果:

==== 树深度: 5  ============
==各个叶子节点上的样本个数:==
   leaf_node  num
0          6    1
1         11    1
2         15    1
3         10    2
4         14    2
5          8    3
6         16   43
7          5   47
8          1   50

(2) 参数限制节点过分生长

我们可以看到,有很多叶子节点只有一两个样本,这样很容易过拟合,因此我们把min_samples_leaf 调为3:

#-------用新调整的参数训练模型------------------
clf = tree.DecisionTreeClassifier(random_state=0,max_depth=4,min_samples_leaf=10)
clf = clf.fit(X, y)  
depth = clf.get_depth()
leaf_node = clf.apply(X)
#-----观察各个叶子节点上的样本个数---------
df  = pd.DataFrame({"leaf_node":leaf_node,"num":np.ones(len(leaf_node)).astype(int)})
df  = df.groupby(["leaf_node"]).sum().reset_index(drop=False)
df  = df.sort_values(by='num').reset_index(drop=True)
print("\n==== 树深度:",depth," ============")
print("==各个叶子节点上的样本个数:==")
print(df)

运行结果:

==== 树深度: 4  ============
==各个叶子节点上的样本个数:==
   leaf_node  num
0          6   11
1          9   11
2          7   14
3          5   29
4         10   35
5          1   50

可以看到,最少的一个叶子,也有11个样本了。

在实际中,需要更灵活的思路,本文仅讲预剪枝的基本操作。

相关文章

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

sklearn决策树结果可视化

sklearn决策树参数详解

  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值