likes
comments
collection
share

决策树模型

作者站长头像
站长
· 阅读数 5

1、决策树原理

决策树模型是机器学习的各种算法模型中比较好理解的一种模型,它的基本原理是通过对一系列问题进行if/else的推导,最终实现相关决策。

决策树的概念并不复杂,主要是通过连续的逻辑判断得出最后的结论,其关键在于如何建立这样一棵“树”

2、决策树模型的建树依据

决策树模型的建树依据主要用到的是基尼系数的概念。基尼系数(gini)用于计算一个系统中的失序现象,即系统的混乱程度。基尼系数越高,系统的混乱程度就越高,建立决策树模型的目的就是降低系统的混乱程度,从而得到合适的数据分类效果。基尼系数的计算公式如下。

决策树模型

其中pi为类别i在样本T中出现的频率,即类别为i的样本占总样本个数的比率;Σ为求和符号,即对所有的[插图]进行求和。

例如,一个全部都是离职员工的样本中只有一个类别——离职员工,其出现的频率是100%,所以该系统的基尼系数为1-1^2=0,表示该系统没有混乱,或者说该系统的“纯度”很高。而如果样本中一半是离职员工,另一半是未离职员工,那么类别个数为2,每个类别出现的频率都为50%,所以其基尼系数为1-(0.52+0.52)=0.5,即其混乱程度很高。

当引入某个用于分类的变量(如“满意度<5”)时,分类后的基尼系数公式如下。

决策树模型

其中S1、S2为划分后的两类各自的样本量,gini(T1)、gini(T2)为两类各自的基尼系数。

例如,一个初始样本中有1000个员工,其中已知有400人离职,600人不离职。划分前该系统的基尼系数为1-(0.42+0.62)=0.48,下面采用两种方式决定根节点:一是根据“满意度<5”进行分类;二是根据“收入<10000元”进行分类。划分方式1:以“满意度<5”为根节点进行划分,如下图所示,划分后的基尼系数为0.3,计算过程如下。

决策树模型

T1的基尼系数:gini(T1)=1-(1^2+0^2)=0 T2的基尼系数:gini(T2)=1-(0.25^2+0.75^2)=0.375

决策树模型

2.1 信息熵

除了基尼系数,还有另一种衡量系统混乱程度的经典手段——信息熵。下面简单介绍信息熵的计算与应用,供感兴趣的读者参考。在搭建决策树模型时,信息熵的作用和基尼系数是基本一致的,都可以帮助我们合理地划分节点。信息熵H(X)的计算公式如下。

决策树模型

其中X表示随机变量,随机变量的取值为X1,X2,X3…,在n分类问题中便有n个取值,例如,在员工离职预测模型中,X的取值就是“离职”与“不离职”两种;pi表示随机变量X取值为Xi的发生频率,且有Σpi=1。需要注意的是,公式中的对数函数是以2为底的。

2.2 总结

基尼系数涉及平方运算,而信息熵涉及相对复杂的对数函数运算,因此,目前决策树模型默认使用基尼系数作为建树依据,运算速度会较快。

数据维度很大,噪音很大时使用基尼系数 维度低,数据比较清晰的时候,信息熵和基尼系数没区别 当决策树的拟合程度不够的时候,使用信息熵 两个都试试,不好就换另外一个

3、决策树模型的代码实现

决策树模型既能做分类分析(即预测分类变量值),又能做回归分析(即预测连续变量值),对应的模型分别为分类决策树模型(DecisionTreeClassifier)和回归决策树模型(DecisionTreeRegressor)。

3.1 分类决策树模型(DecisionTreeClassifier)

from sklearn.tree import DecisionTreeClassifier
x = [[1,2],[3,4],[5,6],[7,8],[9,10]]
y = [1,0,0,1,1]
model = DecisionTreeClassifier(random_state=0)
model.fit(x,y)
model.predict([[5,5]])

运行后得到的预测结果如下。 [0]

运行后得到的预测结果如下。

如果要同时预测多个数据,可以使用如下代码。

model.predict([[5,5],[7,7],[9,9]])

