Python 决策树调参

系列文章目录

https://www.jianshu.com/p/1f20e2362676
https://blog.csdn.net/linzhjbtx/article/details/85722187
https://www.cnblogs.com/chenyaling/p/7236435.html
https://bluebird.blog.csdn.net/article/details/98595483



决策树简介

决策树概念:决策树(Decision Trees)是一种非参监督学习方法,即没有固定的参数,对数据进行分类或回归学习。决策树的目标是从已知数据中学习得到一套规则,能够通过简单的规则判断,对未知数据进行预测。这里我们只讨论决策树分类的功能。

决策树组成:根节点、非叶子节点(也叫决策点、子节点、内部节点)、分支(有向边)、叶子节点(叶节点)。其中非叶子节点是一个分支的终点,无法继续分离。

决策流程:所有的数据,从根节点开始,根据某一特征的条件进行分配,进入不同的子节点,不断递归,最终到达叶子节点停止。例如下图是一个判断一家人谁爱玩游戏的决策树。

在这里插入图片描述


一、参数

参数参数名称
参数解释
criterion特征选择标准【entropy, gini】。默认gini,即CART算法。前者是基尼系数,后者是信息熵。两种算法差异不大对准确率无影响,信息墒运算效率低一点,因为它有对数运算.一般说使用默认的基尼系数”gini”就可以了,即CART算法。除非你更喜欢类似ID3, C4.5的最优特征选择方法。
splitter特征划分标准【best, random】。best在所有的特征中找出最优的划分点,random在部分特种中随机找局部最优的划分点。默认的‘best’适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐‘random’。
max_depth决策树最大深度1、防止过拟合。

2、默认值是‘None’。一般数据比较少或者特征少的时候可以不用管这个值,如果模型样本数量多,特征也多时,推荐限制这个最大深度,具体取值取决于数据的分布。常用的可以取值10-100之间,常用来解决过拟合。
min_samples_split内部节点再划分所需最小样本数(即判再划分断条件)1、【int, float】。默认值为2,如果是int,则取传入值本身作为最小样本数;如果是float,则取ceil(min_samples_split*样本数量)作为最小样本数(向上取整)。

2、如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。划分得越多,越准确,但是过拟合的可能越大。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
min_samples_leaf叶子节点最少样本数1、如果是int,则取传入值本身作为最小样本数;如果是float,则取ceil(min_samples_leaf*样本数量)的值作为最小样本数。这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。

2、如果样本量不大,不需要管这个值,大些如10W可是尝试下5
min_weight_fraction_leaf叶子节点最小的样本权重和1、这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。默认是0,就是不考虑权重问题,所有样本的权重相同。

2、一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
max_features特征数量默认是None(所有),可选参数还有log2,sqrt,N , 特征小于50的时候一般使用所有的
max_leaf_nodes最大叶子节点数通过设置最大叶子节点数,可以防止过拟合。默认值None,默认情况下不设置最大叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征多,可以加限制,具体的值可以通过交叉验证得到。
min_impurity_decrease节点划分最小不纯度默认值为‘0’。限制决策树的增长,节点的不纯度(基尼系数,信息增益,均方差,绝对差)必须大于这个阈值,否则该节点不再生成子节点。
class_weight类别权重1、【dict, list of dicts, balanced】,默认为None。(不适用于回归树,sklearn.tree.DecisionTreeRegressor)

2、指定样本各类别的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。balanced,算法自己计算权重,样本量少的类别所对应的样本权重会更高。如果样本类别分布没有明显的偏倚,则可以不管这个参数。
presort预分数据来加快树的构建默认是False,表示在进行拟合之前,是否预分数据来加快树的构建。对于数据集非常庞大的分类,presort=true将导致整个分类变得缓慢;当数据集较小,且树的深度有限制,presort=true才会加速分类。
random_state随机种子

二、常用函数

解释函数
训练(拟合)fit(train_x, train_y)
预测predict(x)   返回标签
predict_log_proba(x)、predict_proba(x)  返回概率,每个点的概率和为1,一般取predict_proba(x)[:, 1]
评分(返回平均准确度)score(test_x, test_y),等效于准确率accuracy_score
获取分类器的参数get_params([deep])
设置分类器的参数set_params(params)
print(clf.get_params()) ,clf.set_params(
*)
返回每个样本被预测为叶子的索引apply(x[, check_input])
返回树的决策路径decision_path(x[, check_input])
获取决策树的深度get_depth()
获取决策树的叶子节点数get_n_leaves()

三、模型调参注意事项

1、当样本少数量但是样本特征非常多的时候,决策树很容易过拟合,一般来说,样本数比特征数多一些会比较容易建立健壮的模型

2、如果样本数量少但是样本特征非常多,在拟合决策树模型前,推荐先做维度规约,比如主成分分析(PCA),特征选择(Losso)或者独立成分分析(ICA)。这样特征的维度会大大减小。再来拟合决策树模型效果会好。

3、推荐多用决策树的可视化,同时先限制决策树的深度(比如最多3层),这样可以先观察下生成的决策树里数据的初步拟合情况,然后再决定是否要增加深度。

4、在训练模型先,注意观察样本的类别情况(主要指分类树),如果类别分布非常不均匀,就要考虑用class_weight来限制模型过于偏向样本多的类别。

5、决策树的数组使用的是numpy的float32类型,如果训练数据不是这样的格式,算法会先做copy再运行。

6、如果输入的样本矩阵是稀疏的,推荐在拟合前调用csc_matrix稀疏化,在预测前调用csr_matrix稀疏化。


总结

如果使用默认DecisionTreeClassifier的参数,得到的AUC较低,很可能是因为出现过拟合,需调整默认参数,避免过拟合。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值