您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

sklearn入门——决策树在sklearn中的实现

sklearn入门——决策树在sklearn中的实现

1、决策树的简介

​ 决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。在这个决策过程中,我们一直在对记录的特征进行提问。最初的问题所在的地方叫做根节点,在得到结 论前的每一个问题都是中间节点,而得到的每一个结论(动物的类别)都叫做叶子节点。

​ 例如说我们对新物种python,它是冷血动物,体表带鳞片,并且不是胎生,我们就可以通过这棵决策

树来判断它的所属类别。判断过程如下:
在这里插入图片描述

2、决策树算法的核心问题

  • 如何从数据表中找出最佳节点和最佳分枝?
  • 如何让决策树停止生长,防止过拟合?

3、sklearn中的决策树

3.1 sklearn建模的基本流程

这个流程对应的代码分别是:

from sklearn import tree  #导入需要的模块
clf=tree.DecisionTreeClassifier() #实例化
clf=clf.fit(x_train,y_train) #用训练集数据训练模型
result=clf.score(x_test,y_test) #导入测试集,从接口中调用需要的信息
3.2 分类树的八个参数

​ 八个参数:Criterion,两个随机性相关的参数(random_state,splitter),五个剪枝参数(max_depth,

min_samples_split,min_samples_leaf,max_feature,min_impurity_decrease)。

3.2.1 criterion

​ 为了要将表格转化为一棵树,决策树需要找出最佳节点和最佳的分枝方法,对分类树来说,衡量这个“最佳”的指标叫做“不纯度“,不纯度越低,决策树对训练集的拟合越好。对于不纯度指标来说,子节点的不纯度一定是低于父节点的。决策树的构建更像是一个将不纯度逐渐减少的过程。在sklearn中对于不纯度的计算总共有两种方法:

  • 输入”entropy“,使用信息熵。
  • 输入”gini“,使用基尼系数。

​ 在实际使用中,两种方法的效果基本相同,但是信息熵的计算比基尼系数缓慢一些,因为基尼系数的计算不涉及对数。对于这两种计算不纯度方式的选择,通常使用基尼系数。

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

wine = load_wine()
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
clf = tree.DecisionTreeClassifier(criterion="entropy")
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)

3.2.2 random_state & splitter

​ random_state用来设置分枝中的随机模式的参数,默认None,在高维度时随机性会表现更明显,低维度的数据(比如鸢尾花数据集),随机性几乎不会显现。输入任意整数,会一直长出同一棵树,让模型稳定下来。

​ splitter也是用来控制决策树中的随机选项的,有两种输入值:best和random。输入“random",决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。这也是防止过拟合的一种方式。

​ 当你预测到你的模型会过拟合,用这两个参数来帮助你降低树建成之后过拟合的可能性。如果树已经建成,我们还可以使用剪枝参数来防止过拟合。

clf = tree.DecisionTreeClassifier(criterion="entropy"
                                 ,random_state=30
                                 ,splitter="random"
                                 ,max_depth=3
                                 ,min_samples_leaf=10
                                 ,min_samples_split=10
                                 )
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)
score
3.2.3 max_depth

​ 用来限制树的最大深度,超过设定深度的树枝全部剪掉。在高维度低样本量时非常有效。决策树多生长一层,对样本量的需求会增加一倍,所以限制树深度能够有效地限制过拟合。实际使用时,建议从=3开始尝试,看看拟合的效果再决定是否增加设定深度。

3.2.4 min_samples_leaf & min_samples_split

​ min_samples_leaf限定,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生。

​ min_samples_split限定,一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生。

3.2.5 max_features & min_impurity_decrease

​ max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。一般用来限制高维度数据的过拟合的剪枝参数,但其方法比较暴力,是直接限制可以使用的特征数量而强行使决策树停下的参数,在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型学习不足。如果希望通过降维的方式防止过拟合,建议使用PCA,ICA或者特征选择模块中的降维算法。

​ min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生。

3.2.6 确认最优的剪枝参数

​ 有时候我们需要多次尝试才能确认最优的参数,这时候我们就要使用确定超参数的曲线来进行判断了。具体代码如下:

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()

​ 对于剪枝参数来说,也不一定可以提高模型在测试集上的表现,一切取决于数据本身。对于多参数学习曲线的确定,将在下一个案例中介绍。

3.3 重要的属性和接口

​ 对决策树来说,最重要的是feature_importances_,能够查看各个特征对模型的重要性。

#特征重要性
clf.feature_importances_

​ 四个接口包括:fit、score、apply、predict。

#apply返回每个测试样本所在的叶子节点的索引
clf.apply(Xtest)
#predict返回每个测试样本的分类/回归结果
clf.predict(Xtest)
#fit对模型进行训练
clf = clf.fit(Xtrain, Ytrain)
#返回模型在测试集上的准确率
score = clf.score(Xtest, Ytest)
3.4 树图形的绘制
import graphviz
feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素',\
                '颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
dot_data = tree.export_graphviz(clf
                               ,feature_names= feature_name
                               ,class_names=["茅台","五粮液","泸州老窖"] #对三个类别进行起名
                               ,filled=True #填充颜色
                               ,rounded=True #图形框框的形状
                               )  
graph = graphviz.Source(dot_data)
grap


​ 至此,我们已经简单了解了分类树和用决策树绘图(export_graphviz)的所有基础。我们了解了决策树的基本流程,分类树的八个参数,一个属性,四个接口,以及绘图所用的代码。有了这些知识,基本上分类树的使用大家都能够掌握了,接下来再到实例中去磨练就好。


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进