scikit-learn决策树算法类库采用优化的CART树算法用来解决分类和回归问题,其具体实现类包括DecisionTreeClassifier、DecisionTreeRegressor、ExtraTreeClassifier和ExtraTreeRegressor。其中,DecisionTreeClassifier和ExtraTreeClassifier用于解决分类问题,而DecisionTreeRegressor和ExtraTreeRegressor用于解决回归问题。
1. 模型的主要参数
ExtraTree相当于高度随机化的DecisionTree,其参数的构成与对应的DecisionTree一模一样,只是在部分默认取值上有所差别。因此,本文仅罗列出DecisionTreeClassifier(分类树)和DecisionTreeRegressor(回归树)的参数对比。
模型参数 | Parameter含义 | DecisionTreeClassifier | DecisionTreeRegressor |
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_leaf
和class_weight
等参数中均涉及到权重的概念,其实对于每个样本均可设置相应的权重,其也会影响到不纯度的计算和分裂结果。
因此,决策树除了上述初始化参数外,在fit函数中还包括一个能影响到模型的重要参数sample_weight
。如果同时设置class_weight
和sample_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_depth
与min_samples_leaf
或min_samples_split
联合调参,确定最佳max_depth;
(3)将min_samples_split
、min_samples_leaf
联合调参,确认最佳min_samples_split
和min_samples_leaf
(4)调节max_features
;
(5)视情调节其它与分裂或修剪相关参数
调参的其它注意事项:
(1)若要固定模型结果,需固定random_state
参数
(2)对于不均衡样本,需调节class_weight
,同时可考虑min_weight_fraction_leaf