其他分享
首页 > 其他分享> > 决策树(1. 回归树)

决策树(1. 回归树)

作者:互联网

文章目录


前言

使用红酒数据集来进行对决策树中分类树(tree.DecisionTreeClassififier)的学习


一、重要参数

1.1 criterion

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

criterion参数是用来决定不纯度的计算方法的。sklearn提供了两种选择
1)输入”entropy“,使用信息熵(Entropy)

2)输入”gini“,使用基尼系数(Gini Impurity)

在这里插入图片描述
其中t代表给定的节点i代表标签的任意分类p(i|t)代表标签分类i在节点t上所占的比例。注意,当使用信息熵时,sklearn实际计算的是基于信息熵的信息增益(Information Gain),即父节点的信息熵和子节点的信息熵之差。

参数criterion
如何影响模型?确定不纯度的计算方法,帮忙找出最佳节点和最佳分枝,不纯度越低,决策树对训练集的拟合越好
可能的输入有哪些?不填默认基尼系数,填写gini使用基尼系数,填写entropy使用信息增益
怎样选取参数?通常就使用基尼系数,数据维度很大,噪音很大时使用基尼系数,维度低,数据比较清晰的时候,信息熵和基尼系数没区别,当决策树的拟合程度不够的时候,使用信息熵,两个都试试,不好就换另外一个

建立一棵树的步骤

  1. 导入需要的算法库和模块

    from sklearn import tree #决策树的类都在这个tree模块下
    from sklearn.datasets import load_wine #load_wine是红酒数据集,datasets内包含很多种数据集
    from sklearn.model_selection import train_test_split#用于切分数据集,分割出训练集和测试集
    
  2. 对数据的探索

    wine = load_wine()#红酒数据集
    
    '''
    可以取出数据进行观看
    '''
    wine.data
    wine.target
    wine.data.shape#data的结构几行几列
    

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

  3. 将数据集表格化观察

    import pandas as pd
    pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
    '''
    将data和target表格化并且以列的形式拼接
    '''
    

    在这里插入图片描述

  4. 分隔训练集和测试集

    Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data, wine.target, test_size=0.3)
    '''
    train_test_split划分测试集和训练集是随机划分的
    
    wine.data: 特征数据
    wine.target: 标签
    test_size: 百分之三十用于做测试集,百分之七十用于做训练集
    前面变量的顺序需要注意,如果弄错了会非常麻烦
    '''
    Xtrain.shape#查看分好的结构
    
  5. 建立模型

    clf = tree.DecisionTreeClassifier(criterion='entropy')#如果不填写默认的是基尼系数
    
    clf = clf.fit(Xtrain,Ytrain)#用于训练的接口
    score = clf.score(Xtest,Ytest)#将测试集带入返回预测的准确度
    
  6. 画出树

    import graphviz
    
    #特征名称
    feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
    
    #使用export_graphviz画树
    dot_data = tree.export_graphviz(clf
                                    ,feature_names = feature_name
                                    ,class_names = ["琴酒","雪莉","贝尔摩德"]
                                    ,filled = True
                                    ,rounded = True
    								)
    '''
    clf: 上方已经训练好的模型
    feature_names: 特征名称
    class_names: 标签名称
    filled: 填充颜色,同一种类颜色相同,颜色越深,不纯度越低
    rounded: 方框变成圆角
    '''
    
    #将画出的树导出来
    graph = graphviz.Source(dot_data)
    

    在这里插入图片描述

  7. 探索决策树

    clf.feature_importances_
    '''
    得到使用的特征的重要性,如果没有使用某个特征,那个特征的重要性为0,对决策树贡献越大的重要性越高
    根节点永远是贡献最多的
    '''
    

    在这里插入图片描述

    [*zip(feature_name,clf.feature_importances_)]
    '''
    将特征名和重要性使用元组的形式来对应
    *zip()是zip函数的逆过程
    '''
    

    在这里插入图片描述

1.2 random_state & splitter


1.2.1 建立树的第五步(建立模型)添加参数

clf = tree.DecisionTreeClassifier(criterion="entropy"
                                 ,random_state=30
                                 ,splitter="random"
                                 )

clf = clf.fit(Xtrain,Ytrain)#用于训练的接口
score = clf.score(Xtest,Ytest)#将测试集带入返回预测的准确度

1.3 剪枝参数

为了让决策树有更好的泛化性,我们要对决策树进行剪枝。剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树算法的核心。

在不加限制的情况下,一棵决策树会生长到衡量不纯度的指标最优,或者没有更多的特征可用为止。这样的决策树往往会过拟合,这就是说,它会在训练集上表现很好,在测试集上却表现糟糕。我们收集的样本数据不可能和整体的状况完全一致,因此当一棵决策树对训练数据有了过于优秀的解释性,它找出的规则必然包含了训练样本中的噪声,并使它对未知数据的拟合程度不足


1.3.1 查看对训练集的拟合效果如何

score_train = clf.score(Xtrain, Ytrain)
score_train

1.3.2 max_depth

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


1.3.3 min_samples_leaf & min_samples_split


1.3.4 建立树的第五步(建立模型)添加上述参数

clf = tree.DecisionTreeClassifier(criterion="entropy"
                                 ,random_state=30
                                 ,splitter="random"
                                 ,max_depth=3
                                 ,min_samples_leaf=5
                                 ,min_samples_split=5
                                 )

clf = clf.fit(Xtrain,Ytrain)#用于训练的接口
score = clf.score(Xtest,Ytest)#将测试集带入返回预测的准确度

1.3.5 max_features & min_impurity_decrease


1.3.6 确认最优的剪枝参数

确定最优参数就是确定参数最优应该填什么值

使用超参数的曲线来进行判断

超参数的学习曲线,是一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲线,它是用来衡量不同超参数取值下模型的表现的线。

在我们建好的决策树里,我们的模型度量指标就是score。

import matplotlib.pyplot as plt
test = []
for i in range(10):
    clf = tree.DecisionTreeClassifier(criterion='entropy'
                                 ,random_state=0
                                 ,splitter='random'
                                 ,max_depth=i+1
                                 )
    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()

在这里插入图片描述


1.4 目标权重参数(重要但是不常用)

1.4.1 class_weight & min_weight_fraction_leaf


二、重要的属性和接口

属性是在模型训练之后,能够调用查看的模型的各种性质。

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

接口

sklearn中许多算法的接口都是相似的,比如说我们之前已经用到的fifit和score,几乎对每个算法都可以使用。

常用接口还有applypredict

#apply返回每个测试样本所在的叶子节点的索引
clf.apply(Xtest)
#predict返回每个测试样本的分类/回归结果
clf.predict(Xtest)

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


总结

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

一个属性:feature_importances_

四个接口:fifit,score,apply,predict

标签:clf,min,回归,score,参数,节点,决策树
来源: https://blog.csdn.net/m0_50572604/article/details/120689124