输出如下:

array([0, 0, 1])

3.2 决策树可视化

安装和配置graphviz

graphviz是我们算法模块中比较重要的一个库,我们会使用它来对我们的重要算法:决策树进行绘图。通常来说 graphviz都不太可能是自带的。Mac系统下安装graphviz相对简单,可以参考博文:blog.csdn.net/qq_36847641… Windows系统可以参考下面的步骤来进行安装:

  1. 下载安装包 首先进入官网graphviz.gitlab.io/_pages/Down… 下载msi文件。

2、下载完毕后双击msi文件,开始进行安装:

3、设置环境变量

安装完毕之后,我们需要手动配置环境变量。找到刚才我们记下的安装地址,进入graphviz-2.38文件夹:

配置完成后,进入cmd运行如下命令: dot -version 决策树模型

4、安装graphviz的依赖包

conda install graphviz
pip   install graphviz

5、绘制代码如下:

import graphviz
from sklearn import tree
dot_data =tree.export_graphviz(model)
graph = graphviz.Source(dot_data)
graph

决策树模型

  • X[0]表示数据的第1个特征;
  • X[1]表示数据的第2个特征;
  • gini表示该节点的基尼系数,以根节点为例,它的基尼系数为1-(0.42+0.62)=0.48;
  • samples表示该节点的样本数;
  • value表示各分类的样本数,例如,根节点中的[2,3]表示分类为0的样本数为2,分类为1的样本数为3;
  • class表示该区块被划分为的类别,它是由value中样本数较多的类别决定的,例如,根节点中分类为1的样本数(3)大于分类为0的样本数(2),所以该节点的分类为1,依此类推。根节点以X[1]是否小于等于7作为节点划分依据,如果满足该条件(即True),则划分到左边的子节点,否则(即False)划分到右边的子节点。以数据[5,5]为例,在根节点时,它满足X[1](即第2个特征数值)小于等于7的条件,所以被划分到左边的子节点。在该子节点又进行一次判断,判断X[0]是否小于等于2,因为X[0]为5,不满足该条件,所以划分到该子节点的右边的子节点,而该子节点的类别class为0,所以[5,5]在该决策树模型中被预测为类别0。

6、 random_state参数的作用决策树模型会优先选择使整个系统的基尼系数下降最大的划分方式来进行节点划分,但是有可能根据不同的划分方式获得的基尼系数下降是一样的,如果不设置random_state参数,就会导致程序每次运行时会获得不同的决策树。下图所示为不设置random_state参数时多次运行后获得的两棵不同的决策树。

3.3 回归决策树模型(DecisionTreeRegressor)

决策树除了能进行分类分析,还能进行回归分析,即预测连续变量,此时的决策树称为回归决策树。回归决策树模型的简单演示代码如下。

from sklearn.tree import DecisionTreeRegressor
x = [[1,2],[3,4],[5,6],[7,8],[9,10]]
y = [1,2,3,4,5]
model = DecisionTreeRegressor(max_depth=2,random_state=0)
model.fit(x,y)
model.predict([[9,9]])

输出如下:

array([4.5])

回归决策树模型的概念和分类决策树模型基本一致,最大的不同就是其划分标准不是基尼系数或信息熵,而是均方误差MSE,其计算公式如下。

决策树模型

其中n为样本数量,y(i)为实际值,[插图]为拟合值。

可视化

import graphviz
from sklearn import tree
dot_data =tree.export_graphviz(model)
graph = graphviz.Source(dot_data)
graph

决策树模型

如果不限制决策树的深度,那么决策树将一直往下延伸,直到所有叶子节点的均方误差MSE都等于0为止。这里因为设置了树的最大深度参数max_depth为2,所以决策树在根节点往下共有2层,如果不设置这一参数,那么右下角的节点还将继续分裂,直到所有叶子节点的均方误差MSE都为0为止。这里设置该参数一是为了方便演示拟合效果(拟合结果是4.5而不是一个整数,显示的是回归结果,而不是分类结果),二是为了防止模型出现过拟合现象,在实战中通常也会设置该参数来防止过拟合。