决策树——示例加源码讲解

Posted 啊~小 l i

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了决策树——示例加源码讲解相关的知识,希望对你有一定的参考价值。

1 概述

1.1 决策树是如何工作的

决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规
则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。决策树算法容易理解,适用各种数据,在解决各
种问题时都有良好表现,尤其是以树模型为核心的各种集成算法,在各个行业和领域都有广泛的应用。
我们来简单了解一下决策树是如何工作的。决策树算法的本质是一种图结构,我们只需要问一系列问题就可以对数
据进行分类了。比如说,来看看下面这组数据集,这是一系列已知物种以及所属类别的数据:

我们现在的目标是,将动物们分为哺乳类和非哺乳类。那根据已经收集到的数据,决策树算法为我们算出了下面的
这棵决策树:

可以看出,在这个决策过程中,我们一直在对记录的特征进行提问。最初的问题所在的地方叫做根节点,在得到结
论前的每一个问题都是中间节点,而得到的每一个结论(动物的类别)都叫做叶子节点。

  • 根节点:没有进边,有出边。包含最初的,针对特征的提问。
  • 中间节点:既有进边也有出边,进边只有一条,出边可以有很多条。都是针对特征的提问。
  • 叶子节点:有进边,没有出边,每个叶子节点都是一个类别标签。
  • 子节点和父节点:在两个相连的节点中,更接近根节点的是父节点,另一个是子节点。

决策树算法的核心是要解决两个问题:
1)如何从数据表中找出最佳节点和最佳分枝?
2)如何让决策树停止生长,防止过拟合?
理论公式介绍见我另一篇博文,链接——>数据分析45讲—决策树(笔记)

2 流程

2.1sklearn建模的基本流程

from sklearn import tree #导入需要的模块
clf = tree.DecisionTreeClassifier()     #实例化
clf = clf.fit(X_train,y_train) #用训练集数据训练模型
result = clf.score(X_test,y_test) #导入测试集,从接口中调用需要的信息

2.1决策树的流程


1.建立一棵树
1.1 导入算法库

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

2.1 探索数据

wine = load_wine()  # wine 其实就是一个字典
print(wine.data)  # 获取字典的键data对应的值类似于wine.get(data)
print(wine.target) 
data = pd.concat([pd.DataFrame(wine.data), pd.DataFrame(wine.target)], axis=1) # 使用pandans将data和target合并
print(data)

print(wine.feature_names) # 查看特征名
print(wine.target_names) # 查看类名

3.1 训练集验证集的划分

xtrain,xtest,ytrain,ytest = train_test_split(wine.data,wine.target,test_size=0.3) # 0.3指的是70%数据作训练,30%数据做测试
print(xtrain.shape)

4.1 建模

clf = tree.DecisionTreeClassifier(criterion="entropy")
clf.fit(xtrain,ytrain)
score = clf.score(xtest,ytest)
print(score)

4.2 画出一个树的模型
使用jupyter notebook画,使用 pycharm展示不出来

feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类',
                '花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
dot = tree.export_graphviz(clf,
                           feature_names=feature_name,
                           class_names=["琴酒","雪莉","贝尔摩德"],
                           filled=True,
                           rounded=True
                           )
graph = graphviz.Source(dot)
graph

如果展示图片报错!

graphviz官网下载安装包,配置到系统环境变量就可以了

注意:

  1. 框的颜色越浅,该节点的不纯度越高,也就是越难进行判断
  2. 信息熵(entropy):它表示了信息的不确定度。
    在信息论中,随机离散事件出现的概率存在着不确定性。为了衡量这种信息的不确定性,信息学之父香农引入了信息熵的概念,并给出了计算信息熵的数学公式:
  3. 决策树会依据数据的重要性进行剪枝,如决策树图里面,就用到了四个节点进行判断

决策树剪枝

  1. max_depth(限制树的最大深度,超过设定深度的树枝全部剪掉)用得最广泛的剪枝参数,在高维度低样本量时非常有效。决策树多生长一层,对样本量的需求会增加一倍,所以限制树深度能够有效地限制过拟合。
  2. min_samples_leaf或min_samples_split
  • min_samples_leaf限定,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生
  • min_samples_split限定,一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生。
  1. max_features或min_impuruty_decrease
  • max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。
  • min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生。这是在0.19版本种更新的功能,在0.19版本之前时使用min_impurity_split。
clf=tree.DecisionTreeClassifier(criterion=entropy"
                            	,random_state=30
                                ,splitter="random"
                                ,max_depth=3 # 最大深度为3
                                ,min_samples_leaf=10 # 每个节点至少有十个样本
                               ,min_samples_split=10
                               )
clf = clf.fit(Xtrain, Ytrain)

确认最右裁剪参数

test = []
for i in range(10):
    clf = tree.DecisionTreeClassifier(max_depth=i+1
                                     ,criterion="entropy"
                                     ,random_state=30
                                     ,splitter="random"
                                     )
    clf = clf.fit(xtrain, ytrain)
    score = clf.score(xtest, ytest)
    test.append(score)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend()
plt.show()


总结

分类树DecisionTreeClassifier和用决策树绘图(export_graphviz)的所有基础
决策树的基本流程,分类树的七个参数,一个属性,四个接口,以及绘图所用的代码。
七个参数:Criterion,两个随机性相关的参数(random_state,splitter),四个剪枝参数(max_depth, ,min_sample_leaf,max_feature,min_impurity_decrease)
一个属性:feature_importances_
四个接口:fit,score,apply,predict

参考哔哩哔哩菜菜TsaiTsai菜菜TsaiTsai

以上是关于决策树——示例加源码讲解的主要内容,如果未能解决你的问题,请参考以下文章

决策树——示例加源码讲解

决策树——示例加源码讲解

spark.mllib源码阅读-分类算法4-DecisionTree

spark.mllib源码阅读-分类算法4-DecisionTree

关于python编程决策树的问题,有没有大神来解答。。。

Matlab基于决策树算法实现多分类预测(源码可直接替换数据)