sklearn 决策树_文科生都能学会的决策树

文章目录

一、概述
1.1 决策树定义
1.2 学习决策树的重点
二、sklearn中决策树
2.1 为啥选择sklearn?
2.2 准备工作
2.3 DecisionTreeClassifier参数
2.3.1 全部参数
2.3.2 调参时重点关注的参数
三、案例操作

一、概述

1.1 决策树定义

决策树:监督学习算法,它能从一系列有特征和标签的数据中以树状图的结构呈现出规则,以达到解决分类和回归的问题。

1.2 学习决策树的重点

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

二、sklearn中决策树

2.1 为啥选择sklearn?

它是开源基于python语言的机器学习工具包,并且涵盖了几乎主流所有的机器学习算法,在实际工作我们重头开始写算法的可能性非常的低,原因很简单,自己重新写算法不仅耗时耗力,而且写出的算法的稳定性不一定强,所以从实现算法的效率和效果平衡的话,毋庸置疑:sklearn才是最优的选择

本文会结合sklearn中决策树模型的参数和属性来学习决策树,尽量做得通俗易懂。

2.2 准备工作

本文以决策树分类树为例,并以图像的方式呈现给大家

涉及到模块:

sklearn.tree.DecisionTreeClassifier(分类树)

涉及主要代码:

from sklearn import tree   #导入相应的模块
clf=tree.DecisionTreeClassifier()   #实例化(构建决策树模型)
clf=clf.fit(x_train,y_train)   #用训练集训练模型
result=clf.score(X_test,y_test)   #用训练好的模型来预测测试集

2.3 DecisionTreeClassifier参数

2.3.1 全部参数

class sklearn.tree.DecisionTreeClassifier( criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort='deprecated', ccp_alpha=0.0)[source]

参数解释:

5632d9f418fca5ffd708097cc364d00f.png

06c098eb9ad007fc7031e3162aa19914.png

2.3.2 调参时重点关注的参数

第一个参数:criterion

它可以帮助决策树需要找到最佳节点和最佳分支方法的一个核心参数

对于分类树来说,衡量这个最佳的指标,我们通常称为不纯度。通常来说不纯度越低,决策树对训练集的拟合越好。而且子节点的不纯度一定低于父节点。

criterion提供两种不纯度的计算方法:

信息熵:输入"entropy"

基尼系数:输入“gini”

其中t代表给定的节点,i代表标签分类,那么p(i|t)代表标签分类i在节点t上的比例。

举个例子:

假如是2分类问题,当A类和B类各占50%的时候?

当只有A类,或只有B类的时候,

从结果可以清晰看到当问题是二分类的时候,不纯度均大于0,信息熵方式计算的不纯度为1,基尼系数方式计算的不纯度为0.5。前文我们提过不纯度越低拟合的越好,那是不是基尼函数拟合的比信息熵好呢?因为信息熵对不纯度更加敏感,对不纯度的惩罚更加强。因此在高维数据或者噪声太多,容易过拟合(模型在训练集上表现很好,在测试集上表现很糟糕),通常我喜欢把使用基尼系数的方式。当问题是只有一类时,这个就简单了,已信息熵和基尼系数计算的不纯度均为0,也就是完全分类的理想状态。

总结一下:

  • 建模选取参数尽量选取基尼系数,因为在噪声大或者维度高的数据中,信息熵容易出现过拟合
  • 如果使用基尼系数拟合结果不太好时,这个时候可以尝试一下信息熵

