决策树


参考:

  1. 菜菜的sklearn
  2. sklearn中文文档
  3. sklearn英文文档
  4. 周志华:机器学习
  5. 机器学习实战
  6. 李航:统计学习

优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特 征数据。
缺点:可能会产生过度匹配问题。
适用数据类型:数值型和标称型。

决策树的一般流程
(1) 收集数据:可以使用任何方法。
(2) 准备数据:树构造算法只适用于标称型数据,因此数值型数据必须离散化。
(3) 分析数据:可以使用任何方法,构造树完成之后,我们应该检查图形是否符合预期。
(4) 训练算法:构造树的数据结构。
(5) 测试算法:使用经验树计算错误率。
(6) 使用算法:此步骤可以适用于任何监督学习算法,而使用决策树可以更好地理解数据的内在含义。

信息增益

熵和条件熵

熵(entropy) 时表示随机变量不确定性的度量。
X X X 时一个取有限个值的离散随机变量,其概率分布为:
P ( X = x i ) = p i , i = 1 , 2 , . . . , n , P(X=x_i)=p_i,i=1,2,...,n, P(X=xi)=pi,i=1,2,...,n则随机变量 X X X 的熵定义为:
H ( X ) = − ∑ i = 1 n p i log ⁡ p i 。 H(X) = -\sum_{i=1}^n p_i \log p_i。 H(X)=i=1npilogpi p i = 0 p_i=0 pi=0,则 0 log ⁡ 0 = 0 0\log 0 =0 0log0=0。熵越大,随机变量的不确定性就越大。而我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”(purity)越高越好,也就是熵越小越好。

设随机变量(X,Y),其联合概率分布为 P ( X = x i , Y = y j ) = p i j , i = 1 , 2 , . . . , n ; j = 1 , 2 , . . . , m , P(X=x_i,Y=y_j)=p_{ij},i=1,2,...,n;j=1,2,...,m, P(X=xi,Y=yj)=pij,i=1,2,...,n;j=1,2,...,m,条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性。随机变量X给定的额条件下随机变量Y的条件熵(conditional entropy)H(Y|X),定义为X给定条件下Y的条件概率分布的熵对X的数学期望 H ( Y ∣ X ) = ∑ i = 1 n p i H ( Y ∣ X = x i ) H(Y|X) = \sum^n_{i=1}p_iH(Y|X=x_i) H(YX)=i=1npiH(YX=xi) 这里 p i = P ( x = x i ) p_i=P(x=x_i) pi=P(x=xi)

信息增益和信息增益比

信息增益为集合D的经验熵与特征A给定条件下D的经验条件熵之差。

设训练数据集为D, ∣ D ∣ |D| D表示其样本容量,即样本个数。设又K个类 C k C_k Ck k = 1 , 2 , . . . , K k=1,2,...,K k=1,2,...,K,|C_k|为属于类 C k C_k Ck的样本个数, ∑ k = 1 K ∣ C k ∣ = ∣ D ∣ \sum_{k=1}^K|C_k| = |D| k=1KCk=D。设特征 A A A由n个不同的取值 { a 1 , a 2 , . . . , a n } \{a_1,a_2,...,a_n\} {a1,a2,...,an},根据特征A的取值将D划分为n个子集, D 1 , D 2 , . . . , D n D_1,D_2,...,D_n D1,D2,...,Dn ∣ D i ∣ |D_i| Di D i D_i Di的样本个数, ∑ i = 1 n ∣ D i ∣ = ∣ D ∣ \sum_{i=1}^n|D_i|=|D| i=1nDi=D。记子集 D i D_i Di中属于类 C k C_k Ck的样本的集合为 D i k D_{ik} Dik,即 D i k = D i ∩ C k D_{ik}=D_i\cap C_k Dik=DiCk ∣ D i k ∣ |D_{ik}| Dik D i k D_{ik} Dik的样本个数。

