决策树

算法简介

         决策树是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。这是一种基于 if-then-else 规则的监督学习算法,决策树的这些规则通过训练得到,而不是人工制定的。

  在分类问题中,表示基于特征对实例进行分类的过程。学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型;预测时,对新的数据,利用决策模型进行分类。

    决策树有两大优点:1)决策树模型可读性好,具有描述性,有助于人工分析;2)效率高,决策树只需要一次构建,反复使用,每一次预测的最大计算次数不超过决策树的深度。

决策树的目标

  1.决策树的本质:从训练数据集中归纳出一组if-then分类规则

  2.我们需要选择一个与训练数据集矛盾较小的决策树

  3.另一个角度,可以把决策树看成一个概率模型,目标是将实例划分到条件概率更大的一类中去

  4.从所有可能中选择最优决策树是一个NP完全问题,通常采用启发式算法,得到次最优解

  5.每一步选择当前分类效果最好的特征。采用递归算法:选择最优特征,并根据该特征对训练数据进行分割,使得各个子数据集都有个最好分类

决策树学习的三个步骤:

1.特征选择

  特征选择决定了使用哪些特征来做判断。在训练数据集中,每个样本的属性可能有很多个,不同属性的作用有大有小。因而特征选择的作用就是筛选出跟分类结果相关性较高的特征,也就是分类能力较强的特征。在特征选择中通常使用的准则是:信息增益。 熵减小,信息增多。分类后信息增益越大越好,选取信息增益最大的特征。

                             

                           

2.决策树生成

  选择好特征后,就从根节点触发,对节点计算所有特征的信息增益,选择信息增益最大的特征作为节点特征,根据该特征的不同取值建立子节点;对每个子节点使用相同的方式生成新的子节点,直到信息增益很小或者没有特征可以选择为止。

  ID3:找信息增益最大的特征,然后按照此特征进行分类,然后再找到子集中信息增益最大的特征,分类...

  C4.5:用信息增益比来选择特征,解决了ID3存在越细小的分割分类错误率越小的问题。

  CART:由特征选择、树的生成和减枝三部分组成,CART也被成为回归分类树,它是一个二叉树。所以CART只能将一个父节点分成两个子节点,这里通过Gini指数来决定如何分裂。

3.决策树剪枝

  剪枝的主要目的是对抗“过拟合”,通过主动去掉部分分支来降低过拟合的风险。

  1.预剪枝:在节点划分前来确定是否继续增长。及早停止增长的主要方法有:

    节点内数据样本低于某一阈值;

    所有节点特征都已分裂;

    节点划分前准确率比划分后准确率高。

  预剪枝不仅可以降低过拟合的风险而且还可以减少训练时间,但另一方面它是基于“贪心”策略,会带来欠拟合风险。

  2.后剪枝:在已经生成的决策树上进行剪枝,从而得到简化版的剪枝决策树。

       C4.5 采用的悲观剪枝方法,用递归的方式从低往上针对每一个非叶子节点,评估用一个最佳叶子节点去代替这课子树是否有益。如果剪枝后与剪枝前相比,其错误率是保持或者下降,则这棵子树就可以被替换掉。C4.5 通过训练数据集上的错误分类数量来估算未知样本上的错误率。

  后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但同时其训练时间会大的多。

代码实现:

  基于sklearn的决策树代码实现。

1 # 数据导入与切分
2 from sklearn.datasets import load_iris
3 from sklearn.tree import DecisionTreeClassifier
4 from sklearn.model_selection import train_test_split
5 iris = load_iris()
6 X = iris.data
7 Y = iris.target

  针对不同算法的决策树构建,我们需要调整DecisionTreeClassifier中的参数。以criterion为例,entropy代表通过信息熵对节点做分化,gini代表通过Gini指数对节点做分化。

1 DST = DecisionTreeClassifier(criterion='entropy')# 信息熵
2 x_train,x_test,y_train,y_test = train_test_split(X,Y,test_size=0.3,random_state=0)
3 DST.fit(x_train,y_train)
4 from sklearn import metrics
5 pred = DST.predict(x_test)
6 accuracy = metrics.accuracy_score(y_test,pred)
7 print("The accuracy is %.3f"% accuracy)
posted @ 2022-03-17 14:57  hungry_J  阅读(18)  评论(0)    收藏  举报