1、什么是剪枝?
使决策树停止生长或将决策树的部分子节点删掉的方法
2、为什么剪枝?
我们都知道如果模型过分拟合训练数据,就会导致在测试集上的泛化能力差,形成过拟合,而决策树就是采用剪枝的方法来对付过拟合的问题
3、剪枝的方法?
剪枝分为预剪枝、后剪枝
1)预剪枝
在决策树的生成过程中,对每个节点在划分前进行评估,若当前节点的划分不能带来决策树泛化能力的提升,则停止划分并将当前节点记为叶节点;
2)后剪枝
先生成一棵决策树,然后自底而上的对非叶节点进行评估,判断该节点对应的子树替换成叶节点,如果能带来决策树泛化性能的提升,则将该子树替换为叶节点。
4、Python实现及参数含义
下面我们来学习一下,利用python实现决策树代码以及参数含义
import numpy as np
import pandas as pd
from pandas import DataFrame as df
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
data = df(load_iris().data,columns=load_iris().feature_names)
data['target'] = load_iris().target
x_train,x_test,y_train,y_test = train_test_split(data.iloc[:,:-1],data['target'],test_size=0.7)
DT = DecisionTreeClassifier(random_state=1)
DT.fit(x_train,y_train)
DT.score(x_train,y_train)
DT.score(x_test,y_test)
'''
Args:
criterion='gini': 特征选择方法
取值:{'gini','entropy'},gini:gini指数(CART),entropy:信息增益(ID3,C4.5)
splitter='best':特征划分方法
取值:{'best','random'},best:在所有特征中找最好的切分点,random:在部分特征中
在特征的所有划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。
样本量不大的时候可以使用best,样本量过大的时候选择random
max_depth=None:最大深度
对于特征较多样本量较少的情况,可以通过设置该参数,改善过拟合问题
min_samples_split=2:内部节点划分所需的最小样本数
取值:int(最小样本数)或者小于1的数(样本量的百分比)
如果节点上的样本量小于改参数的值,将不再进行划分,该节点设置为叶子节点
min_samples_leaf=1:叶子节点所需的最小样本数
取值:int(最小样本数)或者小于1的数(样本量的百分比)
如果该节点数达不到改参数的值,则父节点设置为叶子节点,可以改善过拟合
min_weight_fraction_leaf=0.0:叶子节点所有样本权重和
如果低于该阈值,则会和兄弟节点一起被剪枝,一般在样本的分布类别偏差较大时或有较多缺失值的情况下设置该参数
max_features=None:划分考虑最大特征数
取值:log2n、sqrt(n)、auto或者是小于1的浮点数(百分比)或整数(具体数量的特征)
空:全部特征
random_state=None:随机种子数
设置后每次生成的数是一样的
max_leaf_nodes=None:最大叶子节点数
如果设置改参数,模型将在改该参数范围内建立最优决策树,可以改善过拟合
min_impurity_decrease=0.0:节点划分最小不纯度
0.19版本之前使用min_impurity_split
如果节点的不纯度小于该阈值,则该节点不在生成子节点。
class_weight=None:类别权重
取值:{None,balanced},在回归树中没有此参数
对于样本类别偏差较大的情况,可以通过设置该参数平衡样本,样本数少的权重高
最常用的剪枝参数:
max_depth、min_samples_split、min_samples_leaf、max_features、min_impurity_decrease
目标权重参数:
class_weight、min_weight_fraction_leaf
'''
详细内容请看我公众号:【数据分析修炼手册】