信息增益 g ( D , A ) g(D,A) g(D,A) 计算方法:

  1. 计算数据集D的经验熵 H ( D ) H(D) H(D) H ( D ) = ∑ k = 1 K ∣ C k ∣ ∣ D ∣ log ⁡ 2 ∣ C k ∣ ∣ D ∣ H(D)=\sum_{k=1}^K \frac{|C_k|}{|D|}\log_2\frac{|C_k|}{|D|} H(D)=k=1KDCklog2DCk
  2. 计算特征A对数据集D的经验条件熵 H ( D ∣ A ) H(D|A) H(DA): H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H ( D i ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ ∑ k = 1 K ∣ D i k ∣ ∣ D i ∣ log ⁡ 2 ∣ D i k ∣ ∣ D i ∣ H(D|A)=\sum_{i=1}n \frac{|D_i|}{|D|}H(D_i) = -\sum_{i=1}^n \frac{|D_i|}{|D|}\sum_{k=1}^K \frac{|D_{ik}|}{|D_i|}\log_2\frac{|D_{ik}|}{|D_i|} H(DA)=i=1nDDiH(Di)=i=1nDDik=1KDiDiklog2DiDik
  3. 计算信息增益:
    g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)H(DA)

信息增益比定义为其信息增益与训练数据集D关于特征A的值的熵之比。
信息增益比 g R ( D , A ) g_R(D,A) gR(D,A) 计算方法:
g R ( D , A ) = g ( D , A ) H A ( D ) , g_R(D,A) = \frac{g(D,A)}{H_A(D)}, gR(D,A)=HA(D)g(D,A) 其中, H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ log ⁡ 2 ∣ D i ∣ ∣ D ∣ , H_A(D) = -\sum_{i=1}^n \frac{|D_i|}{|D|}\log_2\frac{|D_i|}{|D|}, HA(D)=i=1nDDilog2DDi n n n时特征 A A A的取值个数。

基尼指数

分类问题中,假设有 K K K个类,样本点属于第 k k k类的概率为 p k p_k pk,则概率分布的基尼指数定义为: G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 . Gini(p)= \sum_{k=1}^Kp_k(1-p_k) = 1-\sum_{k=1}^K p_k^2. Gini(p)=k=1Kpk(1pk)=1k=1Kpk2.
对于二分类问题,若样本点属于第1个类的概率是 p p p,则概率分布的基尼指数为 G i n i ( p ) = 2 p ( 1 − p ) Gini(p) = 2p(1-p) Gini(p)=2p(1p)

对于给定的样本集合 D D D,其基尼指数为 G i n i ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(D) = 1-\sum^K_{k=1}\left(\frac{|C_k|}{|D|}\right)^2 Gini(D)=1k=1K(DCk)2其中, C k C_k Ck D D D中属于第 k k k类的样本子集, K K K是类的个数。
如果样本集合 D D D根据特征 A A A是否取某一可能值 a a a被分割成 D 1 D_1 D1 D 2 D_2 D2两部分,即 D 1 = { ( x , y ) ∈ D ∣ A ( x ) = a } , D 2 = D − D 1 D_1 = \{(x,y)\in D|A(x)=a\},D_2 = D- D_1 D1={(x,y)DA(x)=a},D2=DD1
则在特征A的条件下,集合D的基尼指数定义为: G i n i ( D , A ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ G i n i ( D 2 ) Gini(D,A) = \frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2) Gini(D,A)=DD1Gini(D1)+DD2Gini(D2)

决策树生成

决策树的生成方法主要包括ID3,C4.5和CART。其中,ID3以信息增益为准则类选择划分属性,一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的“纯度提升”越大。
然而,信息增益准则对可取值数目较多的属性有所偏好,为了减少这种偏好可能带来的不利影响,C4.5采用增益增益比来进行划分,然而增益比对可取值数目较少的属性有所偏好。所以,C4.5采用的方法为:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益比最高的。
CART决策树采用基尼指数来划分属性。一般选择是的划分后基尼指数最小的属性作为最优划分属性。

