scikit-learn中的决策树模型

scikit-learn决策树算法类库采用优化的CART树算法用来解决分类和回归问题,其具体实现类包括DecisionTreeClassifier、DecisionTreeRegressor、ExtraTreeClassifier和ExtraTreeRegressor。其中,DecisionTreeClassifier和ExtraTreeClassifier用于解决分类问题,而DecisionTreeRegressor和ExtraTreeRegressor用于解决回归问题。
决策树模型

1. 模型的主要参数

ExtraTree相当于高度随机化的DecisionTree,其参数的构成与对应的DecisionTree一模一样,只是在部分默认取值上有所差别。因此,本文仅罗列出DecisionTreeClassifier(分类树)和DecisionTreeRegressor(回归树)的参数对比。

模型参数Parameter含义DecisionTreeClassifierDecisionTreeRegressor
criterion分裂标准默认gini系数,也可设置为信息增益entropy。gini系数运算量相对小,但采用entropy模型生长更细腻(容易过拟合)。默认均方差mse,也可设为mae(绝对值误差)和改进后friedman_mse误差。
splitter 特征分裂点策略默认best,即穷举特征所有候选分裂点选择最优值。也可设置为random,此为ExtraTree的默认值,即随机采样若干候选分裂点进行选择。
max_depth树的深度树生长的最大深度,用于预剪枝,限制模型对应的函数空间。默认None,允许树模型无限生长。
min_samples_split节点分裂后子节点允许的最小样本数用于节点分裂后子节点的校验和撤回,属于后剪枝的范畴。可设为整数或全体样本量的百分比。
min_samples_leaf叶子节点最小样本数树生长过程中,各叶子节点允许的最小样本数量,用于预剪枝。相当于对叶子节点的正则化,在回归树中可用于光滑每个叶子节点的结果值。默认值为1。
min_weight_fraction_leaf叶子节点最小权重比例从样本权重的角度限制各叶子节点的样本规模,其效果同min_samples_leaf,默认值为0。
max_features每次分裂时选择的特征数默认为None,即选取全量特征。可设置为auto或sqrt,此为ExtraTree的默认值,即选择个全量特征的平方根进行分裂选择。此外可选参数还包括float((全量特征的比例)和log2(全量特征的对数值)
random_state随机种子用于限定模型中的随机性。决策树模型的随机性体现在三个方面:(1)max_features决定的特征选择的随机性;(2)splitter决定的特征分裂点选择的随机性;(3)每次分裂时特征选择的次序的随机性,进而可能导致最优分裂特征的随机(当存在若干组最优分裂策略时)
max_leaf_nodes最大叶子节点数允许模型拥有的最大叶子节点数目上限,用于限制模型规模,属于一种预剪枝策略。默认None,即无限生长。
min_impurity_decrease最小纯度增益若节点分裂后,纯度的提升值小于该阈值,则不进行本次分裂,用于限制模型规模。默认0。
min_impurity_split最小分裂纯度当节点的纯度小于该阈值时,停止分裂,作为叶子节点。是一种预剪枝策略。
class_weight类别权重调整不同类别样本的权重,常用于样本不均衡的分类问题。可用字典表示,或设为balanced进行自动计算。无该参数
presort 特征预排序是否在训练前对每个特征的大小值进行预排序,在小规模数量级上可能会提高训练速度。
2. 模型的主要方法
模型方法含义备注
fit模型训练注意其中的sample_weight参数(具体解释见下文)
predict预测结果根据样本所属路径,返回对应叶子节点的所属分类或者回归值
apply叶子节点索引根据样本所属路径,返回对应叶子节点的索引
predict_proba分类预测概率值仅在classifier中有该方法,根据样本所在节点的各类样本数量的比重返回概率值
predict_log_proba分类预测对数值仅在classifier中有该方法,根据样本所在节点的各类样本数量的比重的对数概率值

值的注意的决策树模型的min_weight_fraction_leafclass_weight等参数中均涉及到权重的概念,其实对于每个样本均可设置相应的权重,其也会影响到不纯度的计算和分裂结果。

因此,决策树除了上述初始化参数外,在fit函数中还包括一个能影响到模型的重要参数sample_weight。如果同时设置class_weightsample_weight又会如何呢?

模型的初始化(_init_)优先于训练(fit),因此答案为:sample_weight会覆盖掉class_weight

3. 模型的主要属性
模型属性含义备注
classes_样本分类结果适用于classifer的单分类结果,返回各样本的分类预测值
n_classes_ 样本分类结果适用于classifer的多分类结果,返回各样本的多分类预测值
feature_importances_特征权重基于gini数得到各特征的特征重要性
tree_含义返回生成的决策树对象,可用于可视化等场合。

其中,尤其要注意决策树的feature_importances_属性,其常被用来做特征选择。在树一类的模型中,常见的feature_importances_计算方法主要有两种:
方法一:gini importace
即基于gini增益的特征权重计算方法。这也是sklearn中所采用的计算方法。

具体而言,该方法为:
(1)计算每棵树(若为单棵决策树,计算一颗即可)中,不纯度(可以是gini,也可以推广到entropy、mse等指标)在某个特征分叉上的提升(一般会考虑样本数进行加权);
(2)若有多棵树,计算在各特征上不纯度提升的均值;
(3)以此均值作为特征权重。

方法二:variable importance

即基于OOB数据评分的特征权重计算方法。其逻辑很简单:若一个特征不重要,则随意将其取值,模型对变动后数据的预测能力应变化不大。该方法适用于采用行随机采样(样本随机),具有袋外OOB数据的树一类的模型,比如随机森林、BDT等。

具体而言,该方法为:
(1)对于每一棵树,取出其中的袋外数据。然后依次将袋外数据每个特征上的取值随机打乱(permute),计算该树模型下,打乱后袋外数据的预测评分相较于原始袋外数据的评分的降低程度。
(2)若有多棵树,计算在各特征上评分变化的均值;
(3)以此均值作为特征权重。

4. 决策树的可视化

决策树提供了多种可视化的方法,示例可参考该博客, 这里仅做简单介绍。

4.1 方法一
# step1: 先将决策树模型存入.dot文件
from sklearn import tree
with open("model.dot", 'w') as f:
    f = tree.export_graphviz(clf, out_file=f)     

# step2: 命令行进入当前目录,然后命令行执行如下命令,之后在当前目录就可以看到决策树的可视化文件
dot -Tpdf model.dot -o model.pdf   
4.2 方法二

使用pydotplus生成pdf文件

import pydotplus 
dot_data = tree.export_graphviz(clf, out_file=None) 
graph = pydotplus.graph_from_dot_data(dot_data) 
graph.write_pdf("model.pdf") 
4.3 方法三

可以直接在jupyter notebook中操作

from sklearn import tree
from IPython.display import Image  
dot_data = tree.export_graphviz(clf, out_file=None, 
                         feature_names=feature_names,  
                         class_names=class_names,  
                         filled=True, rounded=True,  
                         special_characters=True)   # 需定义特征名称和类名称
graph = pydotplus.graph_from_dot_data(dot_data)  
Image(graph.create_png()) 
5. 模型的调参

在scikit-learn中的决策树模型中,博主一般采用的调参逻辑为:
(1)根据问题类型和特点,选择并对比确定criterion
(2)将max_depthmin_samples_leafmin_samples_split联合调参,确定最佳max_depth;
(3)将min_samples_splitmin_samples_leaf联合调参,确认最佳min_samples_splitmin_samples_leaf
(4)调节max_features;
(5)视情调节其它与分裂或修剪相关参数

调参的其它注意事项:
(1)若要固定模型结果,需固定random_state参数
(2)对于不均衡样本,需调节class_weight,同时可考虑min_weight_fraction_leaf

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值