决策树参数调节

基本的决策树语法如下

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
cancer=load_breast_cancer()
X_train,X_test,y_train,y_test=train_test_split(
    cancer.data,cancer.target,stratify=cancer.target,random_state=42)
tree=DecisionTreeClassifier(random_state=0)
tree.fit(X_train,y_train)

倒数第二行,我们使用默认的决策树创建类型,这样会导致训练集上绝对的吻合,模型出现严重的过拟合。
因此我们有必要了解DecisionTreeClassifier函数的参数意义,以及针对不同类型的数据如何选择。

DecisionTreeClassifier的典型参数

  • criterion(特征选择标准)
    可选择ceriterion=‘gini’ 或ceriterion=‘entropy’
    前者是基尼系数,后者是信息熵。两者差别不大,默认使用gini系数
  • splitter(特征划分标准)
    可选择splitter='best’或splitter=‘random’
    前者在特征的所有划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。默认使用best,它适合样本量不大的情况,若样本量较大,推荐使用random
  • max_depth(决策树最大深度)
    默认为Non,可赋int值。
    在样本量多,特征多的时候,可设置max_depth来解决过拟合问题。
  • min_impurity_decrease(节点划分最小不纯度)
    默认为0,可赋float值。
    这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点。
  • min_samples_split(内部节点再划分所需最小样本数)
    默认为2,可赋int或float值。若为float则向上取整
    顾名思义,但在样本数较少时几乎没有影响
  • min_samples_leaf(叶子节点最少样本数)
    可赋int或float值
    这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。
  • max_leaf_nodes(最大叶子节点数)
    默认为0,可赋int值
    通过限制最大叶子节点数,可以防止过拟合,默认是”None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
  • min_impurity_split(信息增益的阀值)
    决策树在创建分支时,信息增益必须大于这个阀值,否则不分裂
  • min_weight_fraction_leaf(叶子节点最小的样本权重和)
    默认为0,可赋float值
    这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
  • class_weight(类别权重)
    默认是non,可选择class_weight=‘balanced’
    指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数。
    另外,non不适用与回归树。
    这些参数放在这里做参考,没必要也没法完全明白它们的意义。在实际调整中不断完善对它们的理解。

模型调参注意事项

  • 当样本少数量但是样本特征非常多的时候,决策树很容易过拟合,一般来说,样本数比特征数多一些会比较容易建立健壮的模型
  • 如果样本数量少但是样本特征非常多,在拟合决策树模型前,推荐先做维度规约,比如主成分分析(PCA),特征选择(Losso)或者独立成分分析(ICA)。这样特征的维度会大大减小。再来拟合决策树模型效果会好。
  • 推荐多用决策树的可视化,同时先限制决策树的深度(比如最多3层),这样可以先观察下生成的决策树里数据的初步拟合情况,然后再决定是否要增加深度。
  • 在训练模型先,注意观察样本的类别情况(主要指分类树),如果类别分布非常不均匀,就要考虑用class_weight来限制模型过于偏向样本多的类别。
  • 决策树的数组使用的是numpy的float32类型,如果训练数据不是这样的格式,算法会先做copy再运行。
  • 如果输入的样本矩阵是稀疏的,推荐在拟合前调用csc_matrix稀疏化,在预测前调用csr_matrix稀疏化。

你可能感兴趣的:(决策树及其集成)