决策树——示例加源码讲解
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官网下载安装包,配置到系统环境变量就可以了
注意:
- 框的颜色越浅,该节点的不纯度越高,也就是越难进行判断
- 信息熵(entropy):它表示了信息的不确定度。
在信息论中,随机离散事件出现的概率存在着不确定性。为了衡量这种信息的不确定性,信息学之父香农引入了信息熵的概念,并给出了计算信息熵的数学公式:
- 决策树会依据数据的重要性进行剪枝,如决策树图里面,就用到了四个节点进行判断
决策树剪枝
- max_depth(限制树的最大深度,超过设定深度的树枝全部剪掉)用得最广泛的剪枝参数,在高维度低样本量时非常有效。决策树多生长一层,对样本量的需求会增加一倍,所以限制树深度能够有效地限制过拟合。
- min_samples_leaf或min_samples_split
- min_samples_leaf限定,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生
- min_samples_split限定,一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生。
- 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