python--决策树讲解

介绍
1.决策树是一种非参数的有监督学习,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。

具体流程
1.实例化,建立评估模型对象
2.通过模型接口训练模型
3.通过模型接口提取需要的信息
代码例子

from sklearn import tree              #导入需要的模块,即sklearn,或者其中的tree
clf=tree.DecisionTreeClassifier()   #实例化
clf=clf.fit(x_train,y_train)                #用训练集数据训练模型
result=clf.score(x_test,y_test)          # 导入测试集,从接口调用需要的信息,如对模型打分

2**.DecisionTreeClassifier**
函数原型:class 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)

2.1重要参数
2.1.1criterion
为了要将表格转化为一棵树,决策树需要找出最佳节点和最佳的分枝方法,对分类树来说,衡量这个最佳的指标叫做“不纯度”。通常来说,不纯度越低,决策树对训练集拟合越好。现在使用的决策树在分枝方法上的核心大多是围绕在对某个不纯度相关指标的最优化上。不纯度基于节点来计算,树中的每个节点都会有一个不纯度,并且子节点的不纯度一定低于父节点的,也就是说,在同一颗决策树上,叶子节点的不纯度一定是最低的。Criterion这个参数正是用来决定不纯度的计算方法的,sklearn提供了两种选择:
1)输入“entropy”,使用信息熵
2)输入“gini”,使用基尼系数(Gini Impurity)
当使用信息熵时,sklearn实际计算的时基于信息熵的信息增益(information Gain),即父节点的信息熵和子节点的信息熵之差。比起基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强。但是在实际使用中,信息熵和基尼系数的效果基本相同。信息熵的计算比基尼系数缓慢一些,因为基尼系
数的计算不涉及对数。另外,因为信息熵对不纯度更加敏感,所以信息熵作为指标时,决策树的生长会更加精细,因此对于高维数据或者噪音很多的数据,信息熵很容易过拟合,基尼系数在这种情况下效果往往比较好。
无论决策树如何变化,在分枝上的本质都还时追求某个不存度相关的指标的优化,而不纯度是基于节点来计算的,也就是说,决策树在建树时,是靠优化节点来追求一颗优化的树,但最优的节点并不能保证最优的树,集成的算法被用来解决这个问题:sklearn表示,既然一棵树不能保证最优,那就建更多的树,然后从中取最好的,那怎样从一组数据中建不同的树呢?在每次分枝时,不从使用全部特征,而是随机选取一部分特征,从中选取不纯度相关指标最优的作为分枝用的节点,这样,每次生成的树也就不同。
2.1.2 random_state&splitter
random_state用来设置分枝中的随机模式的参数,默认None,在高维度时随机性会表现的更明显,在低维度中,随机性几乎不会显现。输入任意整数,会一直长出同一颗树让模型稳定下来。splitter也是用来控制决策树进行分枝(重要性可以通过属性feature_importances_查看,应该会输出相应的权重),输入“random”,决策树在分枝时会更加随机,树会更深,对训练集的拟合将会降低。这也是防止过拟合的一种方式,当你预测到你的模型会过拟合,用这两个参数帮助你降低过拟合的可能性

2.1.3剪枝参数
在不加限制的情况下,一颗决策树会生长到衡量不纯度的指标最优,或者没有更多的特征可用为止,这样的决策树往往会过拟合,这就是说,它会在训练集上表现很好,在测试集上却表现很糟糕。我们收集的样本数据不可能和整体的状况完全一致,因此当一颗决策树对训练数据有了过于优秀的解释性,它找出的规则必然包含了训练样本中的噪声,并使它对未知数据的拟合程度不足。为了让决策树有更好的泛化性,我们要对决策树进行剪枝。剪枝策略对决策树的影响巨大,正确的剪枝策略使优化决策树算法的核心,sklearn为我们提供了不同的剪枝策略:
1)max_depth
.限制树的最大深度,超过设定深度的树枝全部剪掉
这是用得最广泛的剪枝参数,在高维度低样本量时非常有效。决策树多生长一层对样本量的需求会增加一倍,所以限制树深度能够有效限制过拟合,实际使用时,建议从3开始尝试,看看拟合效果再决定是否增加设定深度。
2)min-samples_leaf&min_samples_split
min-samples_leaf限定,一个节点在分枝后的每一个子节点都必须包含min_samples_leaf个训练样本,否则枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生。一般搭配max_depth使用,在回归树中有神奇的效果,可以让模型更加平滑。这个参数的数量设置得太小会引起过拟合,设置得太大就会阻止模型学习数据,一般来说,建议从5开始使用。如果叶节点含有的样本量变化很大,建议输入浮点型数作为样本量的百分比来使用,同时,这个参数可以保证每个叶子的最小尺寸,可以在回归中避免低方差,过拟合的子节点出现mim_samples_split限定,一个节点就必须要包含至少min_samples_split个样本,这个节点猜允许被分枝。
3)max_features&min_impurity_decrease
max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。和max_depth异曲同工,max_features是用来限制高维度数据的过拟合的剪枝参数,但其方法比较暴力,是直接限制可以使用的特征数量而强行使决策树停下 的参数,在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型学习不足。如果希望通过降维的方式防止过拟合,建议使用PCA,ICA或者特征选择模块中的降维算法。min_impurity_decrease限制信息熵增益的大小,信息增益小于设定的数值的分枝不会发生,这是0.19版本中更新的功能,0.19版本之前使用min_impurity_split。

2.2重要属性和接口
属性是在模型训练之后,能够调用查看的模型的各种性质。sklearn中有许多算法的接口都是相似的,比如说fit和score,几乎对每个算法都可以使用。除了这两个接口之外,决策树最常用的接口还有apply和predict。apply中输入测试集返回每个测试集样本所在的叶子节点的索引,predict输入测试返回每个测试样本的标签。

总结:这一篇介绍了分类树DecisionTreeClassifier和用决策树绘图(export_graphviz)的所有基础。
七个参数:Criterion,两个随机性相关的参数(random_state,splitter),四个剪枝参数(max_depth,min_sample-leaf,max_feature,min_impurity_decrease)
一个属性:feature_importances_
四个接口:fit,score,apply,predict

发布了27 篇原创文章 · 获赞 16 · 访问量 1901

猜你喜欢

转载自blog.csdn.net/weixin_43979090/article/details/97245221
今日推荐