输入:训练集D = {(x_1,y_1),(x_2,y_2),…,(x_m,y_m)};属性集A ={a_1,a_2,…,a_m}
过程:函数TreeGenerage(D,A)
1. 生成结点node;
2. IF D 中样本全属于同一类别C then
3. 将node标记为C类叶结点;return;
4. END IF
5. IF A 为空集 或者D 中样本在A上取值相同, THEN
6. 将node标记为叶结点,其类别标记为D中样本数最多的类;RETURN
7. END IF
8. 从A中选择最优划分属性 a ∗ a* a
9. FOR a* 的每一个值 a ∗ v a*^v av DO:
10. 为node生成一个分支;令 D v D_v Dv表示D中在a*的样本子集;
11. IF D v D_v Dv为空,THEN
12. 将分支结点标记为叶结点,其类别标记为D中样本最多的类;RETURN;
13. ELSE
14. 以TreeGenerate ( D v , A { a ∗ } ) (D_v,A\{a*\}) (Dv,A{a}) 为分支结点
15. END IF
16. END FOR
输出:以node为根节点的一颗决策树。

决策树剪枝

预剪枝:对划分前后的泛化性能进行估计。
预剪枝可能使得决策树的很多分支都没有展开,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和预测时间开销。另一方面,有些分支的当前划分虽不能提升泛化性能,甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致性能显著提高。预剪枝基于“贪心”本质禁止这些分支展开,给预剪枝决策树带来了欠拟合的风险。

后剪枝:对一颗完整的决策树进行修剪。
一般情况下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝。但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大很多。

sklearn.tree

#A decision tree classifier.
tree.DecisionTreeClassifier([criterion,])	
#A decision tree regressor.
tree.DecisionTreeRegressor([criterion,])	
#An extremely randomized tree classifier.
tree.ExtraTreeClassifier([criterion,])
#An extremely randomized tree regressor.	
tree.ExtraTreeRegressor([criterion,])	
#Export a decision tree in DOT format.
tree.export_graphviz(decision_tree[,])	
#Plot a decision tree.
tree.plot_tree(decision_tree[, max_depth,])
#Build a text report showing the rules of a decision tree.	
tree.export_text(decision_tree[,])	

Tips on using sklearn.tree

  • Decision trees tend to overfit on data with a large number of features. Getting the right ratio of samples to number of features is important, since a tree with few samples in high dimensional space is very likely to overfit.
  • Consider performing dimensionality reduction (PCA, ICA, or Feature selection) beforehand to give your tree a better chance of finding features that are discriminative.
  • Understanding the decision tree structure will help in gaining more insights about how the decision tree makes predictions, which is important for understanding the important features in the data.
  • Visualise your tree as you are training by using the export function. Use max_depth=3 as an initial tree depth to get a feel for how the tree is fitting to your data, and then increase the depth.
  • Remember that the number of samples required to populate the tree doubles for each additional level the tree grows to. Use max_depth to control the size of the tree to prevent overfitting.
  • Use min_samples_split or min_samples_leaf to ensure that multiple samples inform every decision in the tree, by controlling which splits will be considered. A very small number will usually mean the tree will overfit, whereas a large number will prevent the tree from learning the data. Try min_samples_leaf=5 as an initial value. If the sample size varies greatly, a float number can be used as percentage in these two parameters. While min_samples_split can create arbitrarily small leaves, min_samples_leaf guarantees that each leaf has a minimum size, avoiding low-variance, over-fit leaf nodes in regression problems. For classification with few classes, min_samples_leaf=1 is often the best choice.
  • Balance your dataset before training to prevent the tree from being biased toward the classes that are dominant. Class balancing can be done by sampling an equal number of samples from each class, or preferably by normalizing the sum of the sample weights (sample_weight) for each class to the same value. Also note that weight-based pre-pruning criteria, such as min_weight_fraction_leaf, will then be less biased toward dominant classes than criteria that are not aware of the sample weights, like min_samples_leaf.
  • If the samples are weighted, it will be easier to optimize the tree structure using weight-based pre-pruning criterion such as min_weight_fraction_leaf, which ensure that leaf nodes contain at least a fraction of the overall sum of the sample weights.
  • All decision trees use np.float32 arrays internally. If training data is not in this format, a copy of the dataset will be made.
  • If the input matrix X is very sparse, it is recommended to convert to sparse csc_matrix before calling fit and sparse csr_matrix before calling predict. Training time can be orders of magnitude faster for a sparse matrix input compared to a dense matrix when features have zero values in most of the samples.

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)