第二个参数:剪枝参数(一共4个

决策树生成如果只按照不纯度指标生长的话,往往都会过拟合,这是因为训练集不能代表所有的数据集,当一隔决策树在训练集表现了特别优秀的解释性,它的解释性中必然包括了对噪声的解读,当有个新的数据拿来训练的话,它的拟合性就不足了。为了让决策树拥有更好的泛化性,这里我们需要对决策树进行剪枝,它可以让决策树在合适的位置停止生长。sklearn中我们提供了多种剪枝参数:

  • max_depth

限制树的深度,超过该设定深度的树枝全部剪掉

这种剪枝很容易理解,它也是使用最广泛的剪枝参数,我们知道决策树多生长一层,样本量的需求会几乎增加一倍,通过限制树深来防止过拟合,就显得非常有效了。根据经验,建议从max_depth=3开始尝试,看拟合效果决定是否再加深度。

  • min_samples_leaf

它指一个节点在分枝后每个子节点都必须包含至少min_samples_leaf个训练样本,否则就不会发生。

该剪枝参数默认为1,如果该参数过大,会严重阻止决策树的生长,设置过小又容易造成过拟合,根据经验,建议从min_samples_leaf=5开始使用。值得注意的是,这个参数在回归树中会让模型变得更加平滑。

  • min_samples_split

一个节点必须含有min_samples_split个训练样本,这样的样本才允许被分枝,否则分枝就不会发生。

  • max_features

它是限制分枝时考虑的特征个数,超过该特征数就会被舍弃,和max_depth有着异曲同工之处,但是它有个缺点,在各个特征重要性未知的情况下,强行设定这个参数,可能造成学习不足。

  • min_impurity_decrease

它是指限制信息增益的大小,如果信息增益小于设定数值的分枝就不会发生。

第三个参数:随机相关参数(一共2个

  • random_state

它是设置分枝中随机模式的参数,默认None,这里需要注意的是当数据的维度很低时(比如常见的鸢尾花数据集),这个参数的作用就不大了。

  • splitter

它也是来控制决策树中的随机选项的,它有两种输入值:“best”(默认)、“random”。当输入的为“best”,虽然决策树虽然为随机的,但是还是按照最重要的特征来分枝,当输入为“random”决策树在分枝时更加的随机,决策树会因含有更多不必要的信息而更深更大,并因这些不必要信息而降低对训练集的拟合。

三、案例操作

这里我们使用sklearn中自带的wine数据集,然后使用决策树建模分类。

  • 第一步:

导入相应模块和算法库

#引入树模块
from sklearn import tree
# 引入sklearn自带的wine数据集
from sklearn.datasets import load_wine
# 引入划分数据集的包
from sklearn.model_selection import train_test_split
# 引入可视化作图工具包
import graphviz
import matplotlib.pyplot as plt
#引入数据处理工具包
import pandas as pd
  • 第二步:

划分数据集

# 划分训练集和测试集
X_train,X_test,y_train,y_test=train_test_split(wine.data,wine.target,test_size=0.3)
  • 第三步:

建立模型

# 建立模型
clf=tree.DecisionTreeClassifier()
clf=clf.fit(X_train,y_train)
score=clf.score(X_test,y_test)
score

未加调参的情况跑出的分数大概是0.96:

62684b4a6115dfc12faa62e7ef84ec94.png

假设我们现在要调参,那么我们具体怎么确定每个参数填写什么值呢?这里我们要使用超参数的曲线进行判断,继续使用我们已经训练好的决策树clf。这里我们已max_depth为例,那么它的超参数学习曲线就是以max_depth的取值为横坐标,以模型衡量指标score为纵坐标,最终衡量不同max_depth取值对应着score的分数。

import matplotlib.pyplot as plt
test=[]
for i in range(10):
    clf=tree.DecisionTreeClassifier(max_depth=i+1,
                                 )
    clf=clf.fit(X_train,y_train)
    score=clf.score(X_test,y_test)
    test.append(score)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend()
plt.show()

得到如下图:

35eab2dff6302d320aa6d8b0338e810e.png

从图中我们可以看到最大深度为3的时候模型的分数最高,所以我们将模型的分数定成3.于是将上诉代码改成:

# 建立模型
clf=tree.DecisionTreeClassifier(max_depth=3)
clf=clf.fit(X_train,y_train)
score=clf.score(X_test,y_test)
score

得到更加好的分数0.98,该分数大于未调参的分数0.96:

b586f0561cad0ab3c7be2ac35ea85eb9.png

当然别的参数也可以用这样方法来确定,这里就不一一举例了。。。

总结:

本文尽量避免了决策树复杂的原理和公式(毕竟让文科生都能懂吧~~),但是基本已经可以应付日常工作需求了,如果大家想理解更加深入的细节,可以去学习一下决策树的原理:

决策树算法原理(上)

决策树算法原理(下)


欢迎关注、点赞、收藏、转发~

欢迎关注、点赞、收藏、转发~

欢迎关注、点赞、收藏、转发~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值