上面文章《决策树模型(一)理论》中,已详细介绍了决策树原理,包括决策树生长原理,决策树的特征选择原理,决策树剪枝策略以及决策树处理缺失值原理等等。如果您还没有阅读,可点击跳转,或关注公众号获取文章详情。
本文将继决策树理论后,通过实际的案例应用,加深对决策树工作原理的理解。本文直接使用sklearn中决策树模型,sklearn自带的红酒数据集作为数据源。「本文字数8253」
sklearn.tree.DecisionTreeClassifier
语法
sklearn.tree.DecisionTreeClassifier (criterion=’gini’, splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)
重要参数
criterion : {"gini", "entropy"}, default="gini"
输入
"entropy"
,使用信息熵(Entropy)输入
"gini"
,使用基尼系数(Gini Impurity)决策树找出最佳节点和最佳分枝方法,而衡量这个"最佳"的标准(criterion)叫做"不纯度"。一般地,不纯度越低,决策树对训练集的拟合越好。目前的决策树算法在分枝方法上的核心大多是围绕在对某个不纯度相关指标的最优化上。
random_state : int or RandomState, default=None
random_state
用来设置分枝中的随机模式的参数,默认None
,在高维度时随机性会表现更明显。
如果
int
,random_state
是随机数生成器使用的种子;如果输入
RandomState实例
,则random_state
为随机数生成器;如果
None
,随机数生成器就是通过"np.random"
使用一个RandomState
实例splitter : {"best", "random"}, default="best"
- 输入
"best"
选择最好的分裂- 输入
"random"
选择最好的随机分割用于在每个节点选择分割的策略。策略是
"best"
,决策树在分枝时虽然随机,但是还是会优先选择更重要的特征进行分枝(重要性可以通过属性feature_importances_
查看)。策略是"random"
时,决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合,从而降低了过拟合。max_depth : int, default=None
- 输入
"None"
,则展开节点直到所有的叶子都是纯净的,即不纯度为0,或者直到所有的叶子都含有少于min_samples_split
样本。- 输入
int
,限制树的最大深度,超过设定深度的树枝全部剪掉。这是用得最广泛的剪枝参数,在高维度低样本量时非常有效。决策树多生长一层,对样本量的需求会增加一倍,所以限制树深度能够有效地限制过拟合。min_samples_split : int or float, default=2
一个节点必须要包含至少
min_samples_split
个训练样本,这个节点才允许被分枝,否则 分枝就不会发生。
- 输入
int
,min_samples_split
作为最小值。- 如果是
float
,那么min_samples_split
是一个分数和ceil(min_samples_split * n_samples)
是最小值每次分割的样本数。min_samples_leaf : int or float, default=1
一个叶节点上所需的最小样本数。即一个节点在分枝后的每个子节点都必须包含至少
min_samples_leaf
个训练样本,否则分枝就不会发生,或分枝会朝着满足每个子节点都包含min_samples_leaf
个样本的方向去发生。
如果是
int
,那么考虑min_samples_leaf
作为最小值。如果是
float
,那么min_samples_leaf
是一个分数和ceil(min_samples_leaf * n_samples)
是最小值每个节点的样本数。任何深度上的分裂点,只有在每个左右分支上的训练样本超过
min_samples_leaf
,才会被纳入考虑范围。这会产生平滑模型的效果,尤其是在回归树中使用。这个参数的数量设置得太小会引起过拟合,设置得太大就会阻止模型学习数据。如果叶节点中含有的样本量变化很大,建议输入浮点数作为样本量的百分比来使用。同时,这个参数可以保证每个叶子的最小尺寸,可以在回归问题中避免低方差,过拟合的叶子节点出现。对于类别不多的分类问题,等于1通常就是最佳选择。
max_features : int, float or {"auto", "sqrt", "log2"}, default=None
限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,即是直接限制可以使用的特征数量而强行使决策树停下的参数。是用来限制高维度数据的过拟合的剪枝参数。
- 如果是
int
,那么考虑每个分割的max_features
特性。- 如果是
float
,输入的浮点数为比例,每个分枝考虑的特征数目是int(max_features * n_features)
,输入模型的数据集的特征个数n_features
。- 输入
"auto"
,那么max_features=sqrt(n_features)
- 输入
"sqrt"
,那么max_features=sqrt(n_features)
- 输入
"log2"
,那么max_features=log2(n_features)
- 输入
"None"
,那么max_features=n_feature
。在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型学习不足。如果希望通过降维的方式防止过拟合,建议使用PCA,ICA或者特征选择模块中的降维算法。
min_impurity_decrease : float, default=0.0
限制信息增益的大小,信息增益小于设定数值的分枝不会发生。当一个节点的分枝后引起的不纯度降低大于或等于
min_impurity_decrease
中输入的数值,则这个分枝则会被保留,不会被剪枝。带权重的不纯度下降表示为:
其中 为样本总数, 为样本总数在当前节点上,是样本的数量 是叶子节点的样本数。
如果
"sample_weight"
在fit
接口中有值, 、 、 和 所有引用加权和,而非单纯的样本数量。class_weight : dict, list of dict or "balanced", default=None
以
{class_label: weight}
的形式与类关联的权重。如果None
列表中字典的权重的顺序需要与各个y
在标签数据集中的排列顺序相同。注意,对于多输出问题(包括多标签问题),定义的权重必须具体到每个标签下的每个类,其中类是字典键值对中的键。例如,对于四类多标签分类,权重应是
({0: 1, 1: 1}, {0: 1, 1: 5}, {0: 1, 1: 1}, {0: 1, 1: 1})
。而不是[{1:1},{2:5},{3:1},{4:1}]
。如果使用
"balanced"
模式,将会使用y的值来自动调整与输入数据中的类频率成反比的权重,如n_samples / (n_classes * np.bincount(y))
对于多输出,将
y
的每一列的权重相乘