属性是在模型训练之后,能够调用查看的模型的各种性质。对决策树来说,最重要的是feature_importances_,能够查看各个特征对模型的重要性。

模型参数
  • criterion: 确定不纯度的计算方法,帮忙找出最佳节点和最佳分枝,不纯度越低,决策树对训练集的拟合越好。不填默认基尼系数,填写gini使用基尼系数,填写entropy使用信息增益。通常就使用基尼系数;数据维度很大,噪音很大时使用基尼系数;维度低,数据比较清晰的时候,信息熵和基尼系数没区别;当决策树的拟合程度不够的时候,使用信息熵。
  • random_state用来设置分枝中的随机模式的参数,默认None,在高维度时随机性会表现更明显,低维度的数据随机性几乎不会显现。输入任意整数,会一直长出同一棵树,让模型稳定下来。
  • splitter也是用来控制决策树中的随机选项的,有两种输入值,输入”best",决策树在分枝时虽然随机,但是还是会 优先选择更重要的特征进行分枝(重要性可以通过属性feature_importances_查看),输入“random",决策树在 分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。这 也是防止过拟合的一种方式。当你预测到你的模型会过拟合,用这两个参数来帮助你降低树建成之后过拟合的可能 性。当然,树一旦建成,我们依然是使用剪枝参数来防止过拟合。
剪枝参数
  • max_depth:限制树的最大深度,超过设定深度的树枝全部剪掉。
    这是用得最广泛的剪枝参数,在高维度低样本量时非常有效。决策树多生长一层,对样本量的需求会增加一倍,所 以限制树深度能够有效地限制过拟合。在集成算法中也非常实用。实际使用时,建议从=3开始尝试,看看拟合的效 果再决定是否增加设定深度。
  • min_samples_leaf:限定一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生。一般搭配max_depth使用,在回归树中有神奇的效果,可以让模型变得更加平滑。
    这个参数的数量设置得太小会引起过拟合,设置得太大就会阻止模型学习数据。一般来说,建议从=5开始使用。如果叶节点中含有的样本量变化很 大,建议输入浮点数作为样本量的百分比来使用。同时,这个参数可以保证每个叶子的最小尺寸,可以在回归问题 中避免低方差,过拟合的叶子节点出现。对于类别不多的分类问题,=1通常就是最佳选择。
  • min_samples_split:限定,一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则 分枝就不会发生。
  • max_features:限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。和max_depth异曲同工, max_features是用来限制高维度数据的过拟合的剪枝参数,但其方法比较暴力,是直接限制可以使用的特征数量 而强行使决策树停下的参数,在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型 学习不足。如果希望通过降维的方式防止过拟合,建议使用PCA,ICA或者特征选择模块中的降维算法。
  • min_impurity_decrease:限制信息增益的大小,信息增益小于设定数值的分枝不会发生。这是在0.19版本中更新的 功能,在0.19版本之前时使用min_impurity_split。
用网格搜索调整参数
import numpy as np
gini_thresholds = np.linspace(0,0.5,20)
parameters = {'splitter':('best','random')
              ,'criterion':("gini","entropy")
              ,"max_depth":[*range(1,10)]
              ,'min_samples_leaf':[*range(1,50,5)]
              ,'min_impurity_decrease':[*np.linspace(0,0.5,20)]
}
clf = DecisionTreeClassifier(random_state=25)
GS = GridSearchCV(clf, parameters, cv=10)
GS.fit(Xtrain,Ytrain)
GS.best_params_
GS.best_score_
制图
feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜 色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
import graphviz
dot_data = tree.export_graphviz(clf
								,out_file = None
								,feature_names= feature_name ,class_names=["琴酒","雪莉","贝尔摩德"] ,filled=True
								,rounded=True
                               )
graph = graphviz.Source(dot_data)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值