sklearn库学习----决策树(分类树DecisionTreeClassifier)

Posted iostreamzl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sklearn库学习----决策树(分类树DecisionTreeClassifier)相关的知识,希望对你有一定的参考价值。

概述

决策树是一种非参数的有监督学习方法,他能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构呈现出这些规则,以解决分类和回归问题。

决策树算法的核心是解决两个问题

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

sklearn中的决策树

sklearn中的决策树都在sklearn.tree模块下

类名作用
tree.DecisionTreeClassifier分类树
tree.DecisionTreeRegressor回归树
tree.export_graphviz将生成的决策树导出为DOT格式,画图使用
tree.ExtraTreeClassifier高随机版本的分类树
tree.ExtraTreeRegressor高随机版本的回归树

基本建模流程

在这里插入图片描述

重要参数

参数criterion
如何影响模型确定不纯度计算方法,找出最佳节点和最佳分支,不纯度越低,决策树对训练集的拟合度越好
可选值gini–基尼系数(默认),entropy–信息增益
怎样选择通常使用基尼(gini)系数,数据维度很大噪音很大使用基尼系数,维度低,数据比较清晰时gini和entropy没有区别。当决策树拟合度不够时使用entropy。最坏的情况,两个都试试选择好的
  • random_state :用来设置分支中随机模式的参数,默认为None,高维度时随机性会表现得很明显,低纬度可能不会和明显
  • splitter:用来控制决策树中的随机选项,输入为best时,决策树在分支时虽然随机,但是还是会优先选择更重要的特征来进行分支(特征重要性可以通过feature_importances_ 查看);输入random决策树在分支时会更加随机,训练集的拟合很可能会降低
from sklearn.tree import DecisionTreeClassifier

# 使用红酒数据集联系决策树
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
wine = load_wine()
# 数据集分割
X_train, X_test, y_train, y_test = train_test_split(wine['data'], wine['target'], test_size=0.3, random_state=1)
##### 训练模型
dtcf = DecisionTreeClassifier(criterion='entropy', 
                              splitter='best', 
                              random_state=1
                             )
# criterion 可选gini--基尼系数, 和entropy---信息熵
dtcf.fit(X_train, y_train)
score = dtcf.score(X_test, y_test)
score # 在我这里结果为0.9444444444444444
# 画出决策树
import graphviz
from sklearn.tree import export_graphviz
dot_data = export_graphviz(dtcf, 
                            feature_names=wine['feature_names'],
                            class_names=wine['target_names'],
                            filled=True,
                            rounded=True)
# filled参数设置是否颜色填充
# rounded显示为圆角矩形
graph = graphviz.Source(dot_data)
graph

在这里插入图片描述

剪枝参数

在不加限制的情况下,一颗决策树会生长到衡量不纯度的指标最优,或者没有更多的可用特征为止,这样的决策树往往会过拟合,即在训练集上表现很好,在测试集上表现不尽人意
为了让决策树有更好的泛化性,需要对决策树进行剪枝。剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树的核心

  • max_depth(应用最广泛), 跟节点不计算在深度中
    限制树的最大深度,超过深度的树枝全部剪掉

  • min_samples_leaf: 子节点最小包含样本数,一般搭配max_depth使用
    在这里插入图片描述
    图中可以看到,分支后其中一个子节点样本数为2 。若设置参数值为5.则该分支将不会出现或者sklearn自动找到一种合理的分支方式

  • min_samples_split:节点最少包含样本数
    还是以上图为例,若设置参数值为20.可见samples=2的这个节点不满足条件,则这个节点将不能在继续产生分支

  • max_features & min_impurity_decrease
    一般max_depth使用,用作树的“精修”
    max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。和max_depth异曲同工,max_features是用来限制高维度数据的过拟合的剪枝参数,但其方法比较暴力,是直接限制可以使用的特征数量而强行使决策树停下的参数,在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型学习不足。如果希望通过降维的方式防止过拟合,建议使用PCA,ICA或者特征选择模块中的降维算法。
    min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生。这是在0.19版本种更新的功能,在0.19版本之前时使用min_impurity_split。

  • 确认最优的剪枝参数
    那具体怎么来确定每个参数填写什么值呢?这时候,我们就要使用确定超参数的曲线来进行判断了,继续使用我们已经训练好的决策树模型。超参数的学习曲线,是一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲线,它是用来衡量不同超参数取值下模型的表现的线。在我们建好的决策树里,我们的模型度量指标就是score。
    eg. 看max_depth参数对决策树的影响

import matplotlib.pyplot as plt
%matplotlib inline

scores = []
for i in range(1,11) :
    ##### 训练模型
    dtcf = DecisionTreeClassifier(criterion='entropy', 
                                  splitter='best', 
                                  random_state=1,
                                  max_depth=i
                                 )
    # criterion 可选gini--基尼系数, 和entropy---信息熵
    dtcf.fit(X_train, y_train)
    score = dtcf.score(X_test, y_test)
    scores.append(score)
plt.plot(range(10), scores)
plt.show()
print(scores)

在这里插入图片描述

目标权重参数

  • class_weight & min_weight_fraction_leaf
    完成样本标签平衡的参数。样本不平衡是指在一组数据集中,标签的一类天生占有很大的比例。比如说,在银行要判断“一个办了信用卡的人是否会违约”,就是是vs否(19: 996)的比例。这种分类状况下,即便模型什么也不做,全把结果预测成“否”,正确率也能有99%。因此我们要使用class—weight参数对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认None,此模式表示自动给与数据集中的所有标签相同的权重
    有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配min_weight_fraction_leaf这个基于权重的剪枝参数来使用。另请注意,基于权重的剪枝参数(例如min_weight_fraction_leaf)将比不知道样本权重的标准(比如min_samples_leaf)更少偏向主导类。如果样本是加权的,则使用基于权重的预修剪标准来更容易优化树结构,这确保叶节点至少包含样本权重的总和的一小部分。
    class_weight参数是字典类型,{类别名 : 权值}

参数调优手段-----网格搜索

# 通过网格搜索来调参------缺陷很耗时间
# 能够帮助我们同时调整多个参数,本质是枚举
# 网格搜索的一个缺陷是无法舍弃参数,导致可能最后的结构没有自己手调参数的结果好

# 构建参数字典
# key----参数
# value----参数的取值范围
parameters = {
    'random_state' : [1],
    "criterion" : ['gini', 'entropy'],
    'max_depth' : range(1, 10),
    'splitter' : ['random', 'best'],
    'min_samples_split' : range(5, 30, 5),
    'min_samples_leaf' : range(1, 5)
}
dtc = DecisionTreeClassifier()
GS = GridSearchCV(dtc, param_grid=parameters, cv=10)
GS = GS.fit(X_train, y_train)
GS.best_params_
"""
{'criterion': 'gini',
 'max_depth': 4,
 'min_samples_leaf': 1,
 'min_samples_split': 25,
 'random_state': 1,
 'splitter': 'random'}
 """

GS.best_score_
# 0.8167202572347267

以上是关于sklearn库学习----决策树(分类树DecisionTreeClassifier)的主要内容,如果未能解决你的问题,请参考以下文章

sklearn库学习------决策树(回归树DecisionTreeRegressor)

sklearn1.分类决策树

机器学习-------sklearn决策树分析

机器学习 sklearn 监督学习 分类算法 决策树 DecisionTree

机器学习 sklearn 监督学习 分类算法 决策树 DecisionTree

机器学习 sklearn 监督学习 分类算法 决策树 DecisionTree