决策树(分类树)

决策树是一种非参数有监督学习方法,能从一系列有特征和标签的数据中总结出决策规则,并以树状图呈现窗出来,用来解决分类和回归问题。决策树容易理解,适用于各种数据
决策树的本质是一种图结构,只需要问一系列问题就可以对数据进行分类了。

sklearn建模流程,一共三步。

在这里插入图片描述

1.实例化,建立模型评估对象
2.通过模型接口训练模型,fit
3.通过模型接口提取自己需要的信息

from sklearn import tree           #导入需要的模块

clf=tree.DecisionTreeClassifier    #实例化
clf=clf.fit(xtrain,ytrain)         #用训练集数据训练模型
result=clf.score(xtest,ytest)      #导入测试集,从接口中调用需要的信息

在这里插入图片描述

节点

根节点:没有进边,只有出边,针对特征的提问。
中间节点:有进边也有出边,进边只有一条,出边有一条或多条,针对特征的提问。
叶子节点:有进边,没有出边,每个叶子节点都是一个类别标签

子节点和父节点:在两个相连的节点中,更靠近根节点的为父节点。

重要参数(不纯度)

为将表格转为一棵树,决策树需要找出最佳节点和最佳分支,对分类树来说,衡量这一最佳指标叫做不纯度。通常来说,不纯度越低,决策树的训练集的拟合效果越好。现在使用的决策树算法在分支方法上的核心大多是围绕在对某个不纯度相关指标的优化。
不纯度基于节点来计算,每个分支都有一个不纯度,而且子节点的不纯度一定低于父节点,也就是说,在一棵数上,叶子节点的不纯度是最低的。

Criterion这个参数正是用来计算不纯度的,sklearn提供了两种选择,
1)输入‘entropy’,使用信息熵(Entropy)
2)输入‘gini’,使用基尼系数(Gini Impurity)
在这里插入图片描述
当特征很多时,使用信息熵可能会过拟合
当特征很少时,使用信息熵,此时更精细。
在这里插入图片描述
在这里插入图片描述

代码展示

#1.导入需要的算法和模块
%matplotlib inline
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

#2.数据
wine=load_wine()
wine.data.sklearnhape
wine.target.shape

#如果wine是一张表,wine应该张这样
import pandas as pd
pd.concat([pd.DataFramea(wine.data)],[pd.DataFramea(wine.target),axis=1])

wine.feature_names
wine.target_names

#3.分训练集和测试集
xtrain,xtest,ytrain,ytest=train_test_split(wine.data.wine.target,test_size=0.3)
xtrain.shape
xtest.shape

#4.建立一个模型
clf=tree.DecisionTreeClassifier(criterion='entropy',random_state=30)
clf=clf.fit(xtrain,ytrain)
result=clf.score(xtest,ytest)  #返回预测的准确度

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

#6.探索决策树
#特征重要性
clf.feature_importances_
[*zip(feature_names,clf.freature_importances_)]




#查看训练的效果如何?
clf=tree.DecisionTreeClassifier(criterion='entropy',random_state=30)
clf=clf.fit(xtrain,ytrain)
score_train=clf.score(xtrain,ytrain)

画出的决策树如下图:
在这里插入图片描述

random_state& splitter
random_state设置随机性,设置好后预测值就不变化了。
splitter有两种选择,1)是‘best’,2)是‘random’。输入’random’可以抑制过拟合。当然,树一旦建成,我们使用剪枝来防止过拟合

剪枝(参数)

在不加限制的情况下,决策树往往会过拟合,也就是说:在训练集上表现很好,但在测试集上表现糟糕。这是由于一棵决策树对于训练数据有了过于优秀的解释,它找出的规则必然包含了训练样本中的噪声,并使它对未知数据的拟合程度不足。

#我们对树对于训练集的拟合程度如何?
score_train=clf.score(xtrain,ytrain)

为了让决策树有更好的泛化性,我们要对决策树进行剪枝。剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树算法的核心。sklearn为我们提供了不同的剪枝策略:
max_depth:
限制树的最大深度,超过的就剪掉。
对多维度小样本量十分有效,决策树多生长一层,对样本的需求量就会增加一倍。建议从3开始,根据拟合效果再决定是否增加树深度。

min_samples_leaf
min_samples_split
max_features
min_impurity_decrease

确认最优的剪枝参数

import matplotlib.pyplot as plt
test=[]
for i in range(10):
    clf=tree.DecisionTreeClassifier(criterion='gini'
                                    , max_depth=i+1
                                    , splitter='random'
                                    , random_state=30
    
    )
    clf=clf.fit(xtrain,ytrain)
    result=clf.score(xtest,ytest)
    test.append(result)
plt.plot(range(1,11),test,color='r',label='max_depth')
plt.legend()
plt.show()

在这里插入图片描述
从上图看出,当max_depth等于4时,准确度是最高的。
其他的的剪枝参数也可以按照上面的for循环来确认最优的剪枝参数。
思考:这么多参数,我们要一个个的画学习曲线吗?有其他的方法吗?在下面的泰坦尼克号案例将解答这一问题。
使用 网格搜索可以解决这一问题。

目标权重参数

class_weight & min_weight_fraction_leaf

分类树(重要接口)

clf.apply(test)        #apply返回每个测试样本所在叶子节点的索引
c**加粗样式**lf.predict(xtest)     #predict返回每个测试样本的分类/回归

在这里插入图片描述
至此,我们已经学完了分类数和利用决策树绘图(export_graphviz)的所有基础,了解了决策树的基本流程,分类树的八个参数一个属性四个接口,以及绘图所用的代码。

决策树非常容易过拟合,为了防止决策树的过拟合,我们要对决策树进行剪枝。sklearn中提供了大量的剪枝参数,见上。

思考:决策树的核心问题有两个?

1)如何找出正确的特征进行提问?即如何分枝?
2)树生长到什么时候停下?

解答问题1:对于第一个问题,我们提出了衡量质量的指标不纯度,每次分枝时,决策树对所有的节点进行不纯度计算,选取最低的不纯度特征进行分枝。分枝后,又再被分枝的不同取值下,计算每个特征的不纯度,继续选不纯度最低的进行分枝。分类树的不纯度用基尼系数或者信息熵来衡量。回归树的不纯度用MSE来衡量

解答问题2:每分枝一层,决策树的不纯度会越来越小,直到没有多余的特征可用,或整体的不纯度已经最优时,决策树就会停止生长。

下表是分类树参数,属性和接口的总结。

分类树的参数列表

在这里插入图片描述
在这里插入图片描述

分类树的属性列表

在这里插入图片描述

分类树的接口列